我有多个在单独的Docker容器中运行的MySQL服务器。我无法从主机连接到任何一个。
$ mysql -h172.17.0.2 -uroot -pPASSWORD
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.2' (60)
来自docker inspect的IP地址:
$ docker inspect local2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
端口暴露(但未映射):
$ docker inspect local2 | grep -B1 3306
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
--
"Ports": {
"3306/tcp": null,
"33060/tcp": null
docker容器是通过以下方式创建(并重新创建的)
docker run --name local -e MYSQL_ROOT_PASSWORD=PASSWORD -d mysql:8.0.21
我可以从网络上的另一个Docker客户端进行连接:
docker run -it --network bridge --rm mysql mysql -h172.17.0.2 -uroot -pPASSWORD
如果我将bash放到容器中,我就能与本地主机本地连接。
我只能从主机连接。
答案 0 :(得分:1)
经过更多研究,我发现实际上如果不映射端口就无法访问Mac上的Docker实例。
https://github.com/docker/for-mac/issues/2670#issuecomment-371249949
您不能直接在Mac上访问容器IP。您需要在端口转发中使用localhost
请参见https://docs.docker.com/docker-for-mac/networking/#known-limitations-use-cases-and-workarounds
:(
我很高兴在这里犯错。
答案 1 :(得分:0)
在您访问容器中的服务的方式上,我找不到任何问题。我只是怀疑该服务尚未真正准备好。
也许这会给您一个排除故障的想法:
passwd=pw
id=$(docker run --name some-mysql -e MYSQL_ROOT_PASSWORD="$passwd" --detach mysql)
ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$id")
printf "listing open ports on %s:\n You might have wait some seconds until they are open\n" "$ip"
nmap "$ip" -p 3306,33060
printf "connecting to %s:\n" "$ip"
mysql --host="$ip" --user="root" --password="$passwd" --protocol=TCP --wait