Docker容器——网络管理

容器的四种网络模式

bridge 桥接模式
host 模式
none 模式
container 模式

启动容器时可以使用 --net 参数指定,默认是桥接模式。

Bridge 桥接模式

Bridge 桥接模式的实现步骤主要如下:

(1) Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为 veth0 和
veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将 报文传输给另一方。 (2) Docker
Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
(3) Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为
eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到DockerContainer
网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

Host 网络模式

使用docker run时使用–net=host指定,docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。host模式很好的解决了容器与外界通信的地址转换问题,可以直接使用宿主机的IP镜像通信。但是也降低了隔离性,同时还会引起网络资源的竞争和冲突。

Container 网络模式

多个容器使用共同的网络,看到的ip是一样的。container模式的应用场景就在于可以将一个应用的多个组件放在不同的容器中,这些容器配成container模式的网络,这样它们就可以作为一个整体对外提供服务。同样这种模式也降低了容器间的隔离性。

none方式

使用–net=none指定:这种模式下不会配置任何网络,它给了用户最大的自由度来自定义容器的网络环境。

查看docker网络的模式

[root@su1 _data]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f7ae2bd608b8        bridge              bridge              local
d549ed6519b2        host                host                local
cdede7d32b62        none                null                local

none模式

[root@su1 _data]# docker run -it --network=none busybox ##none开启内部接口,无法与外界通信,一些保密性较高的文件,可用none模式
/ # 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

host模式下与宿主机的网络相同

 [root@su1 _data]# docker run -it --network=host busybox
/ # ifconfig
br-ba6e4fa36e51 Link encap:Ethernet  HWaddr 02:42:42:05:C6:26  
          inet addr:172.19.0.1  Bcast:172.19.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:42ff:fe05:c626/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:8842 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11393 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2272788 (2.1 MiB)  TX bytes:54710192 (52.1 MiB)

docker0   Link encap:Ethernet  HWaddr 02:42:AC:FD:C0:98  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fefd:c098/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:13234 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27282 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:796414 (777.7 KiB)  TX bytes:106774259 (101.8 MiB)

