Docker实践(6) – 容器内部连接(不需要在主机上映射端口)

上一个技术点展示了如何通过暴露端口来开放你的容器到主机网络。不过当你只是想容器内部之间连接时,就不再想把端口暴露给主机网络或外部网络了。
在本文将介绍如何通过Docker link参数来实现这个目的,来确保外部无法访问你的内部服务。

问题

你想要允许容器内部之间的连接。

方法

通过docker的链接功能来允许容器相互通信。

讨论

继续我们wordpress的设置,我们打算从wordpress容器分离出mysql数据库,然后不通过端口映射方式来使它们能够相互通信。如图:

按照如下命令来运行容器,第一个和第二个命令相隔一分钟执行:

  1. $ docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=yoursecretpassword -d mysql
  2. $ docker run --name wordpress --link wp-mysql:mysql -p 10003:80 -d  wordpress

在第一个命令中,给容器设置了wp-mysql名称以便之后引用。并且提供一个环境变量(-e MYSQL_ROOT_PASSWORD=yoursecretpassword)来使mysql容器能够完成初始化。
在第二个命令中,以wordpress命名容器,并通过–link wp-mysql:mysql来连接wp-mysql与wordpress容器。注意链接不会等待链接容器启动完成,所以上一步的操作需要等待一分钟以便让mysql容器先完成启动。不过最好的方法是通过docker logs wp-mysql来查看mysql容器是否已经准备接受连接了。
在这个示例中最重要的是–link参数,这个参数使wordpress容器自动维护/etc/hosts文件来使wp-mysql mysql等名称指向mysql容器IP。

启动次序事项:容器必须按正确的次序来启动以便存在的容器映射能够正确的替换。目前为止链接的动态解析不是docker的一项功能。

为了能够让容器能够被连接,比如mysql容器,就需要在创建mysql镜像时暴露端口,如暴露3306端口,这个可以在Dockerfile使EXPOSE完成。
至于为什么为这样做,请参考http://dockone.io/article/455

标签:容器Docker 发布于:2019-11-20 23:40:18