自定义docker0桥的网络属性信息

自定义docker0桥的网络属性信息需要修改/etc/docker/daemon.json配置文件   

1 {
2     "bip": "192.168.1.5/24",       #  网桥的ip  
3     "fixed-cidr": "192.168.1.5/25",    #  混合模式的ip
4     "fixed-cidr-v6": "2001:db8::/64",   #   缓和模式ipv6的ip
5     "mtu": 1500,                        #  最大传输单元
6     "default-gateway": "10.20.1.1",      #    网关
7     "default-gateway-v6": "2001:db8:abcd::89",   #  ipv6的网关 
8     "dns": ["10.20.1.2","10.20.1.3"]
9 }

 

1 [root@localhost ~]# docker run -d --name web httpd  #   启一个容器
 2 b6cb0aea6b71e2d3e5330c58c3019576c2835ea5864e85c7ce2ea435ea60577e
 3 [root@localhost ~]# docker ps
 4 CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS         PORTS     NAMES
 5 b6cb0aea6b71   httpd     "httpd-foreground"   11 seconds ago   Up 9 seconds   80/tcp    web
 6 [root@localhost ~]# docker inspect web
 7                   "Gateway": "172.17.0.1",
 8                     "IPAddress": "172.17.0.2",    #  ip
 9 [root@localhost ~]# vim /etc/docker/daemon.json   #  修改如下
10  {
11   "registry-mirrors": ["https://o8iex5ry.mirror.aliyuncs.com"],
12   "bip":"192.168.1.1/24"
13 }
14  [root@localhost ~]# systemctl restart docker    #  重启docker
15 web
16 [root@localhost ~]# ip a    #  查看网络详细信息
17 docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
18     link/ether 02:42:e7:69:ef:af brd ff:ff:ff:ff:ff:ff
19     inet 192.168.1.1/24 brd 192.168.1.255 scope global docker0
20        valid_lft forever preferred_lft forever   #   IP变成我们设置的
21 [root@localhost ~]# docker ps -a  #  更改以后容器会停掉
22 CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS                     PORTS     NAMES
23 b6cb0aea6b71   httpd     "httpd-foreground"   12 minutes ago   Exited (0) 2 minutes ago             web
24 [root@localhost ~]# docker start web   #  重启容器
25 web
26 [root@localhost ~]# docker ps -a
27 CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS         PORTS     NAMES
28 b6cb0aea6b71   httpd     "httpd-foreground"   13 minutes ago   Up 5 seconds   80/tcp    web
29 [root@localhost ~]# docker inspect web    #  查看相信信息
30                     "Gateway": "192.168.1.1",
31                     "IPAddress": "192.168.1.2",   #   IP 也变成我们更改的
32  #  我们更改ip以后docker就会停止,重启之后容器没有启动,是我们手动启动的生产环境时候容器数量太多,我们不可能一个个去手动启动,
33 [root@localhost ~]# docker run -d --name web --restart=always httpd     #  加上restart=always 选项,可以让docker重启时,自动启动相关容器 
34 0dce636ec3217027391e9889e36caba9e95aec2bf3adafbd36474e5d73b6b5d5
35 [root@localhost ~]# vim /etc/docker/daemon.json 
36 {
37   "registry-mirrors": ["https://o8iex5ry.mirror.aliyuncs.com"]
38 }    #   删掉刚才更改的docker IP
39 [root@localhost ~]# systemctl restart docker   #  重启docker,容器也会启动
40 [root@localhost ~]# docker inspect web  #  查看web的ip
41                    "Gateway": "192.168.1.1",
42                     "IPAddress": "192.168.1.2",    #   还是我们之前设置的
43 [root@localhost ~]# ip a
44 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
45     link/ether 02:42:e7:69:ef:af brd ff:ff:ff:ff:ff:ff
46     inet 192.168.1.1/24 brd 192.168.1.255 scope global docker0
47        valid_lft forever preferred_lft forever
48     inet6 fe80::42:e7ff:fe69:efaf/64 scope link   #  docker0的ip也是我们之前设置的,说明你设置了,删除还是会保留你设置的,除非你重新设置。
49 [root@localhost ~]# vim /etc/docker/daemon.json
50 {
51   "registry-mirrors": ["https://o8iex5ry.mirror.aliyuncs.com"],
52   "bip": "172.17.0.1/16"    #   修改回来
53 }
54 [root@localhost ~]# systemctl restart docker   #   重启docker
55 [root@localhost ~]# docker inspect web    # 查看web的详细信息
56                     "Gateway": "172.17.0.1",
57                     "IPAddress": "172.17.0.2",     #   改回来了
58                     "IPPrefixLen": 16,

 

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

docker创建自定义桥

创建一个额外的自定义桥,区别于docker0

