14-容器網絡之host和none
在之前的小節,我們有看到過 host 和 none。
通過
docker network ls
查看。
none 網絡
-
刪除 test1 容器
docker stop test1 && docker rm test1
-
創建 test1 容器并連接到none網絡
docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep 3600; done"
使用
docker ps
查看是否啟動運行。 -
查看 none 網絡
docker network inspect none
"Containers": {"a8eff69c2dc062ba63578359533f49cf8e619aed1762d393714f93ffcfba34d5": {"Name": "test1","EndpointID": "d961a29c4293398cfa8dfa58ea70d88ca3071063c6e3773e0102c492bdf387a2","MacAddress": "","IPv4Address": "","IPv6Address": ""} }
我們發現 test1 容器并沒有被分配 ip 地址。
-
進入 test1 容器查看
docker exec -it test1 /bin/sh
/ # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
我們發現這個 test1 容器并沒有其它網絡接口,只有 lo 接口。那么我們可以理解為這個 test1 它所在的 net namespace 是一個孤立的網絡。
我們只能通過
exec
進入這個容器。主要用在哪里呢?一般是創建高安全的容器,比如用來存儲密碼等,然后我們只能通過exec
進入容器,一般來說比較安全。 -
詳細介紹 lo 網絡接口
lo 代表 127.0.0.1,也就是 localhost,是 loopback interface 縮寫,含義為 回環接口。
當你從一臺linux主機向自身發送數據包時,實際上的數據包是通過虛擬的lo接口來發送接受的,而不會通過你的物理網卡 eth0/eth1…
Loopback接口是虛擬接口,是一種純軟件性質的虛擬接口。任何送到該接口的網絡數據報文都會被認為是送往設備自身的。
host網絡
-
刪除 test1 容器
docker stop test1 && docker rm test1
-
創建 test1 容器并連接到host網絡
docker run -d --name test1 --network host busybox /bin/sh -c "while true; do sleep 3600; done"
使用
docker ps
查看是否啟動運行。 -
查看 host 網絡
docker network inspect host
"Containers": {"3d9350ed5a103364ba26efa1b94556baa5e988d14c50494024e049aae8d35c97": {"Name": "test1","EndpointID": "ad353df20fc3ee12777d208edb65555d04fd87be672b4a4eb5284eeeb9a63d32","MacAddress": "","IPv4Address": "","IPv6Address": ""} }
我們可以看到 test1 容器也是沒有 ip 地址的。
-
進入 test1 容器查看
docker exec -it test1 /bin/sh
查看網絡
/ # ip a
發現這個返回的內容和在容器外面執行
ip a
是一樣的。exit $: ip a
這說明連接 host network的容器test1,它沒有自己的獨立的 net namespace,而是使用了 主機所在的 host 共享一個 net namespace。
這種方式創建的一個容器會有什么問題呢?因為共享的網絡命名空間,那就意味著可能會出現端口沖突。
端口沖突案例
-
創建一個連接host網絡的 web1 容器
docker run -d --network host --name web1 nginx
查看運行情況
docker ps
,正常運行。 -
創建一個連接host網絡的 web2 容器
docker run -d --network host --name web2 nginx
查看運行情況
[vagrant@10 flask-web]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ae662c4b4ef nginx "nginx -g 'daemon of…" 2 seconds ago Up 1 second web2
我們發現剛剛創建的web1 容器不見了,這是為什么呢?原因就是端口沖突了。那我們來驗證一下。
-
查看web1 容器運行日志
docker logs web1 2019/02/13 12:18:17 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
從報錯信息中我們看到,80 端口已經被占用,所以web1容器停止運行。
-
刪除web1和web2
docker stop web1 && docker rm web1 docker stop web2 && docker rm web2