Docker 網絡命令


  • docker network create
  • docker network connect
  • docker network ls 
  • docker network rm
  • docker network disconnect
  • docker network inspect
 
創建網絡
 
zane@zane-V:~$ docker network create simple-network
8bf58f43c56622d1100f7da9ef6506e45a4aa68556b586311f3756130c311d75
zane@zane-V:~$ docker network inspect simple-network
[
    {
        "Name": "simple-network",
        "Id": "8bf58f43c56622d1100f7da9ef6506e45a4aa68556b586311f3756130c311d75",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
 
不像bridge網絡,直接可以創建。創建overlay網絡需要一些條件,比如:
  • 進入一個鍵值存儲。引擎支持Consul,Etcd,ZooKeeper.
  • 與鍵值存儲連接的主機集群。
  • 在群集中的每個主機上正確配置的deamon引擎
 
支持overlay網絡的docker選項:
  • --cluster-store
  • --cluster-store-opt
  • --cluster-advertise
 
使用--subnet選項直接指定子網絡,在bridge網絡中只可以指定一個子網絡,而在overlay網絡中支持多個子網絡。
除了--subnet,還可以指定:--gateway,--ip-range,--aux-address選項。
$ docker network create -d overlay \
--subnet=192.168.0.0/16 \
--subnet=192.170.0.0/16 \
--gateway=192.168.0.100 \
--gateway=192.170.0.100 \
--ip-range=192.168.1.0/24 \
--aux-address="my-router=192.168.1.5"
--aux-address="my-switch=192.168.1.6" \
--aux-address="my-printer=192.170.1.5"
--aux-address="my-nas=192.170.1.6" \
my-multihost-network

 

如何要創建自己定制的網絡,docker也是支持很多選項的。
可以指定網絡的端口號:
$ docker run -d -P --name redis --network my-network redis
bafb0c808c53104b2c90346f284bda33a69beadcab4fc83ab8f2c5a4410cd129
 
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bafb0c808c53 redis "/entrypoint.sh redis" 4 seconds ago Up 3 seconds 172.23.0.1:32770->6379/tcp redis

 

連接容器

可以連接已存在的容器到一個或者多個網絡中。一個容器可以連接到多個不同網絡驅動的網絡中。
當連接一旦建立,容器便可以可其他的容器通訊,通過IP 或者 容器名稱。
 
基本容器網絡實例:
1.創建兩個容器,container1 和 container2
 
$ docker run -itd --name=container1 busybox
18c062ef45ac0c026ee48a83afa39d25635ee5f02b58de4abc8f467bcaa28731
 
$ docker run -itd --name=container2 busybox
498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152
2.創建一個隔離,bridge網絡來測試
zane@zane-V:~$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
a8208641505d2d8fc37bf7cbd1027c01f0def461815786e076ef4ae65b7b2f9b

 

3.連接container2到這個網絡,然后驗證一下:
 
zane@zane-V:~$ docker network connect isolated_nw container2
 
zane@zane-V:~$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "a8208641505d2d8fc37bf7cbd1027c01f0def461815786e076ef4ae65b7b2f9b",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.25.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63": {
                "Name": "container2",
                "EndpointID": "ef7244d32484407c3ec4aa30b7bdb0a6cbe3dbbfedc03e5c856ad20a08af172f",
                "MacAddress": "02:42:ac:19:00:02",
                "IPv4Address": "172.25.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

 

注意container2,自動分配到了IP地址。此時container1,仍然連接在默認的bridge網絡。
 
4.啟動第三個container,但是這是使用--ip 選項指定它的IP地址,
zane@zane-V:~$ docker run --network=isolated_nw --ip=172.25.3.3 -itd --name=container3 busybox
adf68dd9e09c101e507e2106901d25270f71375f07ac7f61db21707c27075c0d
 
5.檢查container3使用的是哪個網絡:
 "Networks": {
                "isolated_nw": {
                    "IPAMConfig": {
                        "IPv4Address": "172.25.3.3"
                    },
                    "Links": null,
                    "Aliases": [
                        "adf68dd9e09c"
                    ],
                    "NetworkID": "a8208641505d2d8fc37bf7cbd1027c01f0def461815786e076ef4ae65b7b2f9b",
                    "EndpointID": "71d5d272d056b6111a83f0843a10d1944f1648f34d5099258d5865d053a939b0",
                    "Gateway": "172.25.0.1",
                    "IPAddress": "172.25.3.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:19:03:03"
                }
            }
        }

 

6.檢查container2使用的是哪個網絡:
"Networks": {
                "isolated_nw": {
                    "Aliases": [
                        "e9bce535ae32"
                    ],
                    "EndpointID": "ef7244d32484407c3ec4aa30b7bdb0a6cbe3dbbfedc03e5c856ad20a08af172f",
                    "Gateway": "172.25.0.1",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "IPAMConfig": {},
                    "IPAddress": "172.25.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "Links": null,
                    "MacAddress": "02:42:ac:19:00:02",
                    "NetworkID": "a8208641505d2d8fc37bf7cbd1027c01f0def461815786e076ef4ae65b7b2f9b"
                }
            },
 
 
注意:container2 在兩個網絡中間,它加入了默認bridge網絡,當你在創建它的時候,然后又連接它到了isolation_nw.
 
一個容器可以連接到多個網絡中

 

 
7.使用docker attach 命令連接一個正在運行的容器,然后查看
 
zane@zane-V:~$ docker attach container2
/ # ifconfig -a
eth1      Link encap:Ethernet  HWaddr 02:42:AC:19:00:02 
          inet addr:172.25.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe19:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:86 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:11780 (11.5 KiB)  TX bytes:648 (648.0 B)
 
eth2      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03 
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23 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:3809 (3.7 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)
8.可以通過容器名稱來相互連接
/ # ping -w 4 container3
PING container3 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.077 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.049 ms
64 bytes from 172.25.3.3: seq=2 ttl=64 time=0.047 ms
64 bytes from 172.25.3.3: seq=3 ttl=64 time=0.054 ms

 

但是注意:默認bridge網絡中是不支持容器名稱通信的:
雖然container1 和 container2 都在bridge網絡中,但是他們是不支持 容器名稱通信的。
但是肯定支持IP地址通信。
 
zane@zane-V:~$ docker attach container2
/ # ping container3
PING container3 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.042 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.050 ms
64 bytes from 172.25.3.3: seq=2 ttl=64 time=0.063 ms
^C
--- container3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.042/0.051/0.063 ms
 
/ # ping -w 4 container1
ping: bad address 'container1'
 
/ # ping -w 4 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.104 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.052 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.127 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.057 ms
 
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.052/0.085/0.127 ms

 

注意退出attach 時,使用ctr-p + ctr-q.
如果使用ctr-d 則會stop container.
 
9.此時container3是不能通過ip地址和container1通信的。
zane@zane-V:~$ docker attach container3
/ # ping -w 4 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
 
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

 

鏈接容器而不使用用戶定義的網絡

上面的實驗我們知道,用戶自定義的網絡,是可以相互解析容器名的,也就是可以用容器名來相互同行。
而默認網絡中是不可以的。那如果想讓默認網絡中,也可以使用容器名進行通信呢?
 
使用link的特性。這是唯一推薦使用link的場景。應該使用自定義的網絡來替代它的。
 
在默認網絡中使用link增加了一下特性:
  • 解析容器名到IP地址
  • 定義網絡別名
    • --link=CONTAINER-NAME:ALIAS
  • 增強網絡連接的安全性
  • 環境變量注入
 
斷開容器連接

1.斷開container2和isolated_nw的連接,然后 
zane@zane-V:~$ docker network disconnect isolated_nw container2

 

 
2.刪除網絡
zane@zane-V:~$ docker network rm simple-network
simple-network

 

 
總結

 
  • 創建網絡
    • docker network create simple-network
    • overlay網絡條件
      • 進入一個鍵值存儲
      • 與鍵值存儲連接的主機集群
      • 在集群中每個主機上正確配置deamon引擎
    • 支持overlay網絡的docker選項
      • --cluser-store
      • --cluster-store-opt
      • --cluster-advertise
    • 指定子網絡,網關,地址范圍
  • 將容器添加到網絡中
    • docker network connect isolated_nw container2
    • 一個容器可以連接到多個網絡中
  • 連接一個正在運行的容器
    • docker attach
    • attach 的退出
      • ctr p + ctr q
  • 默認bridge網絡不支持,容器名稱通信,其他網絡支持;
    • 使用link 來支持默認網絡的容器名稱通信
  • 斷開連接
    • docker network disconnect isolated_nw container2
  • 刪除網絡
    • docker network rm simple-network
  • 檢測網絡
    • docker network inspect isolated_nw
 
 
 
 
 
 
 
 


免責聲明!

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



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