[root@localhost ~]# docker network ls    #   默认的只有三个
NETWORK ID     NAME      DRIVER    SCOPE
7eef472aff89   bridge    bridge    local
77faf4b77bb6   host      host      local
f6caf930adf9   none      null      local
[root@localhost ~]# docker network create -d bridge --subnet "192.168.1.0/24" --gateway "192.168.1.1" br0    #   创建一个叫br0的网络,指定用bridge模式(默认就是bridge模式)网段为192.168.1.0/24,24位子掩码,网关为192.168.1.1
04a189ad5987db4b1faff77dc3f7e983a9c743adcf89c19d5963ea994e3be0ce
[root@localhost ~]# docker network ls    #  新增了一个br0的桥
NETWORK ID     NAME      DRIVER    SCOPE
04a189ad5987   br0       bridge    local
7eef472aff89   bridge    bridge    local
77faf4b77bb6   host      host      local
f6caf930adf9   none      null      local
[root@localhost ~]# 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:bc:11:bf brd ff:ff:ff:ff:ff:ff
    inet 192.168.149.130/24 brd 192.168.149.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:e7:69:ef:af 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:e7ff:fe69:efaf/64 scope link 
       valid_lft forever preferred_lft forever
81: veth9b90e31@if80: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether e2:e9:8b:02:76:6b brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::e0e9:8bff:fe02:766b/64 scope link 
       valid_lft forever preferred_lft forever
82: br-04a189ad5987: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default   #   br0的桥
    link/ether 02:42:bd:e5:d6:f4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global br-04a189ad5987
       valid_lft forever preferred_lft forever

使用新创建的自定义桥来创建容器:

1 [root@localhost ~]# docker run -it --rm --network br0 busybox  # 指定br0的桥运行一个容器
 2 / # ip a
 3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
 4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 5     inet 127.0.0.1/8 scope host lo
 6        valid_lft forever preferred_lft forever
 7 83: eth0@if84: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
 8     link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff
 9     inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
10        valid_lft forever preferred_lft forever
11

再创建一个容器,使用默认的bridge桥:

1 [root@localhost ~]# docker run -it --rm --name b1 busybox
 2 / # ip a
 3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
 4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 5     inet 127.0.0.1/8 scope host lo
 6        valid_lft forever preferred_lft forever
 7 85: eth0@if86: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
 8     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
 9     inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
10        valid_lft forever preferred_lft forever
11 / # ping 192.168.1.2
12 PING 192.168.1.2 (192.168.1.2): 56 data bytes  不通

试想一下,此时的没有名字的容器与b1容器能否互相通信?如果不能该如何实现通信?

 

docker带宽限速 docker 带宽_docker

 

 

[root@localhost ~]# docker network connect br0 b1  # b1这个容器链接br0网络
 
/ # 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
85: eth0@if86: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
87: eth1@if88: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:01:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global eth1
       valid_lft forever preferred_lft forever   #  此时b1多了一个1.3的网段
/ # ping 192.168.1.2    #   他ping的通1.2了,因为在一个网段
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: seq=0 ttl=64 time=0.211 ms
64 bytes from 192.168.1.2: seq=1 ttl=64 time=0.201 ms
#   所以这两个容器想要通信可以新增网卡,把对方的网段加到里面去就可以了
[root@localhost ~]# docker network disconnect br0 b1   #   断开连接
/ # 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
85: eth0@if86: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever   #   ens1网卡就断开连接了
[root@localhost ~]# docker run -itd --name b1 busybox sleep 60000    #  创建一个新容器b1
b9409973687f0c0e4555cc004fec12514fafbf5bd56cfbaa1941a27dcc001655
[root@localhost ~]# docker  ps
CONTAINER ID   IMAGE     COMMAND         CREATED          STATUS          PORTS     NAMES
b9409973687f   busybox   "sleep 60000"   34 seconds ago   Up 33 seconds             b1
[root@localhost ~]# docker exec -it b1 /bin/sh    #   进到里面去
/ # 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
91: eth0@if92: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@localhost ~]# docker network connect br0 b1  #    b1连接br0网络 
/ # 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
91: eth0@if92: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
93: eth1@if94: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth1
       valid_lft forever preferred_lft forever    #  连上了
[root@localhost ~]# docker restart b1    #  重启b1
[root@localhost ~]# docker exec -it b1 /bin/sh
/ # 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
95: eth1@if96: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth1
       valid_lft forever preferred_lft forever
97: eth0@if98: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever    #   还是存在
[root@localhost ~]# systemctl restart docker  #  重启docker,b1会断掉
[root@localhost ~]# docker start b1    # 手动启动b1
b1
[root@localhost ~]# docker exec -it b1 /bin/sh   #   进到b1 网卡还在 说明是永久性的
/ # 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
99: eth1@if100: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth1
       valid_lft forever preferred_lft forever
101: eth0@if102: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever