Docker通信,而不使用传统的链接

我试图创build一个使用mysql和phpmyadmindocker的迷你演示,我试图使两个docker容器相互沟通,而不使用 – 链接标志,因为这已被标记为“传统”由docker( https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#/connect-with-the-linking-system )

我设法使用networking部分使用docker-compose来做到这一点,但我想要使用普通的dockerfiles并在命令提示符下运行这两个容器来实现相同的场景。

这里是我创build的两个dockerfiles:

Dockerfile为MySQL

FROM mysql:5.7 ENV MYSQL_ROOT_PASSWORD=12345678 ENV MYSQL_DATABASE=mysql ENV MYSQL_USER=user ENV MYSQL_PASSWORD=12345678 

Dockerfile为pma

 FROM phpmyadmin/phpmyadmin:4.6 ENV PMA_HOST=mysql ENV MYSQL_ROOT_PASSWORD=12345678 

Docker镜像使用docker build正确创build,这些是我用来运行这两个容器的命令:

MySQL的:

 docker run -d --name mysql sebastian/db-mysql 

PMA:

 docker run -d -p 7777:80 --name pma sebastian/db-pma 

当我尝试连接到Pma使用用户名和密码12345678我得到以下错误:

 mysqli_real_connect(): (HY000/2005): Unknown MySQL server host 'mysql' (-2) 

我确定我在旋转两个容器时错过了一些东西,我不能完全理解这两个容器是如何通信的和/或pma如何find主机mysql(我在运行mysql容器时定义的名称)

docker工是否允许两个容器之间的通信? 容器如何通过使用名称而不是IP地址find对方?

PS我在Windows 10上使用dockertoolbox(也许这是真正的问题:D)

问题:

您在docker run中没有指定任何networking,因此您将使用默认网桥,默认网桥将不会为您提供内部DNS,但该networking上的容器可以通过IP地址进行通信。

按着这些次序:

首先创build一个用户定义的networking:

 docker network create <yournetworkname> 

现在使用我们刚刚创build的networking运行容器:

 docker run -d --name mysql --network <yournetworkname> sebastian/db-mysql docker run -d -p 7777:80 --name --network <yournetworkname> pma sebastian/db-pma 

用户定义的networking默认提供连接,内部DNS提供同一networking上的容器。 例如,您可以通过以下方式从pma ping mysql:

 ping mysql