如何连接到远程机器上的 docker mysql 容器

How to connect to docker mysql container on remote machine

我有两台机器。我的机器 IP1(Europe),其他机器 public 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

为了使事情更简单,假设我只使用第二种方法。

我没有 :

防火墙的结果

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

您没有指定如何 运行 您的 mysql 容器...

您需要指定哪个端口应该是 "published",即哪个端口应该从 "outside" 到 mysql 容器的 "inside"。

为此,您可以在执行 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

我认为您的 mysql 容器正在侦听 ipv6(查看您的 netstat 结果)。原因可能是您的 docker 配置。我不知道如何解决它,我个人只是在我的 docker 主机上关闭 ipv6 以避免这个问题。

希望对您有所帮助。

您可以修改您的 my.cnf 并添加 bind_address=0.0.0.0

这对我有用。 mysql configuration doc:bind_address

对于那些即使在所有这些提示之后仍无法连接的人。考虑使用另一个端口

示例:

ports:
      - '3308: 3306'

我这样解决了我的问题。