eth0      Link encap:Ethernet  HWaddr 52:54:00:B4:A5:4C  
          inet addr:172.25.34.8  Bcast:172.25.34.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:feb4:a54c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:460536 errors:0 dropped:34 overruns:0 frame:0
          TX packets:254269 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:517233376 (493.2 MiB)  TX bytes:225095294 (214.6 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:6237 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6237 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:998960 (975.5 KiB)  TX bytes:998960 (975.5 KiB)
/ # exit
[root@su1 _data]# ifconfig
br-ba6e4fa36e51: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 172.19.255.255
        inet6 fe80::42:42ff:fe05:c626  prefixlen 64  scopeid 0x20<link>
        ether 02:42:42:05:c6:26  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:acff:fefd:c098  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:fd:c0:98  txqueuelen 0  (Ethernet)
        RX packets 13234  bytes 796414 (777.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27282  bytes 106774259 (101.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.34.8  netmask 255.255.255.0  broadcast 172.25.34.255
        inet6 fe80::5054:ff:feb4:a54c  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:b4:a5:4c  txqueuelen 1000  (Ethernet)
        RX packets 460594  bytes 517236796 (493.2 MiB)
        RX errors 0  dropped 34  overruns 0  frame 0
        TX packets 254287  bytes 225099226 (214.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 6237  bytes 998960 (975.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6237  bytes 998960 (975.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

桥接模式
1.不加参数默认是以桥接模式启动,会自动为容器分配一个ip

[root@su1 _data]# docker run -it  busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


重新打开终端
[root@su1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br-ba6e4fa36e51		8000.02424205c626	no		
docker0		8000.0242acfdc098	no		vethe9a18fc ##虚拟网卡
这种桥接方式与虚拟机和真机方式相同
[root@foundation34 Desktop]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.0021cc6b7616	no		enp0s25
							vnet0
							vnet1
							vnet2
virbr0		8000.525400661232	yes		virbr0-nic
virbr1		8000.525400b81165	yes		virbr1-nic

查看一下桥接的信息,网关是docker0
[root@su1 ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "f7ae2bd608b85f26a9ba99395b9deaa0e79128ff157b97979aa1dd86fe914bc0",
        "Created": "2019-11-08T21:15:41.234281965-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },

2.创建自定义的网关

[root@su1 harbor]# docker network create --driver bridge my_net ##--driver指定网络模式
88c3c24e0863f083905319f4c6549453f1b4b97181b872eb02722233189f32d3
[root@su1 harbor]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f7ae2bd608b8        bridge              bridge              local
d549ed6519b2        host                host                local
88c3c24e0863        my_net              bridge              local
cdede7d32b62        none                null                local
自动生成的网关和子网掩码
[root@su1 harbor]# docker network inspect my_net 
[
    {
        "Name": "my_net",
        "Id": "88c3c24e0863f083905319f4c6549453f1b4b97181b872eb02722233189f32d3",
        "Created": "2019-11-09T02:53:39.022076185-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]

3.自定义网关和子网掩码

[root@su1 harbor]# docker network create --driver bridge --subnet 172.22.0.0/24  --gateway 172.22.0.1 my_net1
74fb4d7b7af191ed81e0959eb4fb7990a6a4c0084b021a5f7a42e1162f5d7326
[root@su1 harbor]# docker network inspect my_net1 [
    {
        "Name": "my_net1",
        "Id": "74fb4d7b7af191ed81e0959eb4fb7990a6a4c0084b021a5f7a42e1162f5d7326",
        "Created": "2019-11-09T02:57:57.509962401-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.22.0.0/24",
                    "Gateway": "172.22.0.1"
                }
            ]

4.创建容器的同时指定使用特定的网络模式

[root@su1 harbor]# docker run -it --network=my_net1 busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:16:00:02  
          inet addr:172.22.0.2  Bcast:172.22.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 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:1016 (1016.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)

5.建立两个容器之间的连接

/ # ping ping 172.22.0.1   ## ping网关可以通
PING 172.20.0.1 (172.20.0.1) 56(84) bytes of data.
64 bytes from 172.22.0.1: icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from 172.22.0.1: icmp_seq=2 ttl=64 time=0.116 ms
^C
--- 172.22.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.103/0.109/0.116/0.012 ms
root@b010954d0ef6:/# ping 172.18.0.2    ##但是容器间不能ping通
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
^C

[root@su1 ~]# docker network connect xxx(网络模式名) busybox
进入容器中查看网卡信息,添加网卡成功
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:14:00:0a brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.2/24 brd 172.20.0.255 scope global eth0
       valid_lft forever preferred_lft forever
20: eth1@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

root@b010954d0ef6:/# ping 172.18.0.2  ##此时可以ping通
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.128 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.089 ms
^C

6.如何在不同的网关下指定ip

[root@su1 harbor]# docker run -it --network=my_net1 --ip 172.22.0.8 busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:16:00:08  
          inet addr:172.22.0.8  Bcast:172.22.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: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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

容器之间三种通信方式

IP Docker
DNS Server
joined容器

ip通信

两个容器要能通信,必须有属于同一个网络的网卡 具体做法就是在容器创建的时候通过 --network 指定相应的网络 或者通过docker
network connect 将现有的容器加入到指定的网络

Docker DNS Server

通过IP访问容器虽然满足了通信的需求,但是还是不够灵活,因为在部署应用之前可能无法确定IP 部署之后再指定要访问的IP会比较麻烦
对于这个问题 可以通过docker 自带的DNS服务解决 从docker1.10版本开始,docker daemon实现了一个内嵌的DNS
server,使容器可以直接通过“容器名”通信,方法很简单,只要在启动时用 --name为容器命名就可以了

docker network connect  网络模式  容器名/id

docker容器中自带有dns解析服务

[root@su1 harbor]# docker run -it --network=my_net1 --name box1 busybox
/ # ping box2
PING box2 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.316 ms
64 bytes from 172.22.0.3: seq=1 ttl=64 time=0.315 ms

[root@su1 ~]# docker run -it --network=my_net1 --name box2 busybox
/ # ping box1
PING box1 (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: seq=0 ttl=64 time=0.236 ms
64 bytes from 172.22.0.2: seq=1 ttl=64 time=0.307 ms

但是当容器不再同一个网段时,dns解析服务是无法工作在桥接模式下的

[root@su1 ~]# docker run -it  --name box3 busybox
/ # ping box1
ping: bad address 'box1'

joined容器

是另一种实现容器间通信的方式 joined容器非常特别,它可以使两个或多个容器共享一个网络栈
共享网卡和配置信息,joined容器之间可以通过127.0.0.1 直接通信

“”" joined容器非常适合以下场景
1.不同容器中的程序希望通过loopback高效地通信 比如web server 与 App Server
2.希望监控其他容器的网络流量 比如运行在独立容器中的网络监控 “”"

[root@su1 ~]# docker run -it  --name server1 busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[root@su1 harbor]# docker run -it --network=container:server1 busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  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:648 (648.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)

两个容器的网络栈共享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值