我們先來看看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隔离性,实现容器间的安全连接 - 环境变量注入
自定義網路中使用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
以上是docker network指令詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!