容器通信
1. DNS
容器之间除了使用ip通信外,还可以使用容器名称通信。
docker 1.10开始,内嵌了一个DNS server。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
2.Joined容器(类似于host模式)
- Joined容器一种较为特别的网络模式。
- 在容器创建时使用--network=container:vm1指定。(vm1指定的是运行的容器名)
- 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
3. link
- --link 可以用来链接2个容器。
--link的格式:
--link <name or id>:alias
name和id是源容器的name和id,alias是源容器在link下的别名。
[root@server2 ~]# docker rm -f demo
demo
[root@server2 ~]# docker rm -f demo2
demo2
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 13 days ago 1.23MB
nginx latest f6d0b4767a6c 2 weeks ago 133MB
[root@server2 ~]# docker run -d --name demo nginx
[root@server2 ~]# docker run -it --link demo:nginx busybox ##使用link可以查看demo上的数据,也会自动做解析。为busybox自动分配ip
4. 容器如何访问外网是通过iptables的SNAT实现的
- 需要打开内核路由功能,即forward=1
5. 外网如何访问容器
- 外网如何访问容器
- 端口映射
- -p 选项指定映射端口
- 外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现(删除docker-proxy只能通过直接访问ip)
- proxy和DNAT只要存在一种就可以进行通讯,是一种双冗余设置,localhost使用docker-proxy转发
[root@server2 ~]# docker run -d --rm -p 80:80 nginx ##端口映射
[root@server2 ~]# netstat -antlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6394/docker-proxy
5.1删除链 DOCKER
删除iptables那么就通过proxy来访问
5.2 删除docker-proxy
iptables开着,杀掉proyx也可以访问。
localhost使用docker-proxy转发