我有两台机器。我的机器带有
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
为了让事情变得更简单,可以说我只使用第二种方法。
我没有:
防火墙的结果
sudo netstat -tunlp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 24717/docker-proxy
对于那些即使在所有这些提示之后仍未能成功连接的人。考虑使用另一个端口
示例:
ports:
- '3308: 3306'
我就是这样解决我的问题的。
我认为你的 mysql 容器正在侦听 ipv6 (查看你的 netstat 结果)。原因可能是你的docker配置。我不知道如何解决它,我个人只是在我的 docker 主机上关闭 ipv6 以避免这个问题。
希望有帮助。
您没有指定如何运行 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
--protocol=TCP
到mysql客户端参数
但是,如果您仍然无法远程评估 MySQL,请检查防火墙设置。