docker虚拟化网络及配置

时间:2024-03-10 15:40:24

1. 虚拟化网络

我们知道物理网卡可以单独关联至某个单独的名称空间使用,这样每一个名称空间都能配置IP地址,并且与外部网络直接通信。但是如果我们所拥有的名称空间数量超过物理网卡数量,该怎么通信呢?

Network Namespace 就是Linux内核提供可以实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,不同Network Namespace的资源相互不可见,彼此之间无法通信。

此时我们可以使用虚拟网卡设备,用纯软件的方式来模拟一组设备来使用。Linux内核级支持2种级别设备的模拟,一种是二层设备,一种是三层设备。对于二层设备,每个网络接口设备是成对出现的,可以模拟为一根网线的两端,其中一端模拟主机的虚拟网卡,另一端模拟虚拟交换机,就相当于让一个主机连到一个交换机上去。

1.1 单节点容器间通信

如果在同一个物理机上的两个容器想通信,我们的办法就是在这台主机上建立一个虚拟交换机,而后让两个容器各自用纯软件的方式创建一对虚拟网卡,一半在容器上,一半在虚拟交换机上,从而实现通信。

对于单节点上不同网络的容器该如何通信呢?不在同一网络我们就必须要通过路由转发才能使其通信,也就是我们得在两台交换机之间加一个路由器,其实Linux内核本身就是支持路由转发的,只需要我们将路由转发功能打开即可。此时我们可以再启动一个容器,这个容器里面就跑一个内核,并将其转发功能打开,这样一来就模拟了一台路由器,通过这台路由器来实现路由转发。

1.2 不同节点容器间通信

可以使用NAT技术,通过DNAT将容器的端口与宿主机端口映射,通过访问宿主机的端口来实现访问容器内部的目的,而在请求端我们需要做SNAT将数据包通过宿主机的真实网卡转发出去。但这样做的话,因为要进行两次NAT转换,所以效率会比较低。

也可以采用一种叫做Overlay Network(叠加网络)的技术来实现不同节点间容器的相互通信功能。

Overlay Network会将报文进行隧道转发,也就是在报文发出去之前要为其添加一个IP首部,当宿主机2收到报文后解封装发现要找的目标容器是C2,于是把包转发给C2。

1.3 ip netns

借助ip netns命令可以完成对Network Namespace的各种操作,ip netns命令修改网络配置时需要 sudo 权限。

[root@vm1 ~]# ip netns help
Usage:	ip netns list
	ip netns add NAME
	ip netns attach NAME PID
	ip netns set NAME NETNSID
	ip [-all] netns delete [NAME]
	ip netns identify [PID]
	ip netns pids NAME
	ip [-all] netns exec [NAME] cmd ...
	ip netns monitor
	ip netns list-id
NETNSID := auto | POSITIVE-INT

创建命名空间

  • 默认情况下Linux系统中是没有任何 Network Namespace

新创建的命名空间会出现在/var/run/netns/目录下,对于每个 Network Namespace 来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。

[root@vm1 ~]# ip netns list 
[root@vm1 ~]# 
[root@vm1 ~]# ip netns add ns0
[root@vm1 ~]# ip netns list 
ns0
[root@vm1 ~]# ls /var/run/netns/
ns0

进入命名空间操作

  • ip netns exec XX command 进入XX命名空间执行命令
[root@vm1 ~]# ip netns exec ns0 ip address
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@vm1 ~]# ip netns exec ns0 ip link set lo up
[root@vm1 ~]# ip netns exec ns0 ip address
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
[root@vm1 ~]# ip netns exec ns0 ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.147 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.086 ms

创建虚拟网卡设备Veth

veth pair全称是Virtual Ethernet Pair,是一个成对的端口
引入veth pair是为了在不同的 Network Namespace直接进行通信,利用它可以直接将两个 Network Namespace 连接起来。

Usage: ip link add type TYPE [ ARGS ]
TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
	   bridge | bond | team | ipoib | ip6tnl | ipip | sit | vxlan |
	   gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan |
	   vti | nlmon | team_slave | bond_slave | bridge_slave |
	   ipvlan | ipvtap | geneve | vrf | macsec | netdevsim | rmnet |
	   xfrm }

[root@vm1 ~]# ip link add type veth
[root@vm1 ~]# ip a
..................................................
51: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether f6:2c:d8:db:c5:f2 brd ff:ff:ff:ff:ff:ff
52: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 26:30:f2:f9:98:6f brd ff:ff:ff:ff:ff:ff

