天天看點

運維實戰 容器部分 Docker網絡原生網絡模式Docker自定義網絡Docker容器通信跨主機容器網絡

運維實戰 容器部分 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實作了雙備援, 隻要其中一個存在都可以實作從外網通路容器

運維實戰 容器部分 Docker網絡原生網絡模式Docker自定義網絡Docker容器通信跨主機容器網絡

跨主機容器網絡

跨主機網絡解決方案

  • Docker

    原生的

    overlay

    macvlan

  • 第三方的

    flannel

    ,

    weave

    ,

    calico

衆多網絡方案是如何與

Docker

內建在一起的

  • 采用

    libnetwork

    這一

    Docker

    容器網絡庫
  • CNM (Container Network Model)這個模型對容器網絡進行了抽象

CNM分三類元件

  • Sandbox: 容器網絡棧,包含容器接口,

    DNS

    , 路由表
  • Endpoint: 作用是将

    Sandbox

    接入

    Network

  • Network: 包含一組

    endpoint

    ,同一

    Network

    endpoint

    可以通信
運維實戰 容器部分 Docker網絡原生網絡模式Docker自定義網絡Docker容器通信跨主機容器網絡

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

    網絡那樣管理即可