docker容器网络

docker容器网络

docker在安装后自动提供3种网络

 # docker network ls 查看
[root@node0 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ca3ffc857d6b   bridge    bridge    local
a3c6e9e82d4c   host      host      local
68e0702fcaa6   none      null      local

docker使用linux桥接,会虚拟一个docker容器网桥(docker0)

  • 启动容器时会根据docker0得网段分配ip地址,称作Container-IP(类似DHCP)
  • docker0是每个容器得默认网关
  • 各容器根据Container-IP直接通信
[root@node0 ~]# ip a|grep docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
19: vethb965cf0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
23: veth022ea6e@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 

[root@node0 ~]# docker run -it --rm busybox
/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

docker4种网络模式

网络模式 配置 说明
host --network host 容器和宿主机共享Network namespace
container --network container:NAME_OR_ID 容器和另外一个容器共享Network namespace
none --network none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等
bridge --network bridge 默认模式

docker容器网络

bridge模式

docker启动时创建docker0虚拟网桥,

  • 在此主机创建的容器都会连接至该虚拟网桥上
  • 该主机所有容器都连接在一个二层网络中
  • bridge模式是docker的默认网络模式,不写--network参数,就是bridge模式。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
docker容器网络

[root@node0 ~]# docker run fxx013/web:v0.3
[root@node0 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ca3ffc857d6b   bridge    bridge    local
a3c6e9e82d4c   host      host      local
68e0702fcaa6   none      null      local
[root@node0 ~]# nmcli device 
DEVICE       TYPE      STATE      CONNECTION 
ens160       ethernet  connected  ens160     
docker0      bridge    connected  docker0    
vethf26accc  ethernet  unmanaged  --         
lo           loopback  unmanaged  --         

[root@node0 ~]# ip a|grep veth
31: vethf26accc@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 

[root@node0 ~]# docker run -it --rm fxx013/web:v0.3
/ # ip a|grep eth0
18: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机端口]:[容器端口]访问容器。

docker run -p

//映射容器端口到宿主机端
[root@node0 ~]# docker run -it -p 80:80 --rm fxx013/web:v0.3
[root@node0 ~]# ss -antl
State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port  
LISTEN  0       128            0.0.0.0:80          0.0.0.0:*     
LISTEN  0       128            0.0.0.0:22          0.0.0.0:*     
LISTEN  0       128               [::]:22             [::]:*

[root@node0 ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS              PORTS                NAMES
c87b0434bf11   fxx013/web:v0.3   "/bin/httpd -f -h /w…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   gracious_pasteur
29258754a787   fxx013/web:v0.3   "/bin/httpd -f -h /w…"   14 minutes ago       Up 14 minutes                            kind_mclean
[root@node0 ~]# docker inspect c87b0434bf11
。。。
 "IPAddress": "172.17.0.3",
//主机访问
[root@node0 ~]# curl 172.17.0.3
hello world
//外部访问(如下图)

docker容器网络

container模式

特点:

  • 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace
  • 和一个指定的容器共享 IP、端口范围等
  • 除了网络方面,其他的如文件系统、进程列表等还是隔离的。
  • 两个容器的进程可以通过 lo 网卡设备通信。

container模式如下图所示:

docker容器网络

[root@node0 ~]# docker run -it --rm fxx013/web:v0.3
[root@node0 ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                NAMES
d78098f34642   fxx013/web:v0.3   "/bin/httpd -f -h /w…"   9 seconds ago    Up 8 seconds
[root@node0 ~]# docker inspect d78098f34642
...
 "IPAddress": "172.17.0.4",
 
[root@node0 ~]# docker run  -it --rm --network container:d78098f34642 busybox:latest 
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

host模式

特点:

  • 和宿主机共用一个Network Namespace
  • 使用宿主机的IP和端口
  • 文件系统、进程列表等还是和宿主机隔离的
  • 可以直接使用宿主机的IP地址与外界通信,网络好
  • 唯一端口,不能重复使用,网络隔离性差

docker容器网络

[root@node0 ~]# docker run  -it --rm --network host busybox:latest 
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
    link/ether 00:0c:29:bb:6f:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.94.142/24 brd 192.168.94.255 scope global dynamic ens160
       valid_lft 1025sec preferred_lft 1025sec
    inet6 fe80::c566:2591:64e:9b7c/64 scope link 
       valid_lft forever preferred_lft forever
[root@node0 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:bb:6f:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.94.142/24 brd 192.168.94.255 scope global dynamic noprefixroute ens160
       valid_lft 989sec preferred_lft 989sec
    inet6 fe80::c566:2591:64e:9b7c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

none模式

  • 容器创建后不进行任何网络配置
  • 只有lo回环网络
  • 网络安全性较好
    docker容器网络
[root@node0 ~]# docker run  -it --rm --network none busybox:latest 
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

上一篇:fedora学习笔记 1:fedora与linux的一点基础知识


下一篇:乾颐堂军哥HCIE5-OSPF的NSSA区域细节和中间系统到中间系统基础