【问题标题】:How to connect to docker mysql container on remote machine如何连接到远程机器上的 docker mysql 容器
【发布时间】: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 容器以及你得到的响应吗?

标签: mysql docker remote-access ports


【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      相关资源
      最近更新 更多