繁体   English   中英

无法连接到 docker 容器中的 MySQL 数据库

[英]Unable to connect to MySQL database in docker container

我真的厌倦了这个。 我已经尝试了所有可能的解决方案,但它仍然拒绝连接。

这是我的 docker-compose 文件:

version: '3'

services:
  # Database
  db:
    image: mysql:5.7
    container_name: db
    restart: always
    env_file: .env
    environment:
      - MYSQL_ROOT_HOST=%
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=$MYSQL_DATABASE
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
    networks:
      - backend
  # Wordpress
  wp:
    depends_on:
      - db
    image: wordpress:php7.3-fpm
    container_name: wordpress
    restart: always
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=$MYSQL_DATABASE
    volumes:
      - ./wordpress:/var/www/html
    networks:
      - backend
  # Nginx
  nginx:
    depends_on:
      - wp
    image: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./wordpress:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
    networks:
      - backend

networks:
  backend:
    driver: bridge

我试过 127.0.0.1, 0.0.0.0, db, docker 检查 db 以获取容器的 ip 地址。 他们都无法连接。 我使用过 Sequel Pro、MySQL Workbench 和 DataGrip。

该设置完全正常。 只是我无法连接到容器外的数据库。

我什至检查了容器中的 mysql 主机权限并得到:

% root

% wordpress (name of the user I created)

...

我错过了什么吗?

为了使用 sql 客户端从主机访问您的数据库,您需要 map 将 MYSQL 数据库端口连接到主机。

在您的 Compose 文件中,将端口映射添加到您的数据库服务。

db: 
  ...
  ports:
    - "3306:3306"

我相信您使用的是基于 Wordpress 服务的默认端口。

然后将您的 SQL 客户端配置为 127.0.0.1 和端口 3306。

您需要考虑几件事。 首先,检查并确保它们在同一个网络上。 您可以通过使用以下命令检查他们的 IP 来做到这一点。

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <continer>

如果不是,那么您可以运行以下命令...

docker network connect bridge <container> 

登录到您的应用程序容器,看看您是否可以访问 MySQL。 如果没有,那么您可能需要确保您的 MySQL 权限设置正确。 为此,您可以运行以下命令。

GRANT ALL PRIVILEGES ON <your db>.* TO <your user>@<IP of APP> IDENTIFIED BY 'your password';

您甚至可以通过 @% 授予所有 IP 地址的权限以进行测试。

接着...

FLUSH PRIVILEGES;

真的应该这么简单。

MYSQL 更改

  • c:\programdata\mysql\mysql server 8.0 中MY.ini 更改添加Bind_address=0.0.0.0

  • 另存为管理员 - 检查时间戳

  • 创建一个应用程序用户 - 不要用户 mysql 应用程序的根用户

drop user 'username'@localhost;
FLUSH PRIVILEGES;
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
  • 重启 MYSQL 服务器
  • 为 Windows 重启 Docker
  • 检查 C:\Windows\System32\drivers\etc 中的 Hosts 文件是否正确更新了 host.docker.internal 变量
# Added by Docker Desktop
10.0.0.6 host.docker.internal
10.0.0.6 gateway.docker.internal

应用程序更改:

用户host.docker.internal in JDBC URL in app.properties

spring.datasource.url=jdbc:mysql://host.docker.internal:3306/test
spring.datasource.username=username
spring.datasource.password=password

maven install应该可以工作

docker run <repo/repo>:image应该可以正常工作。 现在

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM