Docker - 容器互联

1-互联

默认情况下,同一个宿主机中所有容器都连接在一个虚拟网桥docker0上,而docker0是与主机互通的。
因此在默认情况下,同一主机中的容器之间是可以互相连接的,容器内部也是可以访问到外部网络的。

2-容器之间互联

通过docker run命令的--link参数可以让容器之间通过连接(linking)系统进行交互。
参数格式: --link name:alias ,name是要链接的容器名称, alias是此连接的别名。

容器的连接系统会依据容器的名称,创建容器之间一个安全隧道,在启动容器的时候不使用-p-P参数(不用映射端口到宿主主机),从而避免了暴露端口到外部网络。

通过docker run命令的--name参数来自定义容器名称(容器的名称是唯一的)。
通过docker ps命令结果的NAMES部分,查看容器名称。

Docker通过环境变量为容器公开连接信息,还添加host信息到父容器的/etc/hosts文件。
用户可以链接多个父容器到子容器。

3-示例:容器之间互联

[root@CentOS-7 ~]# docker run -d --name nginx-node nginx
fc94ef26e3ab354db09323037f9a5119b18b48b8ca8c0f353ce3d3408230456d
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker run -itd --name centos-node --link nginx-node:samplelink centos
b5f56401c44d7b41f060e603b0a98309a0e996ffa66a0c177edee13364820f57
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b5f56401c44d        centos              "/bin/bash"              4 seconds ago       Up 3 seconds                            centos-node
fc94ef26e3ab        nginx               "nginx -g 'daemon off"   23 seconds ago      Up 22 seconds       80/tcp, 443/tcp     nginx-node
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker inspect --format "{{ .NetworkSettings.IPAddress }}" nginx-node
172.17.0.2
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker inspect --format "{{ .NetworkSettings.IPAddress }}" centos-node
172.17.0.3
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker exec -it nginx-node env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=fc94ef26e3ab
NGINX_VERSION=1.11.13-1~jessie
HOME=/root
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker exec -it centos-node env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b5f56401c44d
TERM=xterm
SAMPLELINK_PORT=tcp://172.17.0.2:80
SAMPLELINK_PORT_80_TCP=tcp://172.17.0.2:80
SAMPLELINK_PORT_80_TCP_ADDR=172.17.0.2
SAMPLELINK_PORT_80_TCP_PORT=80
SAMPLELINK_PORT_80_TCP_PROTO=tcp
SAMPLELINK_PORT_443_TCP=tcp://172.17.0.2:443
SAMPLELINK_PORT_443_TCP_ADDR=172.17.0.2
SAMPLELINK_PORT_443_TCP_PORT=443
SAMPLELINK_PORT_443_TCP_PROTO=tcp
SAMPLELINK_NAME=/centos-node/samplelink
SAMPLELINK_ENV_NGINX_VERSION=1.11.13-1~jessie
HOME=/root
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker exec -it nginx-node cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	fc94ef26e3ab
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker exec -it centos-node cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	samplelink fc94ef26e3ab nginx-node
172.17.0.3	b5f56401c44d
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker exec -it centos-node ping nginx-node
PING samplelink (172.17.0.2) 56(84) bytes of data.
64 bytes from samplelink (172.17.0.2): icmp_seq=1 ttl=64 time=0.339 ms
64 bytes from samplelink (172.17.0.2): icmp_seq=2 ttl=64 time=0.146 ms
^C
--- samplelink ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.146/0.242/0.339/0.097 ms
[root@CentOS-7 ~]# 

4-与外部网络互联

默认情况下,容器内部可以直接访问外部网络。
但在通常情况下,外部网络不可以直接访问容器内部。
在创建容器时,通过端口映射(将主机的指定端口映射到容器的网络服务端口),可以访问主机的指定端口来间接地访问容器的内部。

  • 使用-P(大写)参数,Docker会随机映射一个端口到内部容器开放的网络端口.
  • 使用-p(小写)参数, 可以在一个指定映射端口上绑定一个容器。可以多次使用此参数来绑定多个端口。

5-示例:与外部网络互联

更详细的示例:https://www.cnblogs.com/anliven/p/6799429.html

[root@anliven ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5d9e68b2280b        centos              "/bin/bash"         47 hours ago        Up 4 seconds                            strange_curie
[root@anliven ~]#
[root@anliven ~]#
[root@anliven ~]#
[root@anliven ~]# docker exec 5d9e68b2280b ping www.baidu.com
PING www.baidu.com (39.156.66.18) 56(84) bytes of data.
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=49 time=43.6 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=2 ttl=49 time=43.4 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=3 ttl=49 time=44.6 ms
^C
[root@anliven ~]# docker exec 5d9e68b2280b ping www.bing.com
PING cn-0001.cn-msedge.net (202.89.233.101) 56(84) bytes of data.
64 bytes from 202.89.233.101 (202.89.233.101): icmp_seq=1 ttl=112 time=42.8 ms
64 bytes from 202.89.233.101 (202.89.233.101): icmp_seq=2 ttl=112 time=40.9 ms
64 bytes from 202.89.233.101 (202.89.233.101): icmp_seq=3 ttl=112 time=44.0 ms
^C
[root@anliven ~]#
posted @ 2017-05-02 23:57  Anliven  阅读(1564)  评论(0编辑  收藏  举报