如何连接到远程机器上的 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 容器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 docker 容器连接到远程 mysql 托管?

从远程服务器连接到 Amazon EC2 上的 mysql

无法连接到“localhost”(10061)上的 MySQL 服务器(主要是远程连接)

如何连接到在 docker 容器上运行的远程 Jupyter Notebook?

如何从 docker 容器中的 python 脚本连接到 localhost 上的 mysql 数据库

连接到远程服务器上的 docker 中运行的 jupyter notebook