我有两台机器。我的计算机使用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
为了使事情更简单,我可以说我只使用第二种方法。
我不喜欢:
防火墙的结果
sudo netstat -tunlp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 24717/docker-proxy
答案 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