1. 程式人生 > >Docker學習筆記七:Docker網路

Docker學習筆記七:Docker網路

網路配置

安裝Docker預設自動建立三個網路:

$ docker network ls

NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host

Docker 容器預設執行在bridge網路。預設的bridge不支援自動服務發現,因此基於容器名或者期望的/etc/hosts ping將會失敗,但是自定義的bridge網路支援自動服務發現,可以基於容器名的ping。如果想在預設的bridge支援名稱和IP的互聯互通,可以使用docker run --link

命令。

自定義bridge網路

$ docker network create simple-network

69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a

$ docker network inspect simple-network
[
    {
        "Name": "simple-network",
        "Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a",
        "Scope"
: "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.22.0.0/16", "Gateway": "172.22.0.1/16" } ] }, "Containers": {}, "Options"
: {} } ] $ docker network ls NETWORK ID NAME DRIVER 9f904ee27bf5 none null cf03ee007fb4 host host 7fca4eb8c647 bridge bridge c5ee82f76de3 isolated_nw bridge

使用docker run --network=<NETWORK>選項在自定義網路啟動容器:

$ docker run --network=isolated_nw -itd --name=container3 busybox

8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c

$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {
            "8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c": {
                "EndpointID": "93b2db4a9b9a997beb912d28bcfc117f7b0eb924ff91d48cfa251d473e6a9b08",
                "MacAddress": "02:42:ac:15:00:02",
                "IPv4Address": "172.21.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]

使用Docker Engine swarm模式的覆蓋網路

在swarm模式的管理節點建立的覆蓋網路僅對叢集中需要服務的節點可用,建立使用覆蓋網路時,管理節點會自動將覆蓋網路擴充套件到執行服務任務的節點。

建立覆蓋網路並應用到swarm中管理節點的服務:

# Create an overlay network `my-multi-host-network`.
$ docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  my-multi-host-network

400g6bwzd68jizzdx5pgyoe95

# Create an nginx service and extend the my-multi-host-network to nodes where
# the service's tasks run.
$ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx

716thylsndqma81j6kkkb5aus

用於swarm的覆蓋網路對於以docker run啟動而不是叢集一部分的容器不可用。

建立一個swarm叢集

1.建立一個swarm主:

 $ docker-machine create \
 -d virtualbox \
 --swarm --swarm-master \
 --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
 --engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
 --engine-opt="cluster-advertise=eth1:2376" \
 mhs-demo0

2.建立另外一臺主機,並將其加入到swarm叢集:

 $ docker-machine create -d virtualbox \
     --swarm \
     --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
     --engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
     --engine-opt="cluster-advertise=eth1:2376" \
   mhs-demo1

3.檢視機器,並確定所有主機已經啟動並執行:

$ docker-machine ls

 NAME         ACTIVE   DRIVER       STATE     URL                         SWARM
 default      -        virtualbox   Running   tcp://192.168.99.100:2376
 mh-keystore  *        virtualbox   Running   tcp://192.168.99.103:2376
 mhs-demo0    -        virtualbox   Running   tcp://192.168.99.104:2376   mhs-demo0 (master)
 mhs-demo1    -        virtualbox   Running   tcp://192.168.99.105:2376   mhs-demo0

建立覆蓋網路

1.將docker環境設定為swarm主機:

$ eval $(docker-machine env --swarm mhs-demo0)

使用docker-machine的--swarm標誌將docker命令限制為單獨的swarm資訊。

2.使用docker info命令檢視這個swarm:

 $ docker info

 Containers: 3
 Images: 2
 Role: primary
 Strategy: spread
 Filters: affinity, health, constraint, port, dependency
 Nodes: 2
 mhs-demo0: 192.168.99.104:2376
 └ Containers: 2
 └ Reserved CPUs: 0 / 1
 └ Reserved Memory: 0 B / 1.021 GiB
 └ Labels: executiondriver=native-0.2, kernelversion=4.1.10-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 4187d2c - Wed Oct 14 14:00:28 UTC 2015, provider=virtualbox, storagedriver=aufs
 mhs-demo1: 192.168.99.105:2376
 └ Containers: 1
 └ Reserved CPUs: 0 / 1
 └ Reserved Memory: 0 B / 1.021 GiB
 └ Labels: executiondriver=native-0.2, kernelversion=4.1.10-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 4187d2c - Wed Oct 14 14:00:28 UTC 2015, provider=virtualbox, storagedriver=aufs
 CPUs: 2
 Total Memory: 2.043 GiB
 Name: 30438ece0915

3.建立overlay網路:

 $ docker network create --driver overlay --subnet=10.0.9.0/24 my-net

強烈推薦使用--subnet引數,如果不指定,docker守護程序會自動選擇一個子網,並且可能與已經存在的網路重複。

4.檢測網路正在執行:

 $ docker network ls

 NETWORK ID          NAME                DRIVER
 412c2496d0eb        mhs-demo1/host      host
 dd51763e6dd2        mhs-demo0/bridge    bridge
 6b07d0be843f        my-net              overlay
 b4234109bd9b        mhs-demo0/none      null
 1aeead6dd890        mhs-demo0/host      host
 d0bb78cbe7bd        mhs-demo1/bridge    bridge
 1c0eb8f69ebb        mhs-demo1/none      null

5.一次切換到每個代理並列出網路:

 eval $(docker-machine env mhs-demo0)

 $ docker network ls

 NETWORK ID          NAME                DRIVER
 6b07d0be843f        my-net              overlay
 dd51763e6dd2        bridge              bridge
 b4234109bd9b        none                null
 1aeead6dd890        host                host

 $ eval $(docker-machine env mhs-demo1)

 $ docker network ls

 NETWORK ID          NAME                DRIVER
 d0bb78cbe7bd        bridge              bridge
 1c0eb8f69ebb        none                null
 412c2496d0eb        host                host
 6b07d0be843f        my-net              overlay

在網路上執行一個應用:

1.將您的環境指向swarm主:

 $ eval $(docker-machine env --swarm mhs-demo0)

2.在mhs-demo0例項啟動一個Nginx web服務:

 $ docker run -itd --name=web --network=my-net --env="constraint:node==mhs-demo0" nginx

3.在mhs-demo1例項上執行一個BusyBox例項,並獲取Nginx服務的主頁內容:

 $ docker run -it --rm --network=my-net --env="constraint:node==mhs-demo1" busybox wget -O- http://web

 Unable to find image 'busybox:latest' locally
 latest: Pulling from library/busybox
 ab2b8a86ca6c: Pull complete
 2c5ac3f849df: Pull complete
 Digest: sha256:5551dbdfc48d66734d0f01cafee0952cb6e8eeecd1e2492240bf2fd9640c2279
 Status: Downloaded newer image for busybox:latest
 Connecting to web (10.0.0.2:80)
 <!DOCTYPE html>
 <html>
 <head>
 <title>Welcome to nginx!</title>
 <style>
 body {
         width: 35em;
         margin: 0 auto;
         font-family: Tahoma, Verdana, Arial, sans-serif;
 }
 </style>
 </head>
 <body>
 <h1>Welcome to nginx!</h1>
 <p>If you see this page, the nginx web server is successfully installed and
 working. Further configuration is required.</p>

 <p>For online documentation and support please refer to
 <a href="http://nginx.org/">nginx.org</a>.<br/>
 Commercial support is available at
 <a href="http://nginx.com/">nginx.com</a>.</p>

 <p><em>Thank you for using nginx.</em></p>
 </body>
 </html>
 -                    100% |*******************************|   612   0:00:00 ETA

檢查外部的連通性

連線到多主機網路的容器會自動連線到docker_gwbridge網路。此網路允許容器在其叢集外部具有外部連結。

1.切換環境到swarm代理:

 $ eval $(docker-machine env mhs-demo1)

2.通過列出網路檢視docker_gwbridge網路:

 $ docker network ls

 NETWORK ID          NAME                DRIVER
 6b07d0be843f        my-net              overlay
 dd51763e6dd2        bridge              bridge
 b4234109bd9b        none                null
 1aeead6dd890        host                host
 e1dbd5dff8be        docker_gwbridge     bridge

3.在swarm主上重複1、2步操作:

 $ eval $(docker-machine env mhs-demo0)

 $ docker network ls

 NETWORK ID          NAME                DRIVER
 6b07d0be843f        my-net              overlay
 d0bb78cbe7bd        bridge              bridge
 1c0eb8f69ebb        none                null
 412c2496d0eb        host                host
 97102a22e8d2        docker_gwbridge     bridge

4.檢測Nginx容器的網路介面:

 $ docker exec web ip addr

 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
 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
 22: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
 link/ether 02:42:0a:00:09:03 brd ff:ff:ff:ff:ff:ff
 inet 10.0.9.3/24 scope global eth0
     valid_lft forever preferred_lft forever
 inet6 fe80::42:aff:fe00:903/64 scope link
     valid_lft forever preferred_lft forever
 24: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaMacvlan Network Driver¶
ult
 link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
 inet 172.18.0.2/16 scope global eth1
     valid_lft forever preferred_lft forever
 inet6 fe80::42:acff:fe12:2/64 scope link
     valid_lft forever preferred_lft forever