mysql - 无法从另一个容器访问Docker容器中的MySQL数据库

标签 mysql docker

我从这里拉取了 MySQL 5.7 容器:https://hub.docker.com/_/mysql/

这是我运行它的方式:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7

它运行良好,我能够从我的主机连接到 MySQL 数据库。

但是,当我尝试使用这样链接的 mysql 容器运行另一个容器时:

docker run --link mysql:mysql -p 8080:8080 -d app:dev

我的容器无法连接到mysql:

# 172.17.0.3 is mysql's ip taken from /etc/hosts of another container.
mysql -h 172.17.0.3 -u root -ppwd

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.3'

我尝试使用 docker 网络,但我遇到了同样的错误。

这是 nmap -p 3306 172.17.0.2 输出:

Starting Nmap 7.01 ( https://nmap.org ) at 2018-06-03 08:34 UTC
Nmap scan report for e66874413058 (172.17.0.2)
Host is up (0.00012s latency).
PORT     STATE  SERVICE
3306/tcp closed mysql

Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds

由于未知原因,端口已关闭。如果我从我的主机运行 nmap 命令,它是打开的。

如何从另一个docker容器连接到MySQL服务器?

最佳答案

我不得不承认我没有立即看出问题出在哪里,因为基于 IP 的通信也应该可以工作,但让我解释一下让容器通信的推荐方式。 当您将您的应用程序容器与 mysql 容器链接时(就像您所做的那样),您可以仅在其容器名称上访问 mysql,而无需使用 ip。

在默认桥接网络中:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7

现在我启动一个随机应用程序并将其与 mysql 链接。 curlping 安装在这个容器中。

docker run -d -p 8080:8080 --link mysql:mysql randomapp

现在我进入我的 randomapp 容器并尝试 ping 工作的 mysql 容器。

docker exec -it 7c4bc6f1ca7a bash
xxx@7c4bc6f1ca7a:/$ ping mysql
PING mysql (172.17.0.3) 56(84) bytes of data.
64 bytes from mysql (172.17.0.3): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from mysql (172.17.0.3): icmp_seq=2 ttl=64 time=0.049 ms

我也可以用 nmap 容器验证

docker@default:~$ docker run --rm --link mysql:mysql uzyexe/nmap mysql 3306

Starting Nmap 7.60 ( https://nmap.org ) at 2018-06-06 05:54 GMT
setup_target: failed to determine route to 3306 (0.0.12.234)
Nmap scan report for mysql (172.17.0.3)
Host is up (0.000010s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
3306/tcp open  mysql
MAC Address: 02:42:AC:11:00:03 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.65 seconds
docker@default:~$

如果您在同一个用户定义的桥接网络中部署您的应用程序和 mysql,则无需定义 --link 选项,并且您的容器可以使用容器名称相互通信。

docker network create my-bridge
docker run --name mysql --net my-bridge -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7
docker run -d -p 8080:8080 --net my-bridge randomapp

建议使用用户定义的网络,而不是默认桥接网络中“已弃用”的链接功能。

关于mysql - 无法从另一个容器访问Docker容器中的MySQL数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50712182/

相关文章:

mysql - 在 mysql 或更好的 algothrim 中将每笔交易的借方与贷方相匹配?

docker - 有没有办法停止单个docker服务并删除其分配的卷?

angular - 使用路由和Nginx进行Dockerize Angular

MySQL 嵌套查询格式

mysql - 正确地将键值表连接到主表

MySql JOINS 和 Count() 函数 : #1054 - Unknown column 'T.parent' in 'on clause'

php - 如何使用 Elastic Search 中的偏移量复制 MySQL 删除?

java - 无法在 docker 内构建 gradle 应用程序

docker - Kubernetes 服务连接被拒绝,如何访问服务?

docker - Nano和Midnight Commander在Windows版Docker上不起作用