7.1 端口映射实现访问容器

1. 从外部访问容器应用

在启动容器时(run或create),如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
当容器中运行着一些网络应用时,若想要外部访问这些应用,需要通过 -P-p 参数来指定容器到宿主主机的端口映射。 -P (大写)参数表示将容器暴露的端口随机映射到本机49000~49900之间的一个端口上。
例:

  1. docker run -d -P training/webapp python app.py

-p (小写)可以指定本机映射到容器的端口,且在一个指定端口上只能绑定一个容器端口。支持以下格式:

  • HostPort:ContainerPort:将本地端口映射到容器端口。如果本机有多个IP地址,则所有地址的这个端口都会映射到该容器端口。
  • IP:HostPort:ContainerPort:将指定IP地址的指定端口映射到容器端口。
  • IP::ContainerPort:将指定IP地址的端口随机挑选一个映射到容器端口。

查看容器端口映射的方法:

  • docker port CONTAINER
  • docker ps -l
  • docker logs CONTAINER

7.2 互联机制实现便捷互访

容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。

1. 自定义容器名

创建容器时docker会自动为容器分配一个名字。但最好手动指定名字。

  1. docker run -d -P --name web training/webapp python app.py

容器名必须是(本机)全局唯一的。

2. 容器互联

实例——应用容器与数据库容器互联:
1.创建一个数据库容器,指定容器名:

  1. docker run \
  2. -d \
  3. --name db \
  4. training/postgres

2.创建一个应用容器,并将它连接到db容器:

  1. docker run \
  2. -d \
  3. -P \
  4. --name web \
  5. --link db:db \
  6. training/webapp python app.py \

--link 参数的格式为 --link name:alias ,其中name是要连接的容器名称,alias是这个连接的别名。
可使用 docker ps 命令来查看容器的连接。在被连接的容器的NAME列(比如上面的db容器),可以看到关联的容器名。
Docker相当于在两个互联的容器之间创建了一个私密的虚拟管道,不需要容器将自己的端口映射到宿主主机上。这种方式效率更高,也更安全。
当容器A主动link到容器B时,A中会发生以下变化:

  • 其环境变量中会多出与容器B相关的值
  • 其/etc/hosts文件中会添加到容器B的域名和IP地址。

因此,在容器A中,有两种方式访问容器B的服务:

  • 读取环境变量,获取服务地址,然后访问。
  • 依赖DNS服务,使用容器B的域名直接访问。

参考:https://www.jianshu.com/p/21d66ca6115e