Docker会自动创建none、host、bridge三种网络,也可以根据需要自定义网络,包括bridge、overlay、macvlan,其中overlay和macvlan是跨主机的网络。

docker network常用子命令如下:

docker network createdocker network connectdocker network ls
docker network rm
docker network disconnectdocker network inspect

默认的网络如下

docker自定义网络_docker

网络结构

docker自定义网络_docker_02

创建bridge网络,指定ip网段(也可以自动分配)

docker network create --driver bridge --subnet 172.14.14.0/24 --gateway 172.14.14.1 net1

docker自定义网络_docker_03

执行ifconfig命令后也可以看到br-c201be4aa4a6

docker自定义网络_docker_04


容器分配添加的bridge网络

docker run -d --name httpd1 --network=net1 --ip 172.14.14.12 -p 8081:80 dbfc2cbe2971

curl 172.14.14.12可以正常访问
再看网络结构,会发现新的网络接口挂到了net1上,vethaef4a02是该容器的虚拟网卡

docker自定义网络_docker_05

进入该容器后可以查看到该网卡跟上面的虚拟网卡不一样。两者是一对veth pair,可以比喻成一根虚拟网线把一对网卡连接起来,一边是容器,一边是net1,就相当于把容器的网卡也添加到了net1。


再创建一个容器2

docker run -d --name httpd2 --network=net1 -p 8082:80 dbfc2cbe2971

docker自定义网络_docker_06

进入该容器,ping下httpd1的ip

docker自定义网络_docker_07

在同一网络下,容器之间、容器和网关之间可以正常通信。


建立容器3,默认网关docker0

docker run -d --name httpd3 -p 8083:80 dbfc2cbe2971

docker自定义网络_docker_08

然后ping容器1的ip结果显示失败,说明两个网络之间是独立的。
如果要让容器3ping通容器1的ip,则需要把容器3添加到容器1所在的网络下

docker network connect net1 httpd3

docker自定义网络_docker_09

ifconfig查看,httpd3增加了eth1

docker自定义网络_docker_10

然后再次ping即可成功

docker自定义网络_docker_11


另外,直接ping容器名也可以ping通。(内嵌的DNS server)只能在自定义网络中使用容器名之间通信,默认的docker0是不可以通过容器名来通信的(不能用dns)。

docker自定义网络_docker_12