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

时间:2018-05-26 19:52:39

标签: mysql docker remote-access ports

我有两台机器。我的计算机使用IP1(Europe),其他计算机使用公共IP2(USA)。在IP2我运行的mysql容器运行卷​​/var/lib/mysql设置为在主机~/mysqldatabase上的某个文件夹中复制。添加了端口3306的防火墙规则。我也有ssh连接到机器。所以我不知道从哪里开始。通常当没有泊坞时我只添加

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. 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

4 个答案:

答案 0 :(得分:2)

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

您需要指定哪个端口应该发布",即哪个端口应该来自"外部"到"里面"您的mysql容器。

为实现这一目标,您可以在执行-p时指定docker run选项,或将其添加到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

答案 1 :(得分:2)

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

希望它有所帮助。

答案 2 :(得分:2)

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

示例:

ports:
      - '3308: 3306'

我就是这样解决了我的问题。

答案 3 :(得分:-1)

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

这对我有用。 mysql configuration doc:bind_address