Docker技術入門與實戰 第二版-學習筆記-8-網路功能network-1-單個host上的容器網路
Docker 中的網路功能介紹
Docker 允許通過外部訪問容器或容器互聯的方式來提供網路服務
1) 外部訪問容器
容器中可以執行一些網路應用,要讓外部也可以訪問這些應用,可以通過 -p或 -P引數來指定埠對映
執行容器時如果使用-P,Docker 會隨機對映一個在49000-49900區間內的埠到內部容器開放的網路埠。
比如下面的容器,就隨機選取了本地的32768埠對映到了容器中正開放的5000埠,此時訪問本機的 32768
userdeMacBook-Pro:~ user$ docker run -d -P --name web -v /webapp training/webapp python app.py Unable to find image 'training/webapp:latest' locally latest: Pulling from training/webapp e190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 10bbbc0fc0ff: Pull complete fca59b508e9f: Pull complete e7ae2541b15b: Pull complete 9dd97ef58ce9: Pull complete a4c1b0cb7af7: Pull complete Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d Status: Downloaded newer imagefor training/webapp:latest 1ad71e9d38081c38dcd355fd7a438cd9f94503e8bc28e99a48c0738b51e7efef userdeMacBook-Pro:~ user$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ad71e9d3808 training/webapp "python app.py" 42 minutes ago Up 42 minutes 0.0.0.0:32768->5000/tcp web
在瀏覽器中訪問http://localhost:32768:
然後可以通過 docker logs 命令來檢視瀏覽器訪問應用的資訊:
userdeMacBook-Pro:~ user$ docker logs web * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 172.17.0.1 - - [15/Dec/2018 10:20:08] "GET / HTTP/1.1" 200 - 172.17.0.1 - - [15/Dec/2018 10:20:08] "GET /favicon.ico HTTP/1.1" 404 -
-p(小寫的)則可以指定要對映的埠,並且,在一個指定埠上只可以繫結一個 容器。
支援的格式有:
- ip地址:主機埠:容器埠
- ip地址::容器埠
- 主機埠:容器埠
1》 對映所有介面地址
使用主機埠:容器埠格式,本地的 5000 埠可以對映到容器的 5000 端 口,如:
sudo docker run -d -p 5000:5000 training/webapp python app.py
此時預設會繫結本地所有介面上的所有ip地址
2》對映到指定地址的指定埠
使用 ip地址:主機埠:容器埠格式指定對映使用一個特定地址,比如 localhost 地址 127.0.0.1
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
3》對映到指定地址的任意埠
使用ip地址::容器埠格式繫結 localhost 的任意埠到容器的 5000 埠,本地主機會自動分配一個埠:
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
還可以使用 udp 標記來指定 udp 埠
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
檢視對映埠配置——docker port
檢視當前對映的埠配置,也可以檢視到繫結的地址
userdeMacBook-Pro:~ user$ docker port web 5000 0.0.0.0:32768
⚠️:
容器有自己的內部網路和 ip 地址(使用 docker inspect可以獲取所有的變數,Docker 還可以有一個可變的網路配置。)
-p 標記可以多次使用來繫結多個埠,如:
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
2)容器互聯
容器的連線(linking)系統是除了埠對映外,另一種跟容器中應用互動的方式。
該系統會在源和接收容器之間建立一個隧道,接收容器可以看到源容器指定的信息。
1》自定義容器命名——使用 --name引數
連線系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名
當建立容器的時候,系統預設會分配一個名字。
但是自定義命名容器有2個好處:
- 自定義的命名,比較好記,比如一個web應用容器我們可以給它起名叫web
- 當要連線其他容器時候,可以作為一個有用的參考點,比如連線web容器到db 容器
docker run -d -P --name web training/webapp python app.py
可以使用docker ps -l檢視,也可以使用 docker inspect來檢視容器的名字
userdeMacBook-Pro:~ user$ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ad71e9d3808 training/webapp "python app.py" About an hour ago Up About an hour 0.0.0.0:32768->5000/tcp web userdeMacBook-Pro:~ user$ docker inspect -f "{{ .Name }}" 1ad71e9d3808 /web
注意:容器的名稱是唯一的。如果已經命名了一個叫 web 的容器,當你要再次使用 web 這個名稱的時候,需要先用docker rm來刪除之前建立的同名容器。
在執行 docker run的時候如果新增 -rm 標記,則容器在終止後會立刻刪除。
⚠️-rm 和 -d(後臺執行)引數不能同時使用。
2》 容器互聯——使用 --link引數
格式: --link name:alias
其中 name是要連結的容器的名稱, alias是這個連線的別名
先建立一個新的資料庫容器db:
userdeMacBook-Pro:~ user$ docker run -d --name db training/postgres Unable to find image 'training/postgres:latest' locally latest: Pulling from training/postgres a3ed95caeb02: Pull complete 6e71c809542e: Pull complete 2978d9af87ba: Pull complete e1bca35b062f: Pull complete 500b6decf741: Pull complete 74b14ef2151f: Pull complete 7afd5ed3826e: Pull complete 3c69bb244f5e: Pull complete d86f9ec5aedf: Pull complete 010fabf20157: Pull complete Digest: sha256:a945dc6dcfbc8d009c3d972931608344b76c2870ce796da00a827bd50791907e Status: Downloaded newer image for training/postgres:latest 2fca948912dcfd40849d1f2080db69bed0f51a9b1c1a10ceba7e3bf7d0960e5f
刪除之前建立的 web 容器:
userdeMacBook-Pro:~ user$ docker rm -f web
web
然後建立一個新的 web 容器,並將它連線到 db 容器:
userdeMacBook-Pro:~ user$ docker run -d -P --name web --link db:db training/webapp python app.py
d734bf29ad945f25e65e451d5d207b007a24004002dbaa722b28e02fb46ed51e
此時,db 容器和 web 容器成功建立了互聯關係
使用 docker ps來檢視容器的連線:
userdeMacBook-Pro:~ user$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d734bf29ad94 training/webapp "python app.py" 7 seconds ago Up 6 seconds 0.0.0.0:32769->5000/tcp web 2fca948912dc training/postgres "su postgres -c '/us…" 39 seconds ago Up 38 seconds 5432/tcp db
這樣子就不用像上面一樣需要使用-p 或 -P對映埠了。
Docker 通過 2 種方式為容器公開連線資訊:
- 環境變數
- 更新 /etc/hosts檔案
首先是環境變數方式:
使用 env 命令來檢視 web 容器的環境變數:
userdeMacBook-Pro:~ user$ docker run --rm --name web --link db:db training/webapp env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=994146340f40 DB_PORT=tcp://172.17.0.3:5432 DB_PORT_5432_TCP=tcp://172.17.0.3:5432 DB_PORT_5432_TCP_ADDR=172.17.0.3 DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_PROTO=tcp DB_NAME=/web/db DB_ENV_PG_VERSION=9.3 HOME=/root
其中 DB_ 開頭的環境變數是供 web 容器連線 db 容器使用,字首採用大寫的連線別名。
然後更新 /etc/hosts檔案方式,Docker 添加了host資訊到父容器的 /etc 的檔案。下面是父容器 web的 hosts檔案:
userdeMacBook-Pro:~ user$ docker run -t -i --rm --link db:db training/webapp /bin/bash [email protected]:/opt/webapp# 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.3 db 2fca948912dc //db容器的 容器名和ID 172.17.0.2 36078e6ba58f //web容器的ID
可以在 web 容器中安裝 ping 命令來測試跟db容器的連通:
[email protected]:/opt/webapp# apt-get install -yqq inetutils-ping (Reading database ... 18233 files and directories currently installed.) Removing ubuntu-minimal (1.325) ... Removing iputils-ping (3:20121221-4ubuntu1.1) ... Selecting previously unselected package inetutils-ping. (Reading database ... 18221 files and directories currently installed.) Preparing to unpack .../inetutils-ping_2%3a1.9.2-1_amd64.deb ... Unpacking inetutils-ping (2:1.9.2-1) ... Setting up inetutils-ping (2:1.9.2-1) ... [email protected]:/opt/webapp# ping db PING db (172.17.0.3): 56 data bytes 64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.099 ms 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.120 ms 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.063 ms 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.202 ms 64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.101 ms 64 bytes from 172.17.0.3: icmp_seq=5 ttl=64 time=0.133 ms 64 bytes from 172.17.0.3: icmp_seq=6 ttl=64 time=0.129 ms 64 bytes from 172.17.0.3: icmp_seq=7 ttl=64 time=0.104 ms 64 bytes from 172.17.0.3: icmp_seq=8 ttl=64 time=0.129 ms 64 bytes from 172.17.0.3: icmp_seq=9 ttl=64 time=0.130 ms 64 bytes from 172.17.0.3: icmp_seq=10 ttl=64 time=0.128 ms 64 bytes from 172.17.0.3: icmp_seq=11 ttl=64 time=0.128 ms 64 bytes from 172.17.0.3: icmp_seq=12 ttl=64 time=0.063 ms 64 bytes from 172.17.0.3: icmp_seq=13 ttl=64 time=0.130 ms 64 bytes from 172.17.0.3: icmp_seq=14 ttl=64 time=0.130 ms ^C--- db ping statistics --- 15 packets transmitted, 15 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.063/0.119/0.202/0.032 ms
用 ping 來測試db容器,它會解析成 172.17.0.3。 *注意:官方的 ubuntu 映象 預設沒有安裝 ping,需要自行安裝
使用者可以連結多個父容器到子容器,比如可以連結多個 web 到 db 容器上
3) 高階網路配置
1》預設網路
docker network命令使用
1.首先檢視docker network命令怎麼使用
userdeMBP:~ user$ docker network --help Usage: docker network COMMAND Manage networks Commands: connect Connect a container to a network 將容器連線到網路上,預設連線的是bridge網路 create Create a network 建立一個網路,使用--driver引數指定網路型別 disconnect Disconnect a container from a network 斷開容器連線的網路 inspect Display detailed information on one or more networks 展示一個或多個網路的詳細資訊 ls List networks 列舉現有的所有網路 prune Remove all unused networks 移除所有不再使用的網路 rm Remove one or more networks 移除一個或多個網路 Run 'docker network COMMAND --help' for more information on a command.
2.然後檢視目前的網路情況,初始時是預設有下面的三類網路的
userdeMBP:~ user$ docker network ls NETWORK ID NAME DRIVER SCOPE 5a8633141529 bridge bridge local 78c9cc883ccc host host local 454aa19cf801 none null local
當 Docker 啟動時,會自動在主機上建立一個虛擬網橋,實際上是 Linux 的一個 bridge(即這上面的bridge網路),可以理解為一個軟體交換機。它會在掛載到它的網口之間進行轉發。
none網路——即什麼都沒有的網路
開啟兩個連線了預設bridge網路的ubuntu容器和一個連線了none網路的ubuntu容器,然後檢視它們的ip配置資訊,並ping本地主機看能否連通:
當你想要實現一些對安全要求比較高並且不需要聯網的操作時,就可以使用none網路
上圖可見,如果你使用的是bridge網路,你是可以ping通你現在的主機的網路的;如果你是none網路,你是無法連線網路的
比如你有些容器的作用時生成金鑰檔案等操作時,使用none網路就能保證金鑰檔案的安全行,不會被竊取
host網路
打開了一個連線了host網路的ubuntu容器,然後檢視其ip資訊
userdeMBP:~ user$ docker run -it --network=host --name=ubuntu3 ubuntu:14.04 /bin/bash [email protected]-025000000001:/# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 brd 127.255.255.255 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 02:50:00:00:00:01 brd ff:ff:ff:ff:ff:ff inet 192.168.65.3/24 brd 192.168.65.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::50:ff:fe00:1/64 scope link valid_lft forever preferred_lft forever 3: [email protected]: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1 link/ipip 0.0.0.0 brd 0.0.0.0 4: [email protected]: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1 link/tunnel6 :: brd :: 5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c4:a0:b5:3e brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:c4ff:fea0:b53e/64 scope link valid_lft forever preferred_lft forever 9: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 96:2b:b2:b1:de:52 brd ff:ff:ff:ff:ff:ff inet6 fe80::942b:b2ff:feb1:de52/64 scope link valid_lft forever preferred_lft forever 11: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether ba:80:0c:67:c0:9e brd ff:ff:ff:ff:ff:ff inet6 fe80::b880:cff:fe67:c09e/64 scope link valid_lft forever preferred_lft forever 13: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 72:51:1e:7b:01:0c brd ff:ff:ff:ff:ff:ff inet6 fe80::7051:1eff:fe7b:10c/64 scope link valid_lft forever preferred_lft forever
(參考https://blog.csdn.net/liukuan73/article/details/51603074)
因為docker使用了Linux的Namespace技術來進行資源的隔離,如PID Namespace隔離程序,Mount Namespace隔離檔案系統,Network Namespace隔離網路等
使用bridge網路時,一個容器會分配一個獨立的Network Namespace。但是如果使用的是host網路,容器將不會獲得一個獨立的Network Namespace,而是與宿主機公用一個Network Namespace。在這種情況下,容器將不會虛擬出自己的網絡卡,配置自己的IP等,而是使用宿主機的IP和埠。容器可以和宿主機一樣,使用宿主機的eth0,實現和外界的通訊。換言之,容器的IP地址即為宿主機eth0的IP地址
因此上面開啟的容器使用ip addr命令時,發現得到的資訊都是宿主機上的資訊。因此當外界想要訪問該容器時,直接訪問宿主機的IP和容器開放的埠即可,不需要任何的NAT轉換,就像直接執行在宿主機一樣。
⚠️但是容器的其他方面,如檔案系統、程序列表等還是和宿主機隔離的
host網路其實是bridge網路的一種補充,但是也有不足的地方:
- 容器網路環境隔離性弱化,即容器不再擁有隔離、獨立的網路棧
- 由於網路隔離性的弱化,該容器會與宿主機共享競爭網路棧的使用
- 容器內部將不再擁有所有的埠資源,原因是部分埠資源已經被宿主機本身的服務佔用,還有部分埠已經用以bridge網路模式容器的埠對映
同時檢視host網路此時的詳細資訊:
userdeMacBook-Pro:~ user$ docker network inspect 78c9cc883ccc [ { "Name": "host", "Id": "78c9cc883ccc186865ab14c31f7d3ebafecd725e2524a7ab3bb550fb91a73705", "Created": "2018-07-21T02:08:33.191948595Z", "Scope": "local", "Driver": "host", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "084fd2f2927a18f8c6003f7ee70e5fef80e6ffca6246f75d8ada71c5be76a8bf": { "Name": "ubuntu3", //即上面連線了host網路的容器 "EndpointID": "a57a350fb83a4c45d276eefaf29c0ef13278af2cfbfa3a6a7c9f36a1430f07cb", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }, "3c3f1551282d8f983faf974d96e366262d133da662108c43506e6dcb16902b4c": { "Name": "k8s_POD_etcd-docker-for-desktop_kube-system_1f439806cd68459343e83b51b9f719eb_0", "EndpointID": "6c2f76ff13c3ebe545a1c3f36d864d9525aadaebced72270abb88fe92aaed69e", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }, "636bc1e866ed8f215261e30a522feeb91b2a8417be0a4f55324a013e7efadfcf": { "Name": "k8s_POD_kube-controller-manager-docker-for-desktop_kube-system_ac5424d04b6928ef15ca302888630c4e_0", "EndpointID": "25234b9025957c835fc0669334affd6a74bc03d9b679e50b2fe713cbfe1c9f8c", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }, "7a58a9d0aa01abb785392264a8c5406593d4fa2b6749f27094b4f80b939e1ab4": { "Name": "k8s_POD_kube-scheduler-docker-for-desktop_kube-system_ea66a171667ec4aaf1b274428a42a7cf_0", "EndpointID": "3a83f9b42be6f8b0a68e440b839aff4326d4d524590f5471ed6882560bb9658d", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }, "f9d84fe15fe1591d15d76fad2162285426aef4a700ed78c54b28c4a71b19c28c": { "Name": "k8s_POD_kube-apiserver-docker-for-desktop_kube-system_f10287b5cba0247140caeedc2e1fd602_0", "EndpointID": "3b43272e8ab15a3fe91d1c04cae74af2ce560b8431aaa3027bfe81b7e41fa531", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
bridge網路
Docker 會隨機分配一個本地未佔用的私有網段(在 RFC1918 中定義)中的一 個地址給 docker0介面。比如典型的 172.17.42.1,掩碼為255.255.0.0。此後啟動的容器內的網口也會自動分配一個同一網段( 172.17.0.0/16 )的地址。
當建立一個 Docker 容器的時候,同時會建立了一對 veth pair介面(當資料包傳送到一個介面時,另外一個介面也可以收到相同的資料包)。這對介面一端在容器內,即eth0 ——下面開啟的容器檢視IP資訊時的eth0;
userdeMBP:~ user$ docker run -it ubuntu:14.04 /bin/bash [email protected]:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03 inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:508 (508.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) [email protected]:/# ping 10.240.203.84 PING 10.240.203.84 (10.240.203.84) 56(84) bytes of data. 64 bytes from 10.240.203.84: icmp_seq=1 ttl=37 time=0.647 ms 64 bytes from 10.240.203.84: icmp_seq=2 ttl=37 time=0.513 ms 64 bytes from 10.240.203.84: icmp_seq=3 ttl=37 time=0.674 ms ^C --- 10.240.203.84 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2043ms rtt min/avg/max/mdev = 0.513/0.611/0.674/0.073 ms [email protected]:/# ping ww.baidu.com PING ps_other.a.shifen.com (123.125.114.144) 56(84) bytes of data. 64 bytes from 123.125.114.144: icmp_seq=1 ttl=37 time=46.3 ms 64 bytes from 123.125.114.144: icmp_seq=2 ttl=37 time=48.1 ms 64 bytes from 123.125.114.144: icmp_seq=3 ttl=37 time=47.1 ms ^C --- ps_other.a.shifen.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 46.341/47.210/48.168/0.748 ms
可以ping通本地主機網路可外部網路
另一端在本地並被掛載到docker0網橋,名稱以 veth開頭(例如vethAQI2QT)。通過這種方式,主機可以跟容器通訊,容器之間也可以相互通訊。Docker 就建立了在主機和所有容器之間一個虛擬共享網路。
因為我使用的是mac系統,為了使用Linux的命令來檢視網橋資訊,可以在剛剛使用--network=host的容器上進行檢視:
[email protected]025000000001:/# brctl show //沒有安裝brctl bash: brctl: command not found [email protected]-025000000001:/# apt-get install bridge-utils Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package brctl-utils //沒有找到這個包,可能需要更新下源 [email protected]-025000000001:/# apt-get update //更新源 Ign http://archive.ubuntu.com trusty InRelease Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB] ... Get:21 http://archive.ubuntu.com trusty/multiverse amd64 Packages [169 kB] Fetched 13.3 MB in 52s (252 kB/s) Reading package lists... Done [email protected]-025000000001:/# apt-get install bridge-utils //然後重新下載即可 Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: bridge-utils 0 upgraded, 1 newly installed, 0 to remove and 6 not upgraded. ...
然後就可以檢視網橋資訊了
[email protected]025000000001:/# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242c4a0b53e no veth3406c1a veth4a027b0 vethcee69e2
可以看見掛載到docker0網橋這邊的介面為veth3406c1a、veth4a027b0和vethcee69e2
檢視預設使用的bridge網路,如果在開啟容器時沒有制定,一般就會預設使用的是bridge網路。因為docker的橋接網路使用虛擬網橋,bridge網路用於同一主機上的docker容器相互通訊,連線到同一個網橋的docker容器可以相互通訊
userdeMacBook-Pro:~ user$ docker network inspect a782ffdae16f [ { "Name": "bridge", "Id": "a782ffdae16f9c3dbfec0a992a9a6d605429c657263dc83f33c71ad499f5e2b8", "Created": "2018-12-19T01:34:27.308734153Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "481d94d59f9f363fd3b00f09b793c9d7e1d90169626a7170f4d1012949c9ace4": { "Name": "wonderful_matsumoto", "EndpointID": "9dd9be72550d24135202f430dfeea0fb0132d52089045c933a5bfb6fd5ddb779", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "876cdcff687d83e5ea85d3c2eb16d01aac62bfd3e5051e5e65f0fd49230d7333": { "Name": "ubuntu2", "EndpointID": "9c16f983ff075f1499dcc1de4ead5ac77097829a68ff868a328e90e336660e29", "MacAddress": "02:42:ac:11:00:04", "IPv4Address": "172.17.0.4/16", "IPv6Address": "" }, "b4a512f0230fa598e7e40171e0597ea6db0740105449314a1a3767dcaa4a0edb": { "Name": "registry", "EndpointID": "b164dd37f23eac13364f1378642c5e8b88b783ea48fbbce26017ab02b33b542e", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true",//說明這個是預設的bridge網路 "com.docker.network.bridge.enable_icc": "true",//說明支援容器間互相通訊 "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0",//預設網橋的名字為docker0 "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] //上面可見為開啟的三個容器分別分配了172.17.0.0/16網段下的地址 userdeMacBook-Pro:~ user$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 084fd2f2927a ubuntu:14.04 "/bin/bash" About an hour ago Up About an hour ubuntu3 876cdcff687d ubuntu:14.04 "/bin/bash" About an hour ago Up About an hour ubuntu2 e6ba811ecb6a ubuntu:14.04 "/bin/bash" About an hour ago Up About an hour thirsty_germain 481d94d59f9f ubuntu:14.04 "/bin/bash" About an hour ago Up About an hour wonderful_matsumoto b4a512f0230f registry "/entrypoint.sh /etc…" 3 days ago Up 2 hours 0.0.0.0:5000->5000/tcp registry參考:https://blog.csdn.net/dhaiuda/article/details/82820318 連線到同一個bridge網路的容器(即它們地址都在同一個網段下)可以互相訪問彼此使用-p或--publish釋出的埠 我們也可以自定義自己的bridge網路,而且docker文件也建議構建自己的網路,因為預設bridge網路是有缺陷的 自定義和預設bridge網路的區別:
- 預設橋接網路中的容器只能通過IP地址訪問其他容器(除非使用遺留的-link指令連線兩個容器),而自定義橋接網路提供DNS解析,可以通過容器的名字或是別名訪問其他容器
- 容器可以自由的進入或是退出自定義橋接(bridge)網路,如果想要退出預設橋接(bridge)網路,需要先停止容器的執行,然後重新建立該容器,並指定需要連線的其他網路
- 如果更改了預設橋接網路的網路配置,需要重新啟動docker,並且由於預設橋接網路只有一個,因此所有容器的網路配置都是一樣的,而使用者自定義網路可以在建立時指定網路配置(例如預設閘道器、MTU等),不需要重啟docker,靈活性更高
- 在預設橋接網路中,可以通過--link引數連線兩個容器來共享環境變數,使用者自定義網路中無法使用這種方式,但是docker提供了更好的方式:
1.多個容器可以使用docker volume(這是docker儲存資料的一種方式,以後會介紹)掛載到同一個檔案,在檔案中指明環境變數,從而實現所容器的環境變數共享
2.多個容器可以使用同一個docker-compose.yml(與docker service有關)檔案啟動 ,可以在該檔案中定義共享環境變數
3.可以使用swarm services,並且通過 secrets 和 configs (這兩個還沒看)實現環境變數共享 <