基本網絡配置、自定義網絡、容器通信
- 一、Docker原生網絡
-
- 1.bridge網絡
- 2.host模式
- 3.none網絡
- 二、Docker自定義網絡
-
- 1.簡介
- 2.自定義網橋
- 3.自定義網段
- 三、Docker容器通信
-
- 1.–link可以用來連結2個容器
-
- 容器如何通路外網是通過iptables的SNAT實作的
- 2.外網如何通路容器
- 四、跨主機容器網絡
-
- 1.在兩台docker主機上各添加一塊網卡,打開網卡混雜模式:
- 2.配置網卡
- 3.在兩台docker主機上各建立macvlan網絡:
- 五、總結
一、Docker原生網絡
-
docker的鏡像是令人稱道的地方,但網絡功能還是相對薄弱的
部分。
- docker安裝後會自動建立3種網絡:bridge、host、none
- 可以使用以下指令檢視:
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[email protected] ~]# docker run -d --name demo nginx
420b622af5e1a25b79b7ac31acc269bb3b5bca1ce0c4e583b176de9487667138
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
420b622af5e1 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp demo
1.bridge網絡
- docker安裝時會建立一個名為 docker0 的Linux bridge,建立的容器會自動橋接到這個接口。
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結 - bridge模式下容器沒有一個公有ip,隻有主控端可以直接通路,外部主機是不可見的,但容器通過主控端的NAT規則後可以通路外網
2.host模式
- host模式可以讓容器共享主控端網絡棧,這樣的好處是外部主機與容器直接通信,但是容器的網絡缺少隔離性。host網絡模式需要在容器建立時指定–network=host
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[[email protected] ~]# docker run -d --name demo --network=host nginx
c59841230be3d8b6ba7f1c1c67b02efadab2a7ecaa2e4c869d308795579db376
[[email protected] ~]# brctl show
3.none網絡
- none模式是指禁用網絡功能,隻有lo接口,在容器建立時使用 --network=none指定。
- Container 網絡模式是 Docker 中一種較為特别的網絡的模式。在容器建立時使用–network=container:vm1指定。(vm1指定的是運作的容器名)
-
處于這個模式下的 Docker 容器會共享一個網絡棧,這樣兩個
容器之間可以使用localhost高效快速通信。
[[email protected] ~]# yum install -y bridge-utils
[[email protected] ~]# brctl show
[[email protected] ~]# docker run -d --name demo nginx
[[email protected] ~]# docker rm -f demo
demo
[[email protected] ~]# brctl show
二、Docker自定義網絡
1.簡介
- 自定義網絡模式,docker提供了三種自定義網絡驅動:
- bridge
- overlay
- macvlan
- bridge驅動類似預設的bridge網絡模式,但增加了一些新的功能,overlay和macvlan是用于建立跨主機網絡。
-
建議使用自定義的網絡來控制哪些容器可以互相通信,還可
以自動DNS解析容器名稱到IP位址。
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[[email protected] ~]# docker network create mynet1
11f2c2d1a87e36ef83728c22549c225b817564fb2537eac6d4d0170078b36779
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1742bfd1d359 bridge bridge local
c5342bf3f5ed host host local
11f2c2d1a87e mynet1 bridge local
15130254f68b none null local
[[email protected] ~]# docker inspect demo
[[email protected] ~]# docker run -d --name demo1 --network=mynet1 game2048
3be27a3ab248e78a4f349452a9eab7b23bbf49856d01da656d319b96c78f71a3
2.自定義網橋
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aea56af23f3 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes demo
[[email protected] ~]# docker network create mynet1
757f35b459e6c2900caa6254f0f7245e6551157f20e2ef1be6efb40913167a63
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fc9a888df2b3 bridge bridge local
4c94aee4e765 harbor_harbor bridge local
af758bd837cc harbor_harbor-chartmuseum bridge local
69dc4aefc8dd harbor_harbor-clair bridge local
c6abd970defd harbor_harbor-notary bridge local
fde416c81c9f harbor_notary-sig bridge local
8f2f908b8ad4 host host local
757f35b459e6 mynet1 bridge local
88f88be8be8b none null local
[[email protected] ~]# docker inspect demo
[[email protected] ~]# docker run -it --rm --network=mynet1 nginx
[[email protected] ~]# docker run -it --rm --network=mynet1 busybox
[[email protected] ~]# docker stop demo
demo
[[email protected] ~]# docker stop demo1
demo2
[[email protected] ~]# docker start demo1
demo2
[[email protected] ~]# docker start demo
demo
3.自定義網段
[[email protected] ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 net1
[[email protected] ~]# docker network ls
6009d43a932a net1 bridge local
[[email protected] ~]# docker inspect net1
"Subnet": "172.20.0.0/24",
"Gateway": "172.20.0.1"
[[email protected] ~]# ip addr
三、Docker容器通信
- 容器之間除了使用ip通信外,還可以使用容器名稱通信。
- docker 1.10開始,内嵌了一個DNS server。
- dns解析功能必須在自定義網絡中使用。
- 啟動容器時使用 --name 參數指定容器名稱。
1.–link可以用來連結2個容器
- -link 可以用來連結2個容器。
- -link的格式:
-
-link :alias
name和id是源容器的name和id,alias是源容器在link下的别名。
容器如何通路外網是通過iptables的SNAT實作的
[[email protected] ~]# docker load -i nginx.tar
d0f104dc0a1f: Loading layer 72.49MB/72.49MB
0338db614b95: Loading layer 64.31MB/64.31MB
a4d893caa5c9: Loading layer 3.072kB/3.072kB
22ea89b1a816: Loading layer 4.096kB/4.096kB
550333325e31: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
[[email protected] ~]# docker run -d --name demo nginx
[[email protected] ~]# docker run -it --rm --link demo:nginx busybox
[[email protected] ~]# docker run -d --name demo2 nginx
[[email protected] ~]# docker stop demo
demo
[[email protected] ~]# docker inspect demo2
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
[[email protected] ~]# docker start demo
demo
[[email protected] ~]# docker inspect demo
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
2.外網如何通路容器
端口映射
-p 選項指定映射端口
- 外網通路容器用到了docker-proxy和iptables DNAT
- 主控端通路本機容器使用的是iptables DNAT
- 外部主機通路容器或容器之間的通路是docker-proxy實作
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[email protected] ~]# docker run -d --name demo1 -p 8080:8080 nginx
b8ee081228936bdc317062e225317d94d2d7d983b9fae7c14e7577f0cf3c2117
[[email protected] ~]# iptables -t nat -nL
[[email protected] ~]# cd /etc/docker/
[[email protected] docker]# ls
certs.d daemon.json key.json
[[email protected] docker]# vim daemon.json
[[email protected] docker]# systemctl reload docker
[[email protected] docker]# docker pull radial/busyboxplus
[[email protected] docker]# docker tag radial/busyboxplus:latest busyboxplus:latest
[[email protected] docker]# docker rmi radial/busyboxplus
[[email protected] docker]# docker images
[[email protected] docker]# docker run -it --rm busyboxplus
[[email protected] docker]# curl localhost:8080
curl: (7) Failed connect to localhost:8080; Connection refused
[[email protected] ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
四、跨主機容器網絡
跨主機容器網絡
- 跨主機網絡解決方案
- docker原生的overlay和macvlan
- 第三方的flannel、weave、calico
- 衆多網絡方案是如何與docker內建在一起的
- libnetwork docker容器網絡庫
- CNM (Container Network Model)這個模型對容器網絡進行了抽象
- CNM分三類元件
- Sandbox:容器網絡棧,包含容器接口、dns、路由表。(namespace)
- Endpoint:作用是将sandbox接入network (veth pair)
- Network:包含一組endpoint,同一network的endpoint可以通信。
- macvlan網絡方案實作
- LInux kernel提供的一種網卡虛拟化技術。
- 無需Linux bridge,直接使用實體接口,性能極好。
1.在兩台docker主機上各添加一塊網卡,打開網卡混雜模式:
2.配置網卡
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# ls
[[email protected] network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[[email protected] network-scripts]# vim ifcfg-eth1
[[email protected] network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
[[email protected] ]# ip link set eth1 promisc on #打開混雜模式
[[email protected] ]# ip addr show eth1
[[email protected] ]# ip link set eth1 promisc on
3.在兩台docker主機上各建立macvlan網絡:
[[email protected] ]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway=172.21.0.1 -o parent=eth1 macvlan1
[[email protected] ]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway=172.21.0.1 -o parent=eth1.1 macvlan2
[[email protected] ]# docker run -it --rm --network macvlan1 --ip 172.21.0.11 busybox
[[email protected] ]# docker run -it --rm --network macvlan1 --ip 172.21.0.12 busybox
[[email protected] harbor]# docker run -it --rm --network macvlan2 --ip 172.22.0.21 busybox
/ # ping 172.22.0.22
[[email protected] docker]# docker run -it --rm --network macvlan2 --ip 172.22.0.22 busybox
- macvlan網絡間的隔離和連通
- macvlan網絡在二層上是隔離的,是以不同macvlan網絡的容器是不能通信的。
- 可以在三層上通過網關将macvlan網絡連通起來。
- docker本身不做任何限制,像傳統vlan網絡那樣管理即可。
五、總結
- 主要講解了docker各種網絡模型的配置與實作,并從ip管理、隔離、性能等方面做了對比。
docker network子指令
connect 連接配接容器到指定網絡
create 建立網絡
disconnect 斷開容器與指定網絡的連接配接
inspect 顯示指定網絡的詳細資訊
ls 顯示所有網絡
rm 删除網絡