我从这里取出了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'
我尝试使用泊坞网,但我得到了同样的错误。
此处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服务器?
答案 0 :(得分:2)
我必须承认,我不会立即看到它出错的地方,因为基于IP的通信也应该有用,但让我解释让容器通信的推荐方法。 当您将应用程序容器与mysql容器链接时(就像您正在做的那样),您可以在不使用ip的情况下访问其上的mysql容器名称。
在默认网桥中:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7
现在我启动一个随机应用程序并将其与mysql链接。 curl
和ping
已安装在此容器中。
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
建议使用用户定义的网络,而不是“已弃用的”网络。 - 默认桥接网络中的链接功能。