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
默认的网络如下
网络结构
创建bridge网络,指定ip网段(也可以自动分配)
docker network create --driver bridge --subnet 172.14.14.0/24 --gateway 172.14.14.1 net1
执行ifconfig命令后也可以看到br-c201be4aa4a6
容器分配添加的bridge网络
docker run -d --name httpd1 --network=net1 --ip 172.14.14.12 -p 8081:80 dbfc2cbe2971
curl 172.14.14.12可以正常访问
再看网络结构,会发现新的网络接口挂到了net1上,vethaef4a02是该容器的虚拟网卡
进入该容器后可以查看到该网卡跟上面的虚拟网卡不一样。两者是一对veth pair,可以比喻成一根虚拟网线把一对网卡连接起来,一边是容器,一边是net1,就相当于把容器的网卡也添加到了net1。
再创建一个容器2
docker run -d --name httpd2 --network=net1 -p 8082:80 dbfc2cbe2971
进入该容器,ping下httpd1的ip
在同一网络下,容器之间、容器和网关之间可以正常通信。
建立容器3,默认网关docker0
docker run -d --name httpd3 -p 8083:80 dbfc2cbe2971
然后ping容器1的ip结果显示失败,说明两个网络之间是独立的。
如果要让容器3ping通容器1的ip,则需要把容器3添加到容器1所在的网络下
docker network connect net1 httpd3
ifconfig查看,httpd3增加了eth1
然后再次ping即可成功
另外,直接ping容器名也可以ping通。(内嵌的DNS server)只能在自定义网络中使用容器名之间通信,默认的docker0是不可以通过容器名来通信的(不能用dns)。