不使用旧版链接的Docker通信

时间:2017-02-24 09:47:12

标签: mysql docker phpmyadmin dockerfile

我正在尝试使用mysql和phpmyadmin创建一个带有docker的迷你演示,并且我试图让两个docker容器相互通信而不使用--link标志,因为它已被标记为“legacy” by docker(https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#/connect-with-the-linking-system

我设法使用docker-compose使用网络部分执行此操作,但我想使用普通的dockerfiles并在命令提示符下运行两个容器来实现相同的方案。

以下是我创建的两个dockerfiles:

mysql的Dockerfile

FROM mysql:5.7

ENV MYSQL_ROOT_PASSWORD=12345678
ENV MYSQL_DATABASE=mysql
ENV MYSQL_USER=user
ENV MYSQL_PASSWORD=12345678

pma的Dockerfile

FROM phpmyadmin/phpmyadmin:4.6

ENV PMA_HOST=mysql
ENV MYSQL_ROOT_PASSWORD=12345678

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

MySQL的:

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

PMA:

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

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

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

我确定在旋转两个容器时我遗漏了一些东西,我无法完全理解两个容器如何进行通信和/或pma如何找到主机mysql(我在运行mysql容器时定义的名称)

Docker假设允许两个容器之间的通信吗? 容器如何使用名称而不是ip地址找到对方?

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

1 个答案:

答案 0 :(得分:3)

问题:

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

请按以下步骤操作:

首先创建一个用户定义的网络:

docker network create <yournetworkname>

现在使用我们刚创建的网络运行容器:

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

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

ping mysql