docker網路模式
檢視預設網路列表
安裝完docker後會自動建立網路,我們可以通過以下命令檢視存在的網路模式:
docker network ls
- bridge模式: Docker預設的網路模式,為每一個容器分配IP等。
- host模式: 和宿主機共享網路,容器不會虛擬出自己的網絡卡,IP等,而是使用宿主機的IP和埠。
- none模式: 不配置網路。
- container模式: 和指定的容器共享IP、埠範圍等。
建立容器時,可以使用 --network
選項指定容器的網路模式。
bridge模式
當 Docker 啟動時,會自動在主機上建立一個名為 docker0 的虛擬網橋,主機上啟動的 Docker 容器會連線到這個虛擬網橋上。同時Docker會隨機分配一個本地未佔用的私有網段中的一個地址給docker0介面。此後啟動的容器內的網口也會自動分配一個同一網段的地址。
當建立一個 Docker 容器的時候,同時會建立了一對 veth pair
介面。這對介面一端在容器內,即 eth0
;另一端在本地並被掛載到 docker0
網橋,名稱以 veth
開頭。通過這種方式,主機可以跟容器通訊,容器之間也可以相互通訊。Docker 就建立了在主機和所有容器之間一個虛擬共享網路。
注:當我們自己建立網路的時候預設即是bridge模式。
建立自定義網橋
docker network create [OPTIONS] NETWORK
Options:
- --attachable:預設
false
,啟用手動容器安裝 - --driver, -d:預設
bridge
,驅動程式管理網路 - --gateway:用於主子網的IPv4或IPv6閘道器
- --internal:預設
false
,限制對網路的外部訪問 - --ip-range:指定容器的IP範圍,格式同
--subnet
引數 - --subnet:表示網段的 CIDR 格式的子網(如192.168.0.0/16)
示例:
$ docker network create -d bridge my-bridge2 49f6474bbab3fa86848fc1270589221c8e1b10d62917e2e6ff8485b41465293c $ docker network ls NETWORK ID NAME DRIVER SCOPE d651f64b431e bridge bridge local 9ea6532107f7 host host local 49f6474bbab3 my-bridge bridge local 621f2f431b5d my-bridge2 bridge local cd8be57c82ab none null local
刪除網路
docker network rm NETWORK [NETWORK...]
示例:
$ docker network rm my-bridge2
my-bridge2
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
d651f64b431e bridge bridge local
9ea6532107f7 host host local
49f6474bbab3 my-bridge bridge local
cd8be57c82ab none null local
網路資訊檢視
docker network inspect [OPTIONS] NETWORK [NETWORK...]
Options:
- --format, -f:使用給定的模板格式化輸出
示例:
$ docker network inspect -f '{{json .IPAM.Config}}' bridge
[{"Subnet":"172.17.0.0/16","Gateway":"172.17.0.1"}]
將容器新增到網路中
為新建的容器指定my-bridge網路:
docker run --network my-bridge -dit --name mycentos1 centos bash
再啟動一個容器加入到my-bridge網路:
docker run --network my-bridge -dit --name mycentos2 centos bash
進入mycentos1容器檢視是否和mycentos2網路互通:
$ docker exec -it 62c3a18331e5 bash
[root@62c3a18331e5 /]# ping mycentos2
PING mycentos2 (172.21.0.3) 56(84) bytes of data.
64 bytes from mycentos2.my-bridge (172.21.0.3): icmp_seq=1 ttl=64 time=0.141 ms
64 bytes from mycentos2.my-bridge (172.21.0.3): icmp_seq=2 ttl=64 time=0.113 ms
64 bytes from mycentos2.my-bridge (172.21.0.3): icmp_seq=3 ttl=64 time=0.124 ms
- 可以看到成功連線,同理在容器mycentos2中也會成功連線到容器mycentos1。
網路連線與斷開
可以將指定的容器與指定的網路進行連線或者斷開。
連線:
docker network connect [OPTIONS] NETWORK CONTAINER
Options:
- --alias:為容器新增網路範圍的別名
- --driver-opt:網路驅動程式選項
- --ip:IPv4地址(例如 172.30.100.104)
- --ip6:IPv6地址(例如 2001:db8::33)
- --link:新增到另一個容器的連結
- --link-local-ip:為容器新增連結本地地址
示例:
$ docker network connect my-bridge mycentos3
斷開:
docker network disconnect [OPTIONS] NETWORK CONTAINER
Options:
- -f, --force:強制容器斷開網路的連線
示例:
$ docker network disconnect bridge mycentos3
host模式
如果啟動容器的時候使用host
模式,那麼這個容器將不會獲得一個獨立的Network Namespace
,而是和宿主機共用一個 Network Namespace
。容器將不會虛擬出自己的網絡卡,配置自己的 IP 等,而是使用宿主機的 IP 和埠。
docker run --network host -dit redis
none模式
使用none
模式,docker 容器擁有自己獨立的 Network Namespace
,但並沒有進行任何網路配置。即這個 docker 容器沒有網絡卡、IP、路由等資訊。需要我們自己為 docker 容器新增網絡卡、配置 IP 等。
該模式適合需要高度定製網路的使用者使用。