如何在远程机器上连接到Docker MySQL容器

19

我有两台机器。我的一台机器使用IP1(欧洲),另一台机器使用公共IP2(美国)。在IP2上,我运行了一个mysql容器,并将卷/var/lib/mysql设置为在主机机器上的某个文件夹~/mysqldatabase中进行复制。端口3306的防火墙规则已添加。此外,我还可以通过ssh连接到该机器。所以我不确定从哪里开始。通常情况下,如果没有docker,我只需添加

bind-address = 0.0.0.0

在mysql中进行配置并打开防火墙端口3306(或指向mysql的其他端口)即可正常工作。因此,我可以在IP2机器上安装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服务

[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.在IP2机器上安装mysql-client、mysql-server或mysql
  • 2.也没有在任何地方设置绑定到0.0.0.0,因为我想直接连接到mysql容器。可能我要在这个容器内部将其设置为绑定到0.0.0.0。

防火墙的结果

sudo netstat -tunlp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      24717/docker-proxy

1
我仍然不清楚这里的问题是什么?有两件事情我必须将其设置为在此容器内绑定到0.0.0.0。默认情况下,在容器内mysql绑定仅为0.0.0.0。接下来,当您在docker中使用-p 3306:3306时,它本身就是绑定到主机上的0.0.0.0。这意味着3306也在主机上暴露出来了。现在,请您澄清一下您想要解决的具体问题是什么? - Tarun Lalwani
好的。我不知道容器mysql默认绑定到0.0.0.0这一部分。谢谢你提供这个信息。因为它没有起作用,所以我不必再尝试了。我使用了Digital Ocean droplet。但似乎我仍然无法访问它。不知何故,我无法从IP1连接。我检查过,数据库在mysql容器中。并且我可以使用root密码连接到mysql shell。唯一剩下的可能是防火墙。 - makkasi
1
是的,有两个防火墙规则,机器级别和云供应商级别。这两个都需要启用3306才能正常工作。 - Tarun Lalwani
使用相同的防火墙设置和docker-compose,我最终成功连接了。仅使用docker出于某种原因无法工作。似乎新的docker有一些我不理解的新东西。没有使用'docker run'命令创建服务,容器之间无法连接。我无法解决这个问题。但好消息是docker-compose立即起作用了。我花了两天时间解决'docker run'的问题,现在我很高兴已经解决了。似乎在docker 17.06中有一些“docker swarm init”和许多其他方法来连接容器。 - makkasi
@makkasi,你能否发布一下你尝试连接到MySQL容器的方式以及你得到的响应? - andolsi zied
6个回答

9

对于那些尽管遵循了所有提示仍然无法连接的人,考虑使用另一个端口。

例如:

ports:
      - '3308: 3306'

我用这种方式解决了我的问题。


6
我认为你的MySQL容器正在侦听IPv6(根据你的netstat结果)。可能是由于你的Docker配置引起的。我不知道如何解决它,但个人建议在Docker主机上关闭IPv6以避免这个问题。
希望对你有所帮助。

1
谢谢您的建议。我会尝试一下。 - makkasi
这对我有用。不得不在我的docker-compose网络中禁用ipv6,然后重新创建容器。 - xorinzor

3
您没有说明如何运行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

在这里阅读有关发布端口的更多信息


嗨,Alex。我已经编辑了我的帖子。我已经公开了3306端口。谢谢你的回答。根据这个答案,我不需要在IP2主机上安装mysql-server,我可以直接连接到IP2主机mysql docker容器。但是还有一些配置缺失。我猜我必须在mysql容器内设置0.0.0.0。我走对了吗? - makkasi

0

0
Docker端口映射是您需要配置的唯一事项。
然而,如果您仍然无法远程访问MySQL,请检查防火墙设置。

0
如果MySQL服务器和客户端的版本是8.x,请尝试以下操作:
--protocol=TCP

到MySQL客户端参数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接