在使用 Docker 部署 MySQL 数据库时,有时会遇到不能远程连接的问题。这个问题一般是由于 MySQL 的安全设置以及 Docker 网络设置造成的。本文将介绍如何解决 MySQL 容器不能远程连接的问题。
问题描述
使用 Docker 部署 MySQL 数据库,并将其暴露出端口,但是在其他机器上不能通过 MySQL 客户端连接 MySQL 容器。
解决方法
方法一:在容器内部设置 MySQL 安全设置
在 MySQL 容器内部,可以通过以下命令设置 MySQL 的安全设置:
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Password' WITH GRANT OPTION; FLUSH PRIVILEGES;"
其中,Password
是要设置的 MySQL 密码。这个命令可以在容器启动后执行,也可以在 Dockerfile 中设置。
方法二:在 Dockerfile 中设置 MySQL 安全设置
在 Dockerfile 中,可以使用以下命令设置 MySQL 的安全设置:
RUN echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Password' WITH GRANT OPTION; FLUSH PRIVILEGES;" | mysql -uroot -p
这个命令可以在创建 Docker 镜像时执行。
方法三:在 Docker Compose 中设置 MySQL 安全设置
在 Docker Compose 文件中,可以使用以下代码设置 MySQL 的安全设置:
// javascriptcn.com 代码示例 environment: MYSQL_ROOT_PASSWORD: Password MYSQL_DATABASE: database MYSQL_USER: user MYSQL_PASSWORD: password command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake --enable-named-pipe --bind-address=0.0.0.0 --max-allowed-packet=1G
其中,Password
是要设置的 MySQL 密码。
方法四:设置 Docker 网络
在 Docker 中,容器之间默认是互相隔离的,并且容器内部 IP 地址不会被暴露出来。如果要让容器之间可以互相访问,可以通过 Docker 网络来实现。
在创建容器时,可以使用以下命令将容器加入同一个网络:
docker network create mynet docker run --name mysql --network mynet -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Password -d mysql:latest
其中,mynet
是网络名,mysql
是容器名。通过这种方式,MySQL 容器可以被其他容器访问。
示例代码
FROM mysql:latest RUN echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Password' WITH GRANT OPTION; FLUSH PRIVILEGES;" | mysql -uroot -p
// javascriptcn.com 代码示例 version: '3' services: db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: Password MYSQL_DATABASE: database MYSQL_USER: user MYSQL_PASSWORD: password command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake --enable-named-pipe --bind-address=0.0.0.0 --max-allowed-packet=1G ports: - "3306:3306" networks: - mynet networks: mynet:
总结
通过以上方法,我们可以解决 Docker MySQL 容器不能远程连接的问题。其中,方法一和方法二是在容器内部设置 MySQL 安全设置,方法三是在 Docker Compose 中设置 MySQL 安全设置,方法四是通过 Docker 网络实现容器之间的互相访问。在实际应用中,可以根据需要选择合适的方法来解决这个问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654c95f97d4982a6eb60aa45