1. 程式人生 > >Docker技術入門與實戰 第二版-學習筆記-8-網路功能network-2-相應配置

Docker技術入門與實戰 第二版-學習筆記-8-網路功能network-2-相應配置

1) 快速配置指南(詳細使用下面會講)

其中有些命令選項只有在 Docker 服務啟動的時候才能配置,而且不能馬上生效

下面2個命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動(docker run )時候指定。在 Docker 服務啟動的時候指定則會成為預設值,後面執行docker run時可以覆蓋設定的預設值。

 

最後這些選項只有在 docker run執行時使用,因為它是針對容器的特性內容:

 

2) 配置 DNS

怎麼自定義配置容器的主機名和 DNS 配置呢? 祕訣就是它利用虛擬檔案來掛載到來容器的 3 個相關配置檔案:

  • /etc/resolv.conf : 記錄了容器的配置資訊
  • /etc/hostname : 記錄了容器的主機名
  • /etc/hosts : 預設只記錄了容器自身的一些地址和名稱
這種機制可以讓宿主主機 DNS 資訊發生更新後,所有 Docker 容器的 dns 配置通過 /etc/resolv.conf檔案立刻得到更新。

如果使用者想要手動指定容器的配置,可以利用下面的選項:

  • -h HOSTNAME 或 --hostname = HOSTNAME :設定容器的主機名,它會被寫到容器內的/etc/hostname 和 /etc/hosts中。但它在容器外部看不到,既不會在docker ps中顯示,也不會在其他的容器的 /etc/hosts看到
  • --links = CONTAINER_NAME:ALIAS 選項會在建立容器的時候,新增一個其他容器的主機名到/etc/hosts檔案中,讓新的容器的程序可以使用主機名ALIAS就可以連線它
  •  --dns = IP_ADDRESS : 新增DNS服務到容器的/etc/resolv.conf中,讓容器用這個伺服器來解析所有不在/etc/hosts上的主機名
  •  --dns-search = DOMAIN : 設定容器的搜尋域,當設定搜尋域為.example.com時,在搜尋一個名為host的主機時,DNS不僅搜尋host,還會搜尋host.example.com。注意,如果沒有上述最後的兩個選項,Docker會預設主機上的/etc/resolv.conf來配置容器

 

在容器中使用 mount 命令可以看到掛載資訊,在之前連線的是host網路的ubuntu6容器上執行:

userdeMBP:~ user$ docker exec -it ubuntu6 /bin/bash
[email protected]025000000001:/# mount
...
/dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered) ...

 

1.檢視其/etc/resolv.conf內容:

 

[email protected]025000000001:/# cat /etc/resolv.conf 
# This file is included on the metadata iso
nameserver 192.168.65.1  // 相當於執行docker run時使用--dns=192.168.65.1
domain lan  //表示區域網,相當於執行docker run時使用--dns-search=lan

 

⚠️如果是直接手動對/etc/resolv.conf進行更改,那麼再次重啟時,裡面更改的內容就會恢復原狀,希望不回覆的方法就是在run時使用-dns--dns-search引數來設定

此時任意開啟一個連線的是自定義的bridge——myNetwork2的ubuntu7容器,檢視它的/etc/resolv.conf配置檔案,可以看見,和上面的內容是相同的

這是因為建立容器時,預設會與宿主機的/etc/resolv.conf內容保持一致

 

2.檢視其/etc/hosts內容:

[email protected]025000000001:/# cat /etc/hosts       
127.0.0.1       localhost
::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 

當我們使用--link=container:alias引數連線了其他容器的話,該檔案中就會出現連線容器的ip地址,如下面是容器ubuntu7沒有連線其他容器前檔案的內容:

[email protected]:/# vi /etc/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.20.11.2 8eef1c93a7d4

⚠️設定了alias的好處是:重啟容器IP變化時,別名alias正常使用

 

然後後面開啟另一個容器ubuntu8,讓其通過--link連線了容器db,然後就能夠在/etc/hosts中看見db的資訊:

userdeMBP:~ user$ docker run -it --name ubuntu8 --link db:db ubuntu:14.04 /bin/bash
[email protected]:/# cat /etc/hosts
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.4 db 2fca948912dc 172.17.0.5 1f6456e5fbfd

就能夠使用容器db的名字ping通它了:

[email protected]:/# ping -c 3 db
PING db (172.17.0.4) 56(84) bytes of data. 64 bytes from db (172.17.0.4): icmp_seq=1 ttl=64 time=0.081 ms 64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.092 ms 64 bytes from db (172.17.0.4): icmp_seq=3 ttl=64 time=0.109 ms --- db ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2111ms rtt min/avg/max/mdev = 0.081/0.094/0.109/0.011 ms

 

3.檢視其/etc/hostname內容:

[email protected]025000000001:/# cat /etc/hostname
linuxkit-025000000001

可以在run容器時自己設定自己的主機名,使用--hostname引數:

userdeMacBook-Pro:~ user$ docker run -it --hostname=myUbuntu9 --name ubuntu9 ubuntu:14.04 /bin/bash
[email protected]:/# cat /etc/hostname
myUbuntu9

上面的例子就將主機名設定為了myUbuntu9

 

4.使用--net引數 (其實就是之前使用的--network引數)設定使用的網路是bridge、nonedeng,或者是指明與某個容器使用相同的網路,這裡著重講其如何使用container模式(其他網路模式請看上一章): 重新生成一個ubuntu10容器,使用--net=container:ubuntu8連線之前link db容器的ubuntu8容器:

從上圖可見,基本上就相當於打開了別名為ubuntu10的ubuntu8容器,兩者的IP地址是完全一樣的,連主機名都是一樣的。當然,ubuntu10容器也是開啟了的:

userdeMBP:~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3b854b76e02e        ubuntu:14.04        "/bin/bash"              2 minutes ago       Up 2 minutes                                 ubuntu10
f07c50c1c6ee        ubuntu:14.04        "/bin/bash"              27 minutes ago      Up 27 minutes                                ubuntu8