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 : 預設只記錄了容器自身的一些地址和名稱
如果使用者想要手動指定容器的配置,可以利用下面的選項:
- -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