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