Docker 容器網絡


默認網絡

當安裝docker時,它會自動創建3個網絡。可以使用docker network ls 來查看。
 
zane@zane-V:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4b10534b40ff        bridge              bridge              local               
7dbe50e049ea        host                host                local                          
08bfed547b1e        none                null                local
當運行容器的時候,可以指定容器使用哪個網絡,用--network 參數。
 
bridge網絡代表的是出現在ifconfig 中的 docker0. 除非你使用docker run --network=<>來指定使用的網絡,
否則都會使用這個默認的bridge網絡。
 
zane@zane-V:~$ ifconfig
 
docker0   Link encap:以太網  硬件地址 02:42:dc:06:cb:3c 
          inet 地址:172.17.0.1  廣播:0.0.0.0  掩碼:255.255.0.0
          inet6 地址: fe80::42:dcff:fe06:cb3c/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  躍點數:1
          接收數據包:47395 錯誤:0 丟棄:0 過載:0 幀數:0
          發送數據包:49555 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 發送隊列長度:0
          接收字節:1932484 (1.9 MB)  發送字節:156709338 (156.7 MB)

 

可以查看默認網絡,檢查默認網絡,但是不能刪除默認網絡。可以增加自己定義的網絡,這些在你長時間不用可以刪除的。
我們先來看看默認bridge網絡,然后再學習如何創建自己的網絡。
 
默認bridge網絡細節

 
默認bridge網絡存在於所有的docker主機。docker network inspect 命令返回關於網絡的信息:
zane@zane-V:~$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "4b10534b40ffa1d92610668060d8b831079a213f81f82c4f97f71ed1eb54b441",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

 

docker引擎自動創建子網絡和路由。docker run 命令自動添加新的容器到這個網絡。
zane@zane-V:~$ docker run -itd --name=container1 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
557a0c95bfcd: Pull complete
Digest: sha256:ae007bdb45fc0d56e3d705b97640ac24844bcc9ce4c8b8493f216a57ab6af0d5
Status: Downloaded newer image for busybox:latest
72b7379b7d426f4bab0a41a83643da3e2a40ed38f976154a413b914326af330b
zane@zane-V:~$ docker run -itd --name=container2 busybox
e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63
創建兩個容器之后再次檢測網絡,會顯示新的容器在這個默認bridge網絡中:
 
