如何连接到远程机器上的 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
为了使事情更简单,假设我只使用第二种方法。
我没有 :
- 1.mysql-client, mysql-server or mysql 在IP2机器上
- 2.and 我没有在任何地方设置绑定到 0.0.0.0,因为我想直接连接到 mysql 容器。可能我必须设置它
绑定到此容器内的 0.0.0.0。
防火墙的结果
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
对于那些即使在所有这些提示之后仍无法连接的人。考虑使用另一个端口
示例:
ports:
- '3308: 3306'
我这样解决了我的问题。
我有两台机器。我的机器 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
为了使事情更简单,假设我只使用第二种方法。
我没有 :
- 1.mysql-client, mysql-server or mysql 在IP2机器上
- 2.and 我没有在任何地方设置绑定到 0.0.0.0,因为我想直接连接到 mysql 容器。可能我必须设置它 绑定到此容器内的 0.0.0.0。
防火墙的结果
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
对于那些即使在所有这些提示之后仍无法连接的人。考虑使用另一个端口
示例:
ports:
- '3308: 3306'
我这样解决了我的问题。