测试:
[root@server2 ~]# docker run -d --name demo --network=mynet1 webserver [root@server2 ~]# docker run -it --rm --network=mynet1 busybox / # ip addr / # ping demo
这时我们发现我们是可以ping 通demo,这说明这中模式是可以给我们提供解析的
实验方法是我们再开一个webserver,停掉所有的webserver,再次开启时,顺序反一下,查看ip变化
[root@server2 ~]# docker run -d --name demo2 --network=mynet1 webserver [root@server2 ~]# docker stop demo demo [root@server2 ~]# docker stop demo2 demo2 [root@server2 ~]# docker start demo2 demo2 [root@server2 ~]# docker start demo demo [root@server2 ~]# docker inspect demo2 [root@server2 ~]# docker inspect demo [root@server2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 474967ccbcde webserver "nginx -g 'daemon of…" 4 minutes ago Up About a minute 80/tcp, 443/tcp demo2 8095eebc598a busybox "sh" 10 minutes ago Up 10 minutes pedantic_kirch 94fb1a96912a webserver "nginx -g 'daemon of…" 11 minutes ago Up About a minute 80/tcp, 443/tcp demo [root@server2 ~]# docker attach 8095eebc598a ##进入busybox查看 / # ping demo2 PING demo2 (172.18.0.2): / # ping demo PING demo (172.18.0.4):
总结:系统会自动分配ip,按照启动顺序ip单调递增,但是ping名称的时候会自动解析地址
2.自己定义网段
在创建时指定参数:–subnet 、–gateway
[root@server2 ~]# docker network rm mynet1 ##将原来定义的网络删掉 docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 mynet1
[root@server2 ~]# docker inspect mynet1
3.手动指定ip
使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的。
[root@server2 ~]# docker rm demo demo [root@server2 ~]# docker rm demo2 demo2 [root@server2 ~]# docker run -it --rm --ip 172.20.0.10 --network mynet1 busybox / # ip addr
[root@server2 ~]# docker run -d --name demo webserver [root@server2 ~]# docker run -d --name demo2 --network mynet1 webserver
4.构建双网卡机来实现不同网段间通信
桥接到不同网桥上的容器,彼此是不通信的。
docker在设计上就是要隔离不同network的。
那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为demo添加一块mynet1 的网卡。
[root@server2 ~]# docker network connect mynet1 demo [root@server2 ~]# docker inspect demo
三、Docker容器通信
容器之间除了使用ip通信外,还可以使用容器名称通信。
docker 1.10开始,内嵌了一个DNS server。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
Joined容器一种较为特别的网络模式。
在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
[root@server2 ~]# docker run -it --rm --network container:demo busybox / # ip addr
和刚才的ip一样
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
–link 可以用来链接2个容器。
–link的格式:
–link :alias
name和id是源容器的name和id,alias是源容器在link下的别名。
[root@server2 ~]# docker pull nginx:latest [root@server2 ~]# docker run -d --name demo nginx [root@server2 ~]# docker run -it --rm --link demo:nginx busybox / # env
/ # ping demo / # ping nginx
这里需要重新连接一个server2进行测试
[root@server2 ~]# docker stop demo [root@server2 ~]# docker run -d --name demo2 nginx [root@server2 ~]# docker start demo
我们再一次ping,发现ip变了,但是仍然可以ping名字,
这时我们查看/etc/hosts,发现他已经给我们自动修改了解析
容器如何访问外网是通过iptables的SNAT实现的
外网如何访问容器:
端口映射
-p 选项指定映射端口
[root@server2 ~]# docker rm -f demo demo [root@server2 ~]# docker rm -f demo2 demo2 [root@server2 ~]# docker run -d --name demo -p 80:80 nginx [root@server2 ~]# docker run -d --name demo2 -p 8080:80 nginx [root@server2 ~]# iptables -t nat -nL
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
测试: