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

问题描述 投票:0回答:6

我有两台机器。我的机器带有

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

[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
mysql docker remote-access ports
6个回答
7
投票

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

示例:

ports:
      - '3308: 3306'

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


6
投票

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

希望有帮助。


3
投票

您没有指定如何运行 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

在此处了解有关发布端口的更多信息。


0
投票
您可以修改您的

my.cnf

 并添加 
bind_address=0.0.0.0

这对我有用。

mysql配置文档:bind_address


0
投票
如果 mysql 服务器和客户端是 8.x 版本,请尝试

--protocol=TCP
到mysql客户端参数


0
投票
Docker 端口映射是您唯一需要配置的东西。

但是,如果您仍然无法远程评估 MySQL,请检查防火墙设置。

© www.soinside.com 2019 - 2024. All rights reserved.