1. 程式人生 > 實用技巧 >docker虛擬化網路及配置

docker虛擬化網路及配置

目錄

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套接字,則需要修改/etc/docker/daemon.json配置檔案,新增如下內容,然後重啟docker服務

"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]

在客戶端上向dockerd直接傳遞“-H|--host”選項指定要控制哪臺主機上的docker容器

docker -H 192.168.10.145:2375 ps

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