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