Docker中如何将MySQL运行在不同端口?

49

我想要修改MySQL Docker容器的默认公开端口,但是如果我尝试使用以下命令:

 docker run --detach --name=test-mysql -p 52000:52000  --env="MYSQL_ROOT_PASSWORD=mypassword" mysql

无法正常工作。 mysql -uroot -pmypassword -h 127.0.0.1 -P 52000 警告:在命令行界面上使用密码可能不安全。 错误2013(HY000):在读取初始通信数据包时丢失到MySQL服务器的连接,系统错误:0

如果我使用标准端口3306:3306,则可以正常工作,但是我想更改端口,这可行吗?

我已经尝试过-p 52000:3600,但我始终收到以下消息:

mysql -uroot -pmypassword -h 127.0.0.1 -P 52000 警告:在命令行界面上使用密码可能不安全。 错误2013(HY000):在读取初始通信数据包时丢失到MySQL服务器的连接,系统错误:0


9
使用“-p 52000:3306”参数是什么意思? - Che-Chia Chang
不起作用,我已经尝试过了。 - lbottoni
这是一个解决方案,关闭我的Windows防火墙后,连接正常工作。 - lbottoni
2个回答

62
你需要将容器端口3306映射到首选TCP端口(即您的服务器上的端口):
-p <host_port>:<container_port> (map container_port xx on host_port yy)

所以针对你的 MySQL

docker run --detach --name=test-mysql -p 52000:3306  --env="MYSQL_ROOT_PASSWORD=mypassword" mysql

$ docker run --detach --name=test-mysql -p 52000:3306 --env="MYSQL_ROOT_PASSWORD=mypassword" mysql 0ce69064b76e48088a9886ee7d084775de9afbc30d1db436ca928bc3fdff707bmymachine@MACHINE C:\wamp\bin\mysql\mysql5.6.17\bin $ mysql -uroot -pmypassword -h 127.0.0.1 -P 52000 警告: 在命令行界面上使用密码可能不安全。 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0没有作用,我已经尝试过了。 - lbottoni
@user1326966 可能你的 IP 不正确。你将 52000 映射到了你服务器的公网 IP 上。这意味着你不能使用 127.0.0.1。(只有从容器内部才能使用 127.0.0.1:3306 访问它。但是要从外部访问你的容器,你需要使用 server-ip:52000,它会内部解析为你的容器 IP:3306)。 - lvthillo
@user1326966 如果你真的想要适应容器端口(我不明白为什么),那么你可以编辑dockerfile并暴露你的端口,而不是3306。然后你可以使用-P 52000在容器内访问它。 - lvthillo

23

还有第二个选项:

不将一个端口映射到另一个端口,而是让 MySQL 本身直接在另一个端口上运行,使用 MYSQL_TCP_PORT 变量。

例如:

docker run --detach --name=test-mysql --env="MYSQL_TCP_PORT=52000" mysql


1
谢谢!MySQL Dockerhub没有将此列为变量,但它确实是一个变量并且可以正常工作。 - Karl Johan Vallner
尽管在官方Docker MySql镜像资源中没有记录,但在使用docker-compose时,MYSQL_TCP_PORT环境变量也是有效的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接