zane@zane-V:~$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "4b10534b40ffa1d92610668060d8b831079a213f81f82c4f97f71ed1eb54b441",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "72b7379b7d426f4bab0a41a83643da3e2a40ed38f976154a413b914326af330b": {
                "Name": "container1",
                "EndpointID": "63adfc2048157821ef74c5ff7220053d47df2e34042a93938fb9d653188bf121",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63": {
                "Name": "container2",
                "EndpointID": "0a2d00f6688b36431e8338583ae30d8d23451dc42b8edc058c3622d3e5a51aef",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
容器使用ip地址和其他的容器通訊。docker不支持自動發現服務,在默認bridge網絡中。
如果你想使用容器的名稱來通訊,你必須通過 docker run --link 選項。
 
你可以連接一個正在運行的容器,然后檢查它的配置文件:
zane@zane-V:~$ docker attach container1
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02 
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:37 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5031 (4.9 KiB)  TX bytes:648 (648.0 B)
 
lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
/ # whoami
root
/ # uname -a
Linux 72b7379b7d42 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 GNU/Linux
/ # exit
zane@zane-V:~$
注意:上面的exit 會使整個container1 停止。而不是想象中的退出了這個shell。
 
重啟container1,看看能不能和上面的container2相通:
zane@zane-V:~$ docker attach container1
/ # ping -w3 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.071 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.045 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.047 ms
 
--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.045/0.054/0.071 ms
退出剛剛的連接,使container1繼續運行着,使用 Ctrl -p + ctrl -q 。
 
橋接網路

 
用戶創建定義的最簡單的網絡就是一個橋接網路。這個網路和默認的docker0網絡相似。
 
zane@zane-V:~$ docker network create --driver bridge isolated_nw
6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe
zane@zane-V:~$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
zane@zane-V:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4b10534b40ff        bridge              bridge              local               
7dbe50e049ea        host                host                local               
6e9792814d7e        isolated_nw         bridge              local               
c741cdd168b0        my-bridge-network   bridge              local               
08bfed547b1e        none                null                local 

 

當你創建了一個網絡,可以啟動容器並使用這個網絡。通過docker run --network=<NETWORK>選項。
zane@zane-V:~$ docker run --network=isolated_nw -itd --name=container3 busybox
ff22003c26acb64fb7b867b4cbaeb96ebf7b11765a2623379c82aa33182de026
zane@zane-V:~$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "ff22003c26acb64fb7b867b4cbaeb96ebf7b11765a2623379c82aa33182de026": {
                "Name": "container3",
                "EndpointID": "7bea487483d2e4a4d1e7eba08b58a596df884e738b0a5d5219abfa57ebefc89e",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

 

在同一個網絡中的容器可以立刻相互通信。雖然這個網絡本身與其他網絡中的容器 是隔離的。

 

 
在用戶自己定義的bridge網絡,linking 是不支持的。你可以給網絡中容器開放一個公共的容器端口。
如果你想使橋接網絡的一部分可用於外部網絡,這將是非常有用的。

 

如果你想在單一主機上運行一個相對小的網絡,使用橋接網絡是有效果的。
 
然而你想創建一個顯著的大 網絡,可以通過overlay 網絡來實現。
 
docker_gwbridge 網絡

 
docker在兩種情況下回自動創建一個本地的橋接網絡,docker_gwbridge:
  • 當你初始化或者加入一個swarm,Dcoker會創建docker_gwbridge.
    • 並使用它作為 不同主機的swarm 節點通訊網絡。
  • 當沒有一個容器網絡可以提供與外部的連接,
    • Docker將容器連接到docker_gwbridge網絡以及容器的其他網絡,
    • 以便容器可以連接到外部網絡或其他swarm節點。
如果需要自定義配置,你可以提前創建一個docker_gwbridge.除此之后,在有需求的時候才創建它。
 
下面的例子通過一些自定義的選項來創建docker_gwbridge:
zane@zane-V:~$ docker network create --subnet 172.30.0.0/16 \
> --opt com.docker.network.bridge.name=docker_gwbridge \
> --opt com.docker.network.bridge.enable_icc=false \
> docker_gwbridge
689e4d893ca525c9e6765abbbe65d68f40ce2bca9592cf6c2b147b06647f8354 
當您使用overlay網絡時,docker_gwbridge網絡總是存在。
 
Docker swarm模式的overlay網絡

你可以在一個運行swarm 模式的,管理節點中創建一個overlay網絡,而不是使用外部鍵值存儲。
該swarm使overlay網絡僅對swarm中需要服務的節點可用。
當你創建一個使用overlay網絡的服務,管理節點自動擴展overlay網絡到那個運行服務任務的節點中。
 
下面的示例顯示如何創建網絡並將其用於來自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

 

具有額外鍵值存儲的overlay網絡

 
如果你在swarm 模式下沒有使用Docker 引擎,overlay網絡需要一個有效的鍵值存儲服務。
支持鍵值存儲的包括Consul,Etcd,ZooKeeper。在這個版本的引擎中創建網絡之前,必須安裝和配置你選擇的鍵值存儲服務。
 
注意:在Doker 引擎中運行swarm 模式,和使用其他鍵值存儲的網絡是不兼容的。
 

 

網絡中的每台主機必須運行着Docker 引擎的實例。
這簡單的方式就是提供的主機都是Docker 主機.

 

應該在每台主機上開放下面的端口:
 
在創建overlay 網絡前,你需要在docker daemon中配置一些選項。
Option Description
--cluster-store=PROVIDER://URL
Describes the location of the KV service.
--cluster-advertise=HOST_IP|HOST_IFACE:PORT
The IP address or interface of the HOST used for clustering.
--cluster-store-opt=KEY-VALUE OPTIONS
Options such as TLS certificate or tuning discovery Timers
在swarm中的一台機器上創建overlay 網絡
$ docker network create --driver overlay my-multi-host-network

 

這會使得單一網絡跨越多個主機。overlay網絡為容器提供完全的隔離
之后在每台主機,創建容器的時候確定指定了網絡的名字。
 
$ docker run -itd --network=my-multi-host-network busybox

 

 
每次連接,每個容器都可以和網絡中的所有容器相連而不管這些容器是哪個Docker 主機創建的。
 
定制網絡插件

只要你想,你可以寫自己的網絡驅動插件。
 
總結

 
  • 一般容器使用ip地址通訊,也可以使用容器名稱進行通信,但必須制定參數
    • docker run --link
  • 連接到正在運行的容器中
    • docker attach container1
    • 注意:誤退出容器
      • 在容器shell 界面 的exit 會導致容器停止,而不是僅僅退出shell
      • 正常退出可以使用 ctr -p + ctr -q 
  • 同一網絡中的容器可以通信,與其他網絡中的容器隔離
  • 開放共同端口,用於在橋接模式下,本地主機容器與外部主機容器通信
  • docker_gwbridge 用於與外部網絡連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM