Docker 网络

文章目录

  • Bridge默认网桥
  • 自定义网络
  • host 和 none

在我们安装 Docker 后,会自动创建三个网络。我们可以使用下面的命令来查看这些网络:三个默认的网络分别为 bridgehostnone

[root@backup ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3c820edd253        bridge              bridge              local
700690effbad        host                host                local
6b4f59e086a4        none                null                local

Bridge默认网桥

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 和 none

host 网络,容器可以直接访问主机上的网络。

docker run -it --network host --rm busybox /bin/sh

如图,可以直接使用本地网卡

Docker 网络_第1张图片
none 网络,容器中不提供其它网络接口。

[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

你可能感兴趣的:(Docker)