允许 Docker 容器使用宿主机的 MySQL 数据库
首先,在不使用 host 模式的情况下,容器是不可以直接访问宿主机的服务的(可以 PING 通宿主机的 IP)。
其次,每次 docker compose down
之后,容器的 IP 是会改变的。
那么,解决步骤如下:
2、创建一个网络 mynetwork:
docker network create mynetwork
3、创建的容器中添加内容:
networks:
mynetwork:
external: true
services:
myweb:
...
networks:
- mynetwork
4、(必须)先运行该容器
docker compose up -d
5、查看相关的 IP 信息
mynetwork 的 IP(同时也是容器的 IP):
此方式下,重置容器时,不会变更该容器的 IP。
容器 IP:MY_NETWORK
docker network inspect mynetwork | grep IPv4Address
宿主机 IP:HOST_NETWORK
docker network inspect mynetwork | grep Gateway
建议使用通配符号。比如容器 IP 为 172.16.31.2
,那么在下面创建数据库用户时,此 IP 改为 172.16.%
6、将该 MySQL 的 IP 设置为该 IP:
宝塔配置如下图
若使用命令行,则将下面内容在宿主机的 MySQL 命令行中执行 (注意将 MY_NETWORK_IPADDRESS 改为实际的容器 IP)
# 创建用户
CREATE USER 'DBUSER'@'MY_NETWORK' IDENTIFIED WITH mysql_native_password BY 'DB_PASSWORD';
# 分配数据库给用户
GRANT ALL ON DBNAME.* TO 'DBUSER'@'MY_NETWORK' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;
更多 MySQL 教程
7、刷新权限:
FLUSH PRIVILEGES;
8、有时候,有内部防火墙 ufw,则需要将 3306 端口对该 IP 启用:
ufw allow from MY_NETWORK_IPADDRESS to any port 3306
9、在容器中使用宿主机的 MYSQL 时,需要使用宿主机的 IP:HOST_NETWORK
,即
mysql -u DBUSER -p DB_PASSWORD -h HOST_NETWORK