天天看點

13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

基本網絡配置、自定義網絡、容器通信

  • 一、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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

二、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

           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[email protected] ~]# docker stop demo
demo
[[email protected] ~]# docker stop demo1
demo2
[[email protected] ~]# docker start demo1
demo2
[[email protected] ~]# docker start demo
demo
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

三、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實作的

13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[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",

           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

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

           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[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

           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[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>
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結

四、跨主機容器網絡

跨主機容器網絡

  • 跨主機網絡解決方案
    • 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可以通信。
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
  • macvlan網絡方案實作
    • LInux kernel提供的一種網卡虛拟化技術。
    • 無需Linux bridge,直接使用實體接口,性能極好。

1.在兩台docker主機上各添加一塊網卡,打開網卡混雜模式:

13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
[[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
           
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
13.Docker(四)-----網絡(基本網絡配置、自定義網絡、容器通信)一、Docker原生網絡二、Docker自定義網絡三、Docker容器通信四、跨主機容器網絡五、總結
  • macvlan網絡間的隔離和連通
    • macvlan網絡在二層上是隔離的,是以不同macvlan網絡的容器是不能通信的。
    • 可以在三層上通過網關将macvlan網絡連通起來。
    • docker本身不做任何限制,像傳統vlan網絡那樣管理即可。

五、總結

  • 主要講解了docker各種網絡模型的配置與實作,并從ip管理、隔離、性能等方面做了對比。
docker network子指令
connect		連接配接容器到指定網絡
create			建立網絡
disconnect	斷開容器與指定網絡的連接配接
inspect		顯示指定網絡的詳細資訊
ls			顯示所有網絡
rm			删除網絡
           

繼續閱讀