Docker
后,会自动创建三个网络。我们可以使用下面的命令来查看这些网络:三个默认的网络分别为
bridge
,
host
,
none
。
[root@backup ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f3c820edd253 bridge bridge local
700690effbad host host local
6b4f59e086a4 none null local
bridge
,即桥接网络,在安装 docker
后会创建一个桥接网卡,该桥接网卡的名称为 docker0
,默认情况下,我们创建的容器都会自动连接到 bridge 网络。可以通过下面的命令来查看:
[root@backup ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:63ff:fe25:712e prefixlen 64 scopeid 0x20<link>
ether 02:42:63:25:71:2e txqueuelen 0 (Ethernet)
RX packets 433 bytes 37468 (36.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 417 bytes 70918 (69.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我们可以尝试创建一个容器,该容器会自动连接到 bridge
网络,例如我们创建一个名为 test001
的容器:
docker run -itd --name test001 ubuntu /bin/bash
# 上述命令中默认使用 --network bridge ,即指定 bridge 网络,与下面的命令等同
docker run -itd --name test001 --network bridge ubuntu /bin/bash
创建后,再次查看 bridge
的信息:
[root@backup ~]# docker inspect test001 |grep -w IPAddress
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
这时可以查看到相应的容器的网络信息,该容器在连接到 bridge
网络后,会从子网的地址池中获得一个 IP
地址,即172.17.0.3
。
并且对于连接到默认的 bridge
之间的容器可以通过 IP
地址互相通信。例如我们启动一个 test002
的容器,它可以与 test001
通过 IP
地址进行通信。
默认的 bridge
网络,每次重启容器,容器的 IP
地址都会发生变化。对于默认的 bridge
网络,不能在启动容器的时候指定 IP
,这个只有自定义网络才支持。那么如何让两个容器之间互相通信呢?
方法一:容器互联
容器间都是通过在 /etc/hosts
文件中添加相应的解析,通过容器名,别名,服务名等来识别需要通信的容器。
# 1、首先启动一个名为 test001 的容器,使用镜像 busybox
docker run -it --rm --name test001 busybox /bin/sh
# 2、这时打开一个新的终端,启动一个名为 test002 的容器,并使用 --link 参数与容器 test001 互联
docker run -it --rm --name test002 --link test001 busybox /bin/sh
docker run 命令的 --link 参数的格式为 --link :alias。格式中的 name 为容器名,alias 为别名。即可以通过 alias 访问到该容器。
这样test002
容器可以通过test001
域名解析到test001
容器。
/ # ping test001
PING test001 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.096 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.064 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.072 ms
方法二:自定义网络
除了使用默认网络,我们还可以创建自己的 bridge 或 overlay 网络,我们创建一个名为 network1 的桥接网络:
docker network create -d bridge --subnet=172.16.0.1/24 --gateway=172.16.0.1 network1
查看创建的自定义网络
[root@backup ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f3c820edd253 bridge bridge local
700690effbad host host local
0417d178b48b network1 bridge local
6b4f59e086a4 none null local
# 新增了一个 br-0417d178b48b 虚拟网卡
[root@backup ~]# ifconfig
br-0417d178b48b: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.16.0.1 netmask 255.255.255.0 broadcast 172.16.0.255
ether 02:42:15:58:d4:8b txqueuelen 0 (Ethernet)
RX packets 1040939 bytes 169002656 (161.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1040939 bytes 169002656 (161.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:63ff:fe25:712e prefixlen 64 scopeid 0x20<link>
ether 02:42:63:25:71:2e txqueuelen 0 (Ethernet)
RX packets 434 bytes 37496 (36.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 417 bytes 70918 (69.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此时,我们可以运行一个容器 test001
,指定其网络为 network1
,使用 --network network1
:
docker run -it --name test001 --network network1 --rm busybox /bin/sh
可以看到使用的是刚刚创建的那个网卡
[root@backup ~]# docker run -it --name test001 --network network1 --rm busybox /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02
inet addr:172.16.0.2 Bcast:172.16.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 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:942 (942.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
删除容器,这时我们再次创建该容器,但是不指定其 --network
:
docker run -it --name test001 --rm busybox /bin/sh
此时,该容器连接到默认的 bridge
网络,这时,可以新打开一个终端,在其中运行如下命令,将 test001
连接到 network1
网络中:
docker network connect network1 test001
查看该容器网卡情况,出现了一个 eth1
接口,此时,eth0
连接到默认的 bridge
网络,eth1
连接到 network1
网络
/ # 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:8 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:656 (656.0 B) TX bytes:0 (0.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:AC:10:00:02
inet addr:172.16.0.2 Bcast:172.16.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 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:656 (656.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
对于自定义的网络来说,docker
嵌入的 DNS
服务支持连接到该网络的容器名的解析。这意味着连接到同一个网络的容器都可以通过容器名去 ping
另一个容器。
启动两个容器,连接到 network1
,属于同一个网络的两个容器,是可以通过容器名 ping
通的。
[root@backup ~]# docker run -it --name test_1 --network network1 --rm busybox /bin/sh
/ # ping test_2
PING test_2 (172.16.0.3): 56 data bytes
64 bytes from 172.16.0.3: seq=0 ttl=64 time=0.050 ms
64 bytes from 172.16.0.3: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.16.0.3: seq=2 ttl=64 time=0.056 ms
64 bytes from 172.16.0.3: seq=3 ttl=64 time=0.065 ms
[root@backup ~]# docker run -it --name test_2 --network network1 --rm busybox /bin/sh
/ # ping test_1
PING test_1 (172.16.0.2): 56 data bytes
64 bytes from 172.16.0.2: seq=0 ttl=64 time=0.068 ms
64 bytes from 172.16.0.2: seq=1 ttl=64 time=0.061 ms
64 bytes from 172.16.0.2: seq=2 ttl=64 time=0.062 ms
64 bytes from 172.16.0.2: seq=3 ttl=64 time=0.056 ms
64 bytes from 172.16.0.2: seq=4 ttl=64 time=0.061 ms
除此之外,在用户自定义的网络中,是可以通过 --ip
指定 IP
地址的,而在默认的 bridge
网络不能指定 IP
地址:
[root@backup ~]# docker run -it --network network1 --ip 172.16.0.10 --rm busybox /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:0A
inet addr:172.16.0.10 Bcast:172.16.0.255 Mask:255.255.255.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:516 (516.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
host
网络,容器可以直接访问主机上的网络。
docker run -it --network host --rm busybox /bin/sh
如图,可以直接使用本地网卡
[root@backup ~]# docker run -it --network none --rm busybox /bin/sh
/ # ifconfig
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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # exit