docker network命令
docker network所有子命令如下:
docker network create
docker network connect
docker network ls
docker network rm
docker network disconnect
docker network inspect
創(chuàng)建網(wǎng)絡
在安裝Docker Engine時會自動創(chuàng)建一個默認的bridge網(wǎng)絡docker0。
此外茶鹃,還可以創(chuàng)建自己的bridge網(wǎng)絡或overlay網(wǎng)絡涣雕。
bridge網(wǎng)絡依附于運行Docker Engine的單臺主機上,而overlay網(wǎng)絡能夠覆蓋運行各自Docker Engine的多主機環(huán)境中闭翩。
創(chuàng)建bridge網(wǎng)絡比較簡單如下:
# 不指定網(wǎng)絡驅(qū)動時默認創(chuàng)建的bridge網(wǎng)絡
docker networkcreatesimple-network
# 查看網(wǎng)絡內(nèi)部信息
docker network inspect simple-network
# 應用到容器時挣郭,可進入容器內(nèi)部使用ifconfig查看容器的網(wǎng)絡詳情
但是創(chuàng)建一個overlay網(wǎng)絡就需要一些前提條件(具體操作請參考Docker容器網(wǎng)絡相關(guān)內(nèi)容):
key-value store(Engine支持Consul、Etcd和ZooKeeper等分布式存儲的key-value store)
集群中所有主機已經(jīng)連接到key-value store
swarm集群中每個主機都配置了下面的daemon參數(shù)
–cluster-store
–cluster-store-opt
–cluster-advertise
然后創(chuàng)建overlay網(wǎng)絡:
# 創(chuàng)建網(wǎng)絡時疗韵,使用參數(shù)`-d`指定驅(qū)動類型為overlay
docker network create-doverlay my-multihost-network
就使用--subnet選項創(chuàng)建子網(wǎng)而言兑障,bridge網(wǎng)絡只能指定一個子網(wǎng),而overlay網(wǎng)絡支持多個子網(wǎng)蕉汪。
在bridge和overlay網(wǎng)絡驅(qū)動下創(chuàng)建的網(wǎng)絡可以指定不同的參數(shù)流译,具體請參考:https://docs.docker.com/engine/userguide/networking/work-with-networks/
連接容器
創(chuàng)建三個容器,分別前兩個使用默認網(wǎng)絡啟動容器肤无,第三個使用自定義bridge網(wǎng)絡啟動先蒋。
然后再將第二個容器添加到自定義網(wǎng)絡。這三個容器的網(wǎng)絡情況如下
第一個容器:只有默認的docker0
第二個容器:屬于兩個網(wǎng)絡——docker0宛渐、自定義網(wǎng)絡
第三個容器:只屬于自定義網(wǎng)絡
說明:通過容器啟動指定的網(wǎng)絡會覆蓋默認bridge網(wǎng)絡docker0竞漾。
# 創(chuàng)建三個容器 conTainer1,container2,container3
dockerrun-itd--name=container1 busybox
dockerrun-itd--name=container2 busybox
# 創(chuàng)建網(wǎng)絡mynet
docker network create -d bridge--subnet 172.25.0.0/16 mynet
# 將容器containerr2連接到新建網(wǎng)絡mynet
docker network connect mynet container2
# 使用mynet網(wǎng)絡來容器container3
dockerrun--net=mynet --ip=172.25.3.3 -itd --name=container3 busybox
# 查看這三個容器的網(wǎng)絡情況
docker network inspect container1# docker0
docker network inspect container2# docker0, mynet
docker network inspect container3# mynet
默認網(wǎng)絡與自定義bridge網(wǎng)絡的差異
默認網(wǎng)絡docker0:網(wǎng)絡中所有主機間只能用IP相互訪問。通過--link選項創(chuàng)建的容器可以對鏈接的容器名(container-name)作為hostname進行直接訪問窥翩。
自定義網(wǎng)絡(bridge):網(wǎng)絡中所有主機除ip訪問外业岁,還可以直接用容器名(container-name)作為hostname相互訪問。
# 進入container2內(nèi)部
docker attach container2
ping-w4container3# 可訪問
ping-w4container1# 不可訪問
ping-w4172.17.0.2# 可訪問container1的IP
# Ctrl+P+Q退出容器寇蚊,讓container2以守護進程運行
默認網(wǎng)絡與自定義bridge網(wǎng)絡在容器連接的差別
在默認網(wǎng)絡中使用link(legency link)笔时,有如下功能:
- 使用容器名作為hostname
- link容器時指定alias:--link=:
- 配合--icc=false隔離性,實現(xiàn)容器間的安全連接
- 環(huán)境變量注入
自定義網(wǎng)絡中使用docker net提供如下功能:
- 使用DNS實現(xiàn)自動化的名稱解析
- 一個網(wǎng)絡提供容器的安全隔離環(huán)境
- 動態(tài)地attach與detach到多個網(wǎng)絡
- 支持與--link選項一起使用仗岸,為鏈接的容器提供別名(可以是尚不存在鏈接容器允耿,與默認容器中–link使用的最大差別)
默認網(wǎng)絡中的link是靜態(tài)的借笙,不允許鏈接容器重啟,而自定義網(wǎng)絡下的link是動態(tài)的较锡,支持鏈接容器重啟(以及IP變化)
因此业稼,使用--link時鏈接的容器,在默認網(wǎng)絡中必須提前創(chuàng)建好蚂蕴,而自定義網(wǎng)絡下不必預先建好低散。
使用docker network connetct將容器連接到新網(wǎng)絡中時,用參數(shù)--link鏈接相同的容器時骡楼,可以指定不同的別名熔号,它們是針對不同網(wǎng)絡的。
#運行容器使用自定義網(wǎng)絡鸟整,同時使用--link鏈接尚不存在的container5容器
dockerrun--net=mynet-itd--name=container4--linkcontainer5:c5busybox
#創(chuàng)建容器container5
dockerrun--net=mynet-itd--name=container5--linkcontainer4:c4busybox
#雖然是相同容器引镊,但是在不同的網(wǎng)絡環(huán)境連接中可以不同的alias鏈接
dockernetworkconnect--linkcontainer5:foolocal_aliascontainer4
dockernetworkconnect--linkcontainer4:barlocal_aliascontainer5
指定容器在網(wǎng)絡范圍的別名(Network-scoped alias)
Network-scoped alias就是指定容器在可被同一網(wǎng)絡范圍內(nèi)的其他容器訪問的別名。
不同于link別名的是吃嘿,link別名是由鏈接容器的使用者提供的祠乃,只有它自己可使用;
而指定網(wǎng)絡范圍內(nèi)別名兑燥,是由容器提供給網(wǎng)絡中其它容器使用的亮瓷。
Network-scoped alias:同一網(wǎng)絡中的多個容器可以指定相同的別名,在使用的當然只有第一個指定別名的容器才生效降瞳,
只有當?shù)谝粋€容器關(guān)閉時嘱支,指定相同別名的第二個容器的別名才會開始生效。
dockerrun--net=mynet -itd --name=container6 --net-alias app busybox
docker network connect--alias scoped-app local_alias container6
dockerrun--net=isolated_nw -itd --name=container7 --net-alias app busybox
docker network connect--alias scoped-app local_alias container7
# 在container4中
docker attach container4
ping app# 訪問container6的IP
# 從container4中以守護進程運行退出:Ctrl+P+Q
docker stop container6
docker attach container4
ping app# 訪問的container7的IP
斷開網(wǎng)絡與移除網(wǎng)絡
# 容器從mynet網(wǎng)絡中斷開(它將無法再網(wǎng)絡中的容器container3通訊)
docker network disconnect mynet container2
# 測試與容器container3失敗
docker attach container2
ping contianer3 # 訪問失敗
在多主機的網(wǎng)絡環(huán)境中挣饥,在將容器用已移除的容器名稱連接到網(wǎng)絡中時會出現(xiàn)container already connected to network的錯誤除师,
這時需要將新容器強制移除docker rm -f,重新運行并連接到網(wǎng)絡中扔枫。
移除網(wǎng)絡要求網(wǎng)絡中所有的容器關(guān)閉或斷開與此網(wǎng)絡的連接時汛聚,才能夠使用移除命令:
# 斷開最后一個連接到mynet網(wǎng)絡的容器
docker network disconnet mynet container3
# 移除網(wǎng)絡
docker network rm mynet