简体   繁体   English

Docker 无法连接到运行 docker-compose up 的 MySQL

[英]Docker can't connect to MySQL running docker-compose up

I am using this Docker config: https://github.com/romaricp/kit-starter-symfony-4-docker我正在使用这个 Docker 配置: https : //github.com/romaricp/kit-starter-symfony-4-docker

I start the environment by using:我使用以下方法启动环境:

docker-compose build docker-compose 构建

followed by:其次是:

docker-compose up -d docker-compose up -d

Everything is running fine but there is a problem with MySQL service.一切正常,但 MySQL 服务出现问题。 I get an Symfony error:我收到一个 Symfony 错误:

"An exception occurred in driver: could not find driver" “驱动程序发生异常:找不到驱动程序”

as well as PMA error when I try to login to DB:以及当我尝试登录数据库时的 PMA 错误:

mysqli_real_connect(): php_network_getaddresses: getaddrinfo failed: Name does not resolve mysqli_real_connect(): php_network_getaddresses: getaddrinfo 失败: 名称无法解析

Any idea how could I make it work?知道我怎么能让它工作吗?

docker-compose.yml: docker-compose.yml:

version: '3'
services:
apache:
    build: .docker/apache
    container_name: sf4_apache
    ports:
      - 80:80
    volumes:
      - .docker/config/vhosts:/etc/apache2/sites-enabled
      - .:/home/wwwroot/sf4
    depends_on:
      - php

mysql:
    image: mysql
    container_name: sf4_mysql
    volumes:
        - .docker/data/db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sf4
        MYSQL_USER: sf4
        MYSQL_PASSWORD: sf4

php:
    build: .docker/php
    container_name: sf4_php
    volumes:
      - .:/home/wwwroot/sf4
    environment:
      - maildev_host=sf4_maildev
    depends_on:
      - maildev
      - mysql

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: sf4_phpmyadmin
    ports:
        - 8080:80
    links:
        - mysql

maildev:
    image: djfarrelly/maildev
    container_name: sf4_maildev
    ports:
      - 8001:80

Also I opened the mysql logs and I see this:我也打开了 mysql 日志,我看到了这个:

2019-04-07T12:00:30.943414Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. 2019-04-07T12:00:30.943414Z 0 [系统] [MY-010931] [服务器] /usr/sbin/mysqld:准备好连接。 Version: '8.0.15' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.版本:'8.0.15' 套接字:'/var/run/mysqld/mysqld.sock' 端口:3306 MySQL 社区服务器 - GPL。

Maybe the port is wrong and that's why I can't connect?也许端口错误,这就是我无法连接的原因?

I think you're having trouble linking the containers.我认为您在链接容器时遇到了问题。 I suggest that you use a custom network instead of linking.我建议您使用自定义网络而不是链接。 That all containers can see each other所有容器都可以看到彼此

For phpmyadmin service, i think you should set the PMA_HOST and PMA_PORT environment variables like this:对于phpmyadmin服务,我认为您应该像这样设置PMA_HOSTPMA_PORT环境变量:

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: sf4_phpmyadmin
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
        - 8080:80
    links:
        - mysql

Your mysql container should have the command instruction at the start to set the authentication plugin (there is an issue with the connectors with mysql 8), more details here你的 mysql 容器应该在开始时有command指令来设置身份验证插件(mysql 8 的连接器有问题),更多细节在这里

mysql:
    image: mysql
    container_name: sf4_mysql
    command: "--default-authentication-plugin=mysql_native_password"
    volumes:
        - .docker/data/db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sf4
        MYSQL_USER: sf4
        MYSQL_PASSWORD: sf4

in your Symfony app, the connection string is located in .env file, and it should have the following format :在你的 Symfony 应用程序中,连接字符串位于.env文件中,它应该具有以下格式:

DATABASE_URL=mysql:// mysql_user : mysql_user_password @ mysql_host : mysql_port / db_name DATABASE_URL=mysql:// mysql_user : mysql_user_password @ mysql_host : mysql_port / db_name

mysql_user : your mysql user (ex: root) mysql_user :您的 mysql 用户(例如:root)

mysql_user_password : the user's password (ex: root) mysql_user_password :用户的密码(例如:root)

mysql_host : is should contain your mysql container service name located in your docker-compose.yml file (mysql in this case) mysql_host :应包含位于docker-compose.yml文件中的 mysql 容器服务名称(本例中为 mysql)

mysql_port : mysql container internal port (3306, in this case) mysql_port : mysql 容器内部端口(本例中为 3306)

db_name : the database you want to connect to. db_name :要连接的数据库。

the DATABASE_URL can look like this : DATABASE_URL 可以是这样的:

DATABASE_URL=mysql://root:root@mysql:3306/sf4

stop your containers after these changes and start them up again.在这些更改后停止您的容器并再次启动它们。

Hope this will help.希望这会有所帮助。

You have to expose the mysql port 3306:您必须公开mysql端口3306:

  mysql:
    image: mysql
    container_name: sf4_mysql
    volumes:
    - .docker/data/db:/var/lib/mysql
    restart: always
    ports:
    - "3306:3306"
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sf4
        MYSQL_USER: sf4
        MYSQL_PASSWORD: sf4
    networks:
    - default

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

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