【问题标题】:Docker / MySQL - Doctrine Migration - Access Database outside containerDocker / MySQL - 学说迁移 - 访问容器外的数据库
【发布时间】:2021-10-20 13:52:16
【问题描述】:

你好 :) 这是我的 docker compose :

version: "3.8"

services:
  web-server:
    build: .
    volumes:
      - ./:/var/www/html/
    ports:
      - "8000:80"
    links:
      - "db:db"
  db:
    image: mysql:5.6
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8001:80"
    links:
      - "db:db"
    environment:
      MYSQL_USERNAME: root
      MYSQL_ROOT_PASSWORD: root

如您所见,当我使用 http://localhost:8001/ 访问 phpmyadmin 时,我有:

PhpMyAdmin Dashboard

Doctrine Migation 已安装在我的项目中,所以当我尝试时:

./vendor/bin/doctrine-migrations status

错误是:

在 AbstractMySQLDriver.php 第 112 行:
驱动程序发生异常:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
在 Exception.php 第 18 行:
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename or servname provided, or not known
在 PDOConnection.php 第 39 行:
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename or servname provided, or not known
在 PDOConnection.php 第 39 行:
PDO::__construct(): php_network_getaddresses: getaddrinfo failed: nodename or servname provided, or not known

我的 env 文件中的连接是:

BDD = pdo-mysql://root:root@db:3306/playlist_maker_multi

我在我的 docker-compose 上公开了 3306 端口,所以我不明白为什么在我的容器之外我无法访问我的数据库?

谢谢大家,如果你有解释。 祝你今天过得愉快。 卡米尔

【问题讨论】:

  • 要明确一点,您是在网络上容器内的项目(例如,作为“网络服务器”的一部分)还是在网络外的项目(即在您的本地机器上正常运行)?
  • 当我在我的 docker 容器中运行 Doctrine Migration 时,我没有任何问题。我以为我可以在网络之外使用学说?我以为我的“db”主机名将与 3306:3306 一起公开:/ 似乎不是:D

标签: mysql docker doctrine


【解决方案1】:

您可以尝试使用此配置运行它吗

我将db服务重命名为mysql,显式添加了一个网络并使你的php服务依赖于mysql,所以它会重新启动直到建立连接,以防php容器在mysql容器之前开始运行

version: "3.8"

services:
  web-server:
    build: .
    volumes:
      - ./:/var/www/html/
    ports:
      - "8000:80"
    links:
      - "mysql:db"
  mysql:
    image: mysql:5.6
    container_name: db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - net
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8001:80"
    links:
      - "mysql:db"
    depends_on:
      - mysql
    restart: on-failure
    environment:
      MYSQL_USERNAME: root
      MYSQL_ROOT_PASSWORD: root
    networks:
      - net
networks:
  net:
    driver: bridge

【讨论】:

  • 感谢您的回答,当我运行我的学说命令时,它似乎没有任何改变。但是你的配置很有趣,如果我认为我会使用它。
【解决方案2】:

对于在您的主机上运行但在您的 Docker 网络之外(即非容器化)需要连接到容器的应用程序,您可以使用 localhost 而不是 db,因为 DNS 名称 db 仅在 Docker Compose 网络中有效。

与:

mysql:
  image: mysql:5.6
  container_name: db
  ports:
  - "3306:3306"

您正在创建从locahost:3306(或MACHINEIP:3306,如果在另一台机器上)到网络内mysql:3306 上的服务的路径。

【讨论】:

    【解决方案3】:

    @clarj,你是这个意思吗?

    version: "3.8"
    
    services:
      web-server:
        build: .
        volumes:
          - ./:/var/www/html/
        ports:
          - "8000:80"
        links:
          - "localhost:db"
      mysql:
        image: mysql:5.7
        container_name: db
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: root
      phpmyadmin:
        image: phpmyadmin/phpmyadmin
        ports:
          - "8001:80"
        links:
          - "localhost:db"
        environment:
          MYSQL_USERNAME: root
          MYSQL_ROOT_PASSWORD: root
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2018-01-26
    • 2017-11-30
    • 2022-06-26
    • 2019-12-28
    相关资源
    最近更新 更多