如何连接到远程机器上的 docker mysql 容器
Posted
技术标签:
【中文标题】如何连接到远程机器上的 docker mysql 容器【英文标题】:How to connect to docker mysql container on remote machine 【发布时间】:2018-11-05 20:59:18 【问题描述】:我有两台机器。我的机器使用IP1(Europe)
,其他机器使用公共IP2(USA)
。在IP2
上,我运行mysql 容器,卷/var/lib/mysql
设置为复制到主机~/mysqldatabase
上的某个文件夹中。增加了端口3306
的防火墙规则。我也有与机器的 ssh 连接。所以我不知道从哪里开始。通常当没有 docker 我只添加
bind-address = 0.0.0.0
作为mysql中的配置,我打开防火墙端口3306
(或另一个指向mysql的端口),一切正常。
所以可能我可以在IP2机器上的docker之外安装mysql-server包(主机是ubuntu16.04)并将其设置为指向~/mysqldatabase
文件夹,但真的有必要这样做吗?
有没有办法直接从IP1
连接到IP2:mysql_container:mysql_database
我以两种方式运行 mysql docker 容器。一种是使用 docker 文件。另一个是 systemctl 服务。
docker-compose.yml 的一部分:
version: "3"
services:
mysql:
image: mysql:5.7
volumes:
- /home/username/mysqldatabase:/var/lib/mysql
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: somedb
MYSQL_USER: someuser
MYSQL_PASSWORD: someuserpassword
mysql.service
[Unit]
Description=Run %p
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm -f %p
docker run --rm --name mysql -v /home/username/mysqldatabase:/var/lib/mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=rootpass -e MYSQL_DATABASE=somedb -e MYSQL_USER=someuser -e MYSQL_PASSWORD=someuserpassword \
mysql:5.7
ExecStop=/usr/bin/docker stop %p
[Install]
WantedBy=multi-user.target
为了让事情更简单,假设我只使用第二种方法。
我没有:
1.mysql-client、mysql-server或ip2机器上的mysql 2.我没有设置任何地方绑定到0.0.0.0,因为我想直接连接到mysql容器。可能我必须设置它 绑定到此容器内的 0.0.0.0。防火墙结果
sudo netstat -tunlp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 24717/docker-proxy
【问题讨论】:
我还不清楚这里的问题是什么?有两件事I have to set it to bind to 0.0.0.0 inside this container.
默认情况下,容器内的 mysql 绑定仅是 0.0.0.0
。接下来,当您在 docker 中使用 -p 3306:3306
时,它本身就是与主机上的 0.0.0.0
的绑定。这意味着3306暴露在主机上。现在你能澄清一下你想要解决的问题是什么吗?
好的。我不知道默认情况下容器 mysql 中绑定到 0.0.0.0 的那部分谢谢你提供的信息。那时我不必再试一次,因为它没有用。我用过数字海洋水滴。但似乎我仍然无法访问它。不知何故,我无法从 IP1 连接。我检查了一下,数据库在 mysql 容器内。我也可以用 root 密码连接到 mysql shell 。唯一剩下的就是防火墙了。
是的,有两个防火墙规则,机器级别和云提供商级别。两者都需要启用 3306 才能正常工作
使用相同的防火墙设置和 docker-compose 我终于成功连接。由于某种原因,仅使用 docker 不起作用。似乎新的 docker 有一些我不明白的新东西。没有使用“docker run”命令创建服务,容器无法相互连接。我无法解决这个问题。但好在 docker-compose 马上就起作用了。我用“docker run”解决了这个问题两天,我很高兴我摆脱了它。似乎使用 docker 17.06 有一些 'docker swarm init' 和许多额外的东西如何连接容器
@makkasi,你能发布你如何尝试连接到 mysql 容器以及你得到的响应吗?
【参考方案1】:
我认为您的 mysql 容器正在侦听 ipv6(查看您的 netstat 结果)。原因可能是您的 docker 配置。我不知道如何解决它,我个人只是在我的 docker 主机上关闭了 ipv6 以避免这个问题。
希望对你有帮助。
【讨论】:
感谢您的建议。我会试试的。【参考方案2】:您没有指定如何运行 mysql 容器...
您需要指定应该“发布”哪个端口,即哪个端口应该从 mysql 容器的“外部”到“内部”。
为此,您可以在执行docker run
时指定-p
选项,或者将其添加到您的docker-compose.yml
。
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql:tag
或docker-compose.yml
version: '3.1'
services:
db:
image: mysql
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: example
阅读有关发布端口here 的更多信息。
【讨论】:
嗨,亚历克斯。我已经编辑了我的帖子。我已经有 3306 端口公共。谢谢您的回答。根据this answer我不需要在IP2主机上安装mysql-server,我可以直接连接到IP2主机mysql docker容器。但是缺少一些配置。我想我必须在 mysql 容器内设置 0.0.0.0 。我在正确的轨道上吗?【参考方案3】:对于那些即使在所有这些提示之后仍然无法连接的人。考虑使用其他端口
例子:
ports:
- '3308: 3306'
我这样解决了我的问题。
【讨论】:
【参考方案4】:您可以修改您的my.cnf
并添加bind_address=0.0.0.0
这对我有用。 mysql configuration doc:bind_address
【讨论】:
以上是关于如何连接到远程机器上的 docker mysql 容器的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到“localhost”(10061)上的 MySQL 服务器(主要是远程连接)
如何连接到在 docker 容器上运行的远程 Jupyter Notebook?