实现命名空间的通信

  • ns0 与 ns1通信
  • ip link set DEVICE netns NAME: 将网卡设备加入命名空间

[root@vm1 ~]# ip netns list
ns1
ns0
##将虚拟接口加入命名空间
[root@vm1 ~]# ip link set veth0 netns ns0
[root@vm1 ~]# ip link set veth1 netns ns1
[root@vm1 ~]# ip netns exec ns0 ip a
....................................
51: veth0@if52: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether f6:2c:d8:db:c5:f2 brd ff:ff:ff:ff:ff:ff link-netns ns1
[root@vm1 ~]# ip netns exec ns1 ip a
....................................
52: veth1@if51: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 26:30:f2:f9:98:6f brd ff:ff:ff:ff:ff:ff link-netns ns0

##配置命名空间的虚拟接口
[root@vm1 ~]# ip netns exec ns0 ip link set veth0 up
[root@vm1 ~]# ip netns exec ns0 ip addr add 192.168.10.1/24 dev veth0
[root@vm1 ~]# ip netns exec ns0 ip addr
.....................................................
51: veth0@if52: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether f6:2c:d8:db:c5:f2 brd ff:ff:ff:ff:ff:ff link-netns ns1
    inet 192.168.10.1/24 scope global veth0
       valid_lft forever preferred_lft forever
[root@vm1 ~]# ip netns exec ns1 ip link set veth1 up
[root@vm1 ~]# ip netns exec ns1 ip addr add 192.168.10.2/24 dev veth1
[root@vm1 ~]# ip netns exec ns1 ip addr
...................................
52: veth1@if51: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 26:30:f2:f9:98:6f brd ff:ff:ff:ff:ff:ff link-netns ns0
    inet 192.168.10.2/24 scope global veth1
       valid_lft forever preferred_lft forever

##验证
[root@vm1 ~]# ip netns exec ns0 ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.154 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.117 ms
....................................
[root@vm1 ~]# ip netns exec ns1 ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.095 ms
....................................

重命名虚拟网卡

[root@vm1 ~]# ip netns exec ns1 ip link set veth1 name eth1
RTNETLINK answers: Device or resource busy
[root@vm1 ~]# ip netns exec ns1 ip link set veth1 down
[root@vm1 ~]# ip netns exec ns1 ip link set veth1 name eth1
[root@vm1 ~]# ip netns exec ns1 ifconfig -a
eth1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.10.2  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 26:30:f2:f9:98:6f  txqueuelen 1000  (Ethernet)
        RX packets 19  bytes 1482 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19  bytes 1482 (1.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2. docker容器网络

2.1 libnetwork

libnetwork项目从lincontainer和Docker代码的分离早在Docker1.7版本就已经完成了(从Docker 1.6版本的网络代码中抽离)。在此之后,容器的网络接口就成为了一个个可替换的插件模块。

libnetwork所做的最核心事情是定义了一组标准的容器网络模型(Container Network Model,简称CNM),只要符合这个模型的网络接口就能被用于容器之间通信,而通信的过程和细节可以完全由网络接口来实现。

  • CNM网络模型及三个术语:Sandbox、Endpoint和Network。

Sandbox

对应一个容器中的网络环境,包括相应的网卡配置、路由表、DNS配置等。CNM很形象的将它表示为网络的『沙盒』,因为这样的网络环境是随着容器的创建而创建,又随着容器销毁而不复存在的;

Endpoint

实际上就是一个容器中的虚拟网卡,在容器中会显示为eth0、eth1依次类推;

Network

指的是一个能够相互通信的容器网络,加入了同一个网络的容器直接可以直接通过对方的名字相互连接。它的实体本质上是主机上的虚拟网卡或网桥。

2.2 网络模式

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

  • 使用docker network ls命令可以查看docker提供的网络
[root@vm1 ~]# ip a
..................................
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:45:c5:bf:bf 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:45ff:fec5:bfbf/64 scope link 
       valid_lft forever preferred_lft forever

[root@vm1 ~]# docker network ls 
NETWORK ID     NAME      DRIVER    SCOPE
e9d0e5efa705   bridge    bridge    local
e5566dd8f72b   host      host      local
4ea87871ddc1   none      null      local
  • docker network
[root@vm1 ~]# docker network --help 

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  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

bridge模式

当Docker进程启动时会在主机上创建一个名为docker0的虚拟网桥,docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。然后在主机上创建一对虚拟网卡veth设备,Docker将veth设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在宿主机中,以veth命名,并将这个网络设备加入到docker0网桥中.

bridge模式是docker的默认网络模式,可以通过容器端口到宿主机端口的映射(docker run -p/-P xxx来启用),从而可以从外部访问到容器.

配置

[root@vm1 ~]# ip a
...................................
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:45:c5:bf:bf 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
....................................
[root@vm1 ~]# docker run -it --name test1 --network bridge --rm busybox
/ # ifconfig -a 
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
...............................................
[root@vm1 ~]# docker run -it --name test2 --network bridge --rm busybox
/ # ifconfig -a 
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

##test1
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.364 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.238 ms

##test2
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.374 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.326 ms

container

新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

配置

  • 第一个容器:bridage模式
[root@vm1 ~]# docker run -it --name test1 --rm busybox
/ # ifconfig eth0
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
........................................
  • 第二个容器:container模式
[root@vm1 ~]# docker run -it --name test2 --network container:test1 --rm  busybox
/ # ifconfig eth0
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
  • 在第二个容器开启httpd服务
/ # echo "hello!" > /tmp/index.html
/ # ls /tmp
index.html
/ # httpd -h /tmp
/ # netstat -antl 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 :::80                   :::*                    LISTEN   
  • 在第一个容器*问httpd服务
/ # wget -O - -q 127.0.0.1:80
hello!
  • 由此可见,container模式下的容器间关系就相当于一台主机上的两个不同进程

host

和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

配置

[root@vm1 ~]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:d6:e1:c9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.225.127/24 brd 192.168.225.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:45:c5:bf:bf 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:45ff:fec5:bfbf/64 scope link 
       valid_lft forever preferred_lft forever
60: veth2088dd7@if59: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 82:4c:d0:30:1e:ad brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::804c:d0ff:fe30:1ead/64 scope link 
       valid_lft forever preferred_lft forever
[root@vm1 ~]# docker run -it --name test2 --rm --network host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:45:C5:BF:BF  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:45ff:fec5:bfbf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:136 errors:0 dropped:0 overruns:0 frame:0
          TX packets:359 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:10845 (10.5 KiB)  TX bytes:20624 (20.1 KiB)

ens33     Link encap:Ethernet  HWaddr 00:0C:29:D6:E1:C9  
          inet addr:192.168.225.127  Bcast:192.168.225.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:270246 errors:0 dropped:0 overruns:0 frame:0
          TX packets:72273 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:344821211 (328.8 MiB)  TX bytes:9088314 (8.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:259 errors:0 dropped:0 overruns:0 frame:0
          TX packets:259 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26560 (25.9 KiB)  TX bytes:26560 (25.9 KiB)

veth2088dd7 Link encap:Ethernet  HWaddr 82:4C:D0:30:1E:AD  
          inet6 addr: fe80::804c:d0ff:fe30:1ead/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:906 (906.0 B)
/ # echo "hello world!" > /tmp/index.html
/ # httpd -h /tmp
/ # netstat -antl 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.225.127:22      192.168.225.1:56372     ESTABLISHED 
tcp        0      0 192.168.225.127:22      192.168.225.1:42094     ESTABLISHED 
tcp        0      0 192.168.225.127:22      192.168.225.1:56716     ESTABLISHED 
tcp        0      0 192.168.225.127:22      192.168.225.1:39710     ESTABLISHED 
tcp        0      0 :::80                   :::*                    LISTEN      
tcp        0      0 :::22                   :::*                    LISTEN      
/ # 

[root@vm1 ~]# curl 127.0.0.1:80
hello world!

none

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。这种网络模式下容器只有lo回环网络,没有其他网卡。

配置

[root@vm1 ~]# docker run -it --name test1 --rm --network none busybox
/ # ifconfig -a
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)

/ # 

macvlan

overlay

3. 启动容器常用操作

3.1 关于主机名和DNS

  • --hostname XXXX,启动容器时设置主机名,同时添加IP与主机名的映射
  • --add-host 主机名:IP 手动指定/etc/hosts映射
  • --dns 手动指定容器的DNS
[root@vm1 ~]# docker run -it --name test1 --rm --hostname wisan busybox
/ # hostname 
wisan
/ # 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.2	wisan
/ # cat /etc/resolv.conf 
# Generated by NetworkManager
search localdomain
nameserver 192.168.225.2
/ # ping www.baidu.com
PING www.baidu.com (182.61.200.6): 56 data bytes
64 bytes from 182.61.200.6: seq=0 ttl=127 time=123.645 ms
64 bytes from 182.61.200.6: seq=1 ttl=127 time=37.370 ms

3.2 开放容器端口

docker run -p命令可以将容器中的应用端口映射到宿主机中,从而实现让外部主机可以通过访问宿主机的某端口来访问容器内应用的目的。
docker port 查看容器端口映射情况

  • -p选项如下:
1. -p <containerPort> 将指定的容器端口映射至主机所有地址的一个随机端口
2. -p <hostPort>:<containerPort>将容器端口映射至指定的主机端口
3. -p <ip>::<containerPort>将指定的容器端口映射至主机指定IP的随机端口
4. -p <ip>:<hostPort>:<containerPort>将指定的容器端口映射至主机指定IP的指定端口

3.3 自定义docker0网桥属性

  • 通过修改/etc/docker/daemon.json配置文件自定义

核心选项为bip,用于指定docker0桥自身的IP地址;其它选项可通过此地址计算得出。

## 格式如下:
{
  "bip": "192.168.1.5/24",
  "fixed-cidr": "192.168.1.5/25",
  "fixed-cidr-v6": "2001:db8::/64",
  "mtu": 1500,
  "default-gateway": "10.20.1.1",
  "default-gateway-v6": "2001:db8:abcd::89",
  "dns": ["10.20.1.2","10.20.1.3"]
}
  • 更改bip地址
[root@vm1 ~]# nmcli dev show docker0
GENERAL.DEVICE:                         docker0
GENERAL.TYPE:                           bridge
GENERAL.HWADDR:                         02:42:45:C5:BF:BF
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     docker0
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/2
IP4.ADDRESS[1]:                         172.17.0.1/16
IP4.GATEWAY:                            --
..........................................
[root@vm1 ~]# vi /etc/docker/daemon.json 
{
    "registry-mirrors": ["https://mirror.baidubce.com"],
    "bip": "192.168.100.1/24"
}

[root@vm1 ~]# systemctl daemon-reload
[root@vm1 ~]# systemctl restart docker
[root@vm1 ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.100.1  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::42:45ff:fec5:bfbf  prefixlen 64  scopeid 0x20<link>
        ether 02:42:45:c5:bf:bf  txqueuelen 0  (Ethernet)
        RX packets 146  bytes 11411 (11.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 371  bytes 21659 (21.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

3.4 docker远程连接

dockerd守护进程的C/S,其默认仅监听Unix Socket格式的地址(/var/run/docker.sock),如果要使用TCP套接字,则需要修改systemd file,然后重启docker

[root@vm3 system]# systemctl edit docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375   ##接收来自任意IP的2375端口请求
[root@vm3 system]# cat /etc/systemd/system/docker.service.d/override.conf 
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

[root@vm3 system]# systemctl daemon-reload
[root@vm3 system]# systemctl restart docker 
[root@vm3 system]# ss -antl 
State             Recv-Q            Send-Q                       Local Address:Port                       Peer Address:Port           
LISTEN            0                 128                                0.0.0.0:22                              0.0.0.0:*              
LISTEN            0                 128                                      *:2375                                  *:*              
LISTEN            0                 128                                   [::]:22                                 [::]:*     
  • 远程测试vm1上远程vm3(192.168.225.130:2375)
[root@vm1 ~]# docker -H tcp://192.168.225.130:2375 ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@vm1 ~]# docker -H 192.168.225.130:2375 run -it --name test1 busybox /bin/sh
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var

3.5 docker自定义网桥

  • 创建一个额外的自定义桥,区别于docker0
[root@vm1 ~]# docker network create --help

Usage:  docker network create [OPTIONS] NETWORK

Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network\'s scope
      --subnet strings       Subnet in CIDR format that represents a network segment
[root@vm1 ~]# docker network create -d bridge --subnet 192.168.200.0/24 --gateway 192.168.200.1 br0
80c68d942859e5b570d2d8d268d23f03f40df8797cb2451bf75fcf997c5d74ad
[root@vm1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
80c68d942859   br0       bridge    local
d56475f607cc   bridge    bridge    local
e5566dd8f72b   host      host      local
4ea87871ddc1   none      null      local