我們先來看看network所有的子命令:
(推薦教程:docker教程)
docker?network?create docker?network?connect docker?network?ls docker?network?rm docker?network?disconnect docker?network?inspect
一、創建網絡
在安裝Docker Engine時會自動創建一個默認的bridge網絡docker0。?此外,還可以創建自己的bridge網絡或overlay網絡。
bridge網絡依附于運行Docker Engine的單臺主機上,而overlay網絡能夠覆蓋運行各自Docker Engine的多主機環境中。
創建bridge網絡比較簡單如下:
?#?不指定網絡驅動時默認創建的bridge網絡 ?docker?network?create?simple-network ?#?查看網絡內部信息 ?docker?network?inspect?simple-network ?#?應用到容器時,可進入容器內部使用ifconfig查看容器的網絡詳情
但是創建一個overlay網絡就需要一些前提條件(具體操作請參考Docker容器網絡相關內容):?
-?key-value?store(Engine支持Consul、Etcd和ZooKeeper等分布式存儲的key-value?store)? -?集群中所有主機已經連接到key-value?store? -?swarm集群中每個主機都配置了下面的daemon參數? -?–cluster-store? -?–cluster-store-opt? -?–cluster-advertise
然后創建overlay網絡:
#?創建網絡時,使用參數`-d`指定驅動類型為overlay docker?network?create?-d?overlay?my-multihost-network
就使用–subnet選項創建子網而言,bridge網絡只能指定一個子網,而overlay網絡支持多個子網。
在bridge和overlay網絡驅動下創建的網絡可以指定不同的參數。
二、連接容器
創建三個容器,分別前兩個使用默認網絡啟動容器,第三個使用自定義bridge網絡啟動。?然后再將第二個容器添加到自定義網絡。這三個容器的網絡情況如下:
第一個容器:只有默認的docker0
第二個容器:屬于兩個網絡——docker0、自定義網絡
第三個容器:只屬于自定義網絡
說明:通過容器啟動指定的網絡會覆蓋默認bridge網絡docker0。
#?創建三個容器?conTainer1,container2,container3 docker?run?-itd?--name=container1?busybox docker?run?-itd?--name=container2?busybox #?創建網絡mynet docker?network?create?-d?bridge?--subnet?172.25.0.0/16?mynet #?將容器containerr2連接到新建網絡mynet docker?network?connect?mynet?container2 #?使用mynet網絡來容器container3 docker?run?--net=mynet?--ip=172.25.3.3?-itd?--name=container3?busybox ? #?查看這三個容器的網絡情況 docker?network?inspect?container1?#?docker0 docker?network?inspect?container2?#?docker0,?mynet docker?network?inspect?container3?#?mynet
三、默認網絡與自定義bridge網絡的差異
默認網絡docker0:網絡中所有主機間只能用IP相互訪問。通過–link選項創建的容器可以對鏈接的容器名(container-name)作為hostname進行直接訪問。?
自定義網絡(bridge):網絡中所有主機除ip訪問外,還可以直接用容器名(container-name)作為hostname相互訪問。
#?進入container2內部 docker?attach?container2 ping?-w?4?container3?#?可訪問 ping?-w?4?container1?#?不可訪問 ping?-w?4?172.17.0.2?#?可訪問container1的IP #?Ctrl+P+Q退出容器,讓container2以守護進程運行
四、默認網絡與自定義bridge網絡在容器連接的差別
在默認網絡中使用link(legency link),有如下功能:
-?使用容器名作為hostname? -?link容器時指定alias:?--link=<container-name>:<alias>? -?配合--icc=false隔離性,實現容器間的安全連接? -?環境變量注入</alias></container-name>
自定義網絡中使用docker net提供如下功能:?
-?使用DNS實現自動化的名稱解析? -?一個網絡提供容器的安全隔離環境? -?動態地attach與detach到多個網絡? -?支持與--link選項一起使用,為鏈接的容器提供別名(可以是尚不存在鏈接容器,與默認容器中–link使用的最大差別)
默認網絡中的link是靜態的,不允許鏈接容器重啟,而自定義網絡下的link是動態的,支持鏈接容器重啟(以及IP變化)?
因此,使用–link時鏈接的容器,在默認網絡中必須提前創建好,而自定義網絡下不必預先建好。
使用docker network connetct將容器連接到新網絡中時,用參數–link鏈接相同的容器時,可以指定不同的別名,它們是針對不同網絡的。
#?運行容器使用自定義網絡,同時使用--link鏈接尚不存在的container5容器 docker?run?--net=mynet?-itd?--name=container4?--link?container5:c5?busybox #?創建容器container5 docker?run?--net=mynet?-itd?--name=container5?--link?container4:c4?busybox #?雖然是相同容器,但是在不同的網絡環境連接中可以不同的alias鏈接 docker?network?connect?--link?container5:foo?local_alias?container4 docker?network?connect?--link?container4:bar?local_alias?container5
五、指定容器在網絡范圍的別名(Network-scoped alias)
Network-scoped alias就是指定容器在可被同一網絡范圍內的其他容器訪問的別名。?
不同于link別名的是,link別名是由鏈接容器的使用者提供的,只有它自己可使用; 而指定網絡范圍內別名,是由容器提供給網絡中其它容器使用的。
Network-scoped alias:同一網絡中的多個容器可以指定相同的別名,在使用的當然只有第一個指定別名的容器才生效,?
只有當第一個容器關閉時,指定相同別名的第二個容器的別名才會開始生效。
docker?run?--net=mynet?-itd?--name=container6?--net-alias?app?busybox docker?network?connect?--alias?scoped-app?local_alias?container6 docker?run?--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
六、斷開網絡與移除網絡
#?容器從mynet網絡中斷開(它將無法再網絡中的容器container3通訊) docker?network?disconnect?mynet?container2 #?測試與容器container3失敗 docker?attach?container2 ping?contianer3?#?訪問失敗
在多主機的網絡環境中,在將容器用已移除的容器名稱連接到網絡中時會出現container already connected to network的錯誤,?
這時需要將新容器強制移除docker rm -f,重新運行并連接到網絡中。
移除網絡要求網絡中所有的容器關閉或斷開與此網絡的連接時,才能夠使用移除命令:
#?斷開最后一個連接到mynet網絡的容器 docker?network?disconnet?mynet?container3 #?移除網絡 docker?network?rm?mynet