查看默认网络列表
安装完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 等。
该模式适合需要高度定制网络的用户使用。