運維實戰 容器部分 Docker網絡
- 原生網絡模式
-
- Host模式
- None模式
- Docker自定義網絡
-
- 建立自定義網橋
- 自定義網段及網關
- Docker容器通信
-
- Joined容器方式通信
- Link連結方式通信
- 外網如何通路容器
- 跨主機容器網絡
-
- Macvlan網絡方案實作
-
- 特點
- 操作流程
- Macvlan網絡間的隔離和連通
原生網絡模式
Docker
安裝後會自動建立3種網絡:
Bridge
.
Host
,
None
,
Docker
安裝時會建立一個名為
docker0
的
Linux bridge
, 建立的容器會自動橋接到這個接口.
docker0
作為所有容器的網關,預設IP為
172.17.0.1
,新建立的容器配置設定的
IP
預設單調遞增,是以如果不加以設定每次開啟容器時的IP都可能出現變化.
##安裝用于檢視資訊的軟體包
yum install bridge-utils.x86_64
##檢視網橋初始狀态
[[email protected] ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02424bfd7ed8 no
##建立容器後可以觀察到有接口接在了網橋上
[[email protected] ~]# docker run -d --name Nginx nginx:latest
c980d6466da5a6f21c247099abec01aa2f4b333f21b0714ada8838b99d9a994c
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c980d6466da5 nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp Nginx
[[email protected] ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02424bfd7ed8 no veth50c8b1c
##新的容器也會依次接入
[[email protected] ~]# docker run -d --name Nginx2 nginx:latest
97c176c978040853067c5268897319c4f49fc30884499bc757084671bb79d689
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97c176c97804 nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 1 second 80/tcp Nginx2
c980d6466da5 nginx:latest "/docker-entrypoint.…" 49 seconds ago Up 48 seconds 80/tcp Nginx
[[email protected] ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02424bfd7ed8 no veth50c8b1c
veth90063b4
關閉容器, 則橋接自動關閉
Bridge
模式下容器沒有一個公有IP, 隻有主控端可以直接通路, 外部主機是不可見的. 容器通過主控端的NAT規則後可以通路外網.
Host模式
Host
模式可以讓容器共享主控端網絡棧, 這樣的好處是外部主機與容器直接通信, 但是容器的網絡缺少隔離性.
Host
網絡模式需要在容器建立時指定
--network
##可以看到采用Host模式建立的容器并沒有直接挂接在docker0上
[[email protected] ~]# docker run -d --name Nginx --network host nginx:latest
f60c42e66598f7a8557f11e42e2876c12cb957dc6bd4bcca92c693e7a28707e6
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f60c42e66598 nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds Nginx
[[email protected] ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02424bfd7ed8 no
[[email protected] ~]# ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:9b:66:f1 brd ff:ff:ff:ff:ff:ff
inet 172.25.5.1/24 brd 172.25.5.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe9b:66f1/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:4b:fd:7e:d8 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:4bff:fefd:7ed8/64 scope link
valid_lft forever preferred_lft forever
None模式
None
模式是指禁用網絡功能, 隻有lo接口,在容器建立時使用
--network=none
進行指定
[[email protected] ~]# docker run -d --name Nginx --network none nginx:latest
d13f5ba0fc1a10a3c325e6f000c0c8ab28ee150caec8ba26099ba53327be62a9
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d13f5ba0fc1a nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 3 seconds Nginx
[[email protected] ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02424bfd7ed8 no
檢視容器内部網絡情況
##Host模式
[[email protected] ~]# docker run -it --name Centos --network host centos:latest
[[email protected] /]# ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:9b:66:f1 brd ff:ff:ff:ff:ff:ff
inet 172.25.5.1/24 brd 172.25.5.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe9b:66f1/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:4b:fd:7e:d8 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:4bff:fefd:7ed8/64 scope link
valid_lft forever preferred_lft forever
[[email protected] /]# hostname
Server1
##None模式
[[email protected] ~]# docker run -it --name Centos --network none centos:latest
[[email protected] /]# ip addr
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
Docker自定義網絡
自定義網絡模式中,
Docker
提供了三種自定義網絡驅動:
bridge
,
overlay
和
macvlan
bridge
驅動類似預設的
bridge
網絡模式, 但增加了一些新的功能;
overlay
和
macvlan
是用于建立跨主機網絡.
建議使用自定義的網絡來控制哪些容器可以互相通信, 還可以自動DNS解析容器名稱到IP位址.
建立自定義網橋
#沒有指定,預設為橋接docker
[[email protected] ~]# docker network create MyNet1
f7778a9243a9115df2232bce7f51b7f2e0cad255dde85f2e62aab3c7d353345a
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER
SCOPEf7778a9243a9 MyNet1 bridge
localaa1073e86d69 bridge bridge
local2c8ef7f4a10e host host
local48d010d8c011 none null local
- 指定容器運作在該網絡中
docker run -it --name Node1 --network MyNet1 busybox
ip addr #可以看到ip呈單調遞增趨勢
ctrl+p+q #将運作的容器打入背景, 不要關閉, 如果關閉, 配置設定的ip會被回收
docker run -it --name Node2 --network MyNet1 busybox
ip addr
##可以ping通同一網絡中的容器
ping Node1
##自帶DNS解析功能
cat /etc/hosts
自定義網段及網關
- 删除之前測試用的容器, 建立新的網絡源
MyNet2
[[email protected] ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 MyNet2
2c8c1dc7fcbc9e4848103248ce074af88ee9a3fc0f37ed507780288b699a99fd
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER
SCOPEf7778a9243a9 MyNet1 bridge
local2c8c1dc7fcbc MyNet2 bridge
localaa1073e86d69 bridge bridge
local2c8ef7f4a10e host host
local48d010d8c011 none null local
[[email protected] ~]# docker network inspect MyNet2
[
{ "Name": "MyNet2",
"Id": "2c8c1dc7fcbc9e4848103248ce074af88ee9a3fc0f37ed507780288b699a99fd",
"Created": "2021-04-28T13:51:37.120782352+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.20.0.0/24",
"Gateway": "172.20.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}]
- 運作容器并指定IP
docker run -it --name Node1 --network MyNet2 --ip 172.20.0.10 ubuntu
ip addr
ctrl+p+q将該容器程序打入背景,注意不能直接關閉
docker run -it --name Node2 --network MyNet2 --ip 172.20.0.11 ubuntu
使用
--ip
參數可以指定容器IP位址, 但必須是在自定義網橋上, 預設的bridge模式不支援.
同一網橋上的容器是可以互通的.
- 不同網橋的容器通信
在
MyNet1
中運作新容器, 由于
MyNet1
沒有使用自定義模式, 不需要指定
IP
docker run -it --name Node3 --network MyNet1 ubuntu
docker run -it --name Node4 --network MyNet1 ubuntu
MyNet1
中的
Node3
和
Node4
屬于同一網絡, 互相可以聯通.
但與
Node1
和
Node2
不在同一網絡中, 互相不能聯通.
- 不同網絡
和MyNet1
實作通信MyNet2
##為Node1添加一塊MyNet1的網卡
docker network connect MyNet1 Node1
##進入容器
docker container attach vm1
ip addr
##可以連通Node3和Node4了
Docker容器通信
容器之間除了使用
IP
通信外, 還可以使用容器名稱通信,
Docker 1.10
開始, 内嵌了一個
DNS server
,
dns
解析功能必須在自定義網絡中使用, 啟動容器時使用 --name 參數指定容器名稱.
Joined容器方式通信
docker run -it --name Node1 --network MyNet1 ubuntu
docker run -it --name Node2 --network container:Node1 ubuntu
處于這個模式下的
Docker
容器會共享一個網絡棧, 這樣兩個容器之間可以使用
localhost
高效快速通信.
Link連結方式通信
--link
可以用來連結2個容器
docker run -it --name Node1 ubuntu
docker run -it --name Node2 --link Node1:web ubuntu
##都可以ping通,上面設定了Node1的别名為web
ping vm1
ping web
##可以看到自動設定了解析
cat /etc/hosts
外網如何通路容器
- 外網通路容器用到了
和docker-proxy
iptables DNAT
- 主控端通路本機容器使用的是
iptables DNAT
- 外部主機通路容器或容器之間的通路是
實作docker-proxy
docker-proxy
和
DNA
T實作了雙備援, 隻要其中一個存在都可以實作從外網通路容器
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN3QmMzITOiNzNykDMhFGOyUGZ4EmY2ITOwMGNhBDN58CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
跨主機容器網絡
跨主機網絡解決方案
-
原生的Docker
和overlay
macvlan
- 第三方的
,flannel
,weave
calico
衆多網絡方案是如何與
Docker
內建在一起的
- 采用
這一libnetwork
容器網絡庫Docker
- CNM (Container Network Model)這個模型對容器網絡進行了抽象
CNM分三類元件
- Sandbox: 容器網絡棧,包含容器接口,
, 路由表DNS
- Endpoint: 作用是将
接入Sandbox
Network
- Network: 包含一組
,同一endpoint
的Network
可以通信endpoint
Macvlan網絡方案實作
特點
- 是
提供的一種網卡虛拟化技術.Linux kernel
- 無需
, 直接使用實體接口, 性能極好.Linux bridge
- 無需
和端口映射NAT
- 會獨占主機網卡 但可以通過子接口進行設定
操作流程
- 首先在實驗用虛拟機上增加新的一塊網卡
- 打開網卡混雜模式
[[email protected] docker]# ip link set eth1 promisc on
[[email protected] docker]# ip addr show
[[email protected] docker]# ip link set up eth1
[[email protected] docker]# ip addr show
[[email protected] docker]# docker network create -d macvlan --subnet 10.0.0.00/24 --gateway 10.0.0.1 -o parent=eth1 MacVlan
[[email protected] docker]# docker network ls
NETWORK ID NAME DRIVER
SCOPE42c1b23d732f MacVlan1 macvlan
locala1fc6d2b4881 bridge bridge
locala8e736a43b65 host host
local1cea84391117 none null
local
[[email protected] docker]# docker run -it --name Node1 --network MacVlan1 --ip 10.0.0.10 busybox:latest
/ #
##在Server1進行同樣的操作後進行聯通測試
/ # ping 10.0.0.10PING 10.0.0.10 (10.0.0.10):
56 data bytes64 bytes from 10.0.0.10: seq=0 ttl=64 time=0.611 ms
64 bytes from 10.0.0.10: seq=1 ttl=64 time=1.349 ms
64 bytes from 10.0.0.10: seq=2 ttl=64 time=1.278 ms
64 bytes from 10.0.0.10: seq=3 ttl=64 time=1.131 ms
--- 10.0.0.10 ping statistics ---4 packets transmitted, 4 packets received, 0% packet lossround-trip min/avg/max = 0.611/1.092/1.349 ms
可以看出,
macvlan
方式确實做到了外部主機互相連接配接
macvlan
會獨占主機網卡,但是可以使用
vlan
子接口實作多
macvlan
網絡
vlan
可以将實體二層網絡劃分為4094個邏輯網絡并彼此隔離.
是以
vlan id
的取值為
1
-
4094
[[email protected] docker]# docker network create -d macvlan --subnet 20.0.0.00/24 --gateway 20.0.0.1 -o parent=eth1.1 MacVlan
2831f365c16bf92878c1bd31caba449e230ae0149be66e7f9915e3b0dd854c7cd
[[email protected] docker]# docker run -it --name Node2 --network MacVlan2 --ip 20.0.0.11 busybox:latest
Macvlan網絡間的隔離和連通
-
網絡在二層上是隔離的,是以不同macvlan
網絡的容器時不能互相通信的macvlan
- 可以在三層上通過網關将
連通起來macvlan
-
本身不做任何限制,像傳統Docker
網絡那樣管理即可vlan