【问题标题】:Connecting to 'localhost' or '127.0.0.1' with a Docker/docker-compose setup使用 Docker/docker-compose 设置连接到“localhost”或“127.0.0.1”
【发布时间】:2018-08-15 05:14:41
【问题描述】:

似乎是一个常见问题,但在不同的上下文中,但我在使用 Docker 时连接到我的本地主机数据库时遇到问题。

如果我使用docker inspect 检查 mysql 容器并找到 IP 地址并将其用作数据库主机作为 CMS 的一部分,它运行良好...唯一的问题是 mysql 容器 IP 地址更改(每次docker-compose up 并且如果我更改 wifi 网络)理想情况下我想使用 'localhost' 或 '127.0.0.1' 但由于某种原因这会导致 SQLSTATE[HY000] [2002] Connection refused 错误。

如何在 CMS 应用程序中使用“localhost”或“127.0.0.1”作为数据库主机名,这样我就不必在容器 IP 地址更改时不断更改它?

这是我的 docker-compose.yml 文件:

version: "3"

services:
  webserver:
    build:
      context: ./bin/webserver
    restart: 'always'
    ports:
      - "80:80"
      - "443:443"
    links:
      - mysql
    volumes:
      - ${DOCUMENT_ROOT-./www}:/var/www/html
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2
    networks:
      mynet:
          aliases:
            - john.dev
  mysql:
    image: 'mysql:5.7'
    restart: 'always'
    ports:
      - "3306:3306"
    volumes:
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
    networks:
      - mynet
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - '8080:80'
    volumes:
      - /sessions
    networks:
      - mynet
networks:
  mynet:

【问题讨论】:

标签: docker


【解决方案1】:

尝试使用mysql 而不是localhost

您正在定义webserver 容器和mysql 容器之间的链接,因此webserver 容器能够解析mysql IP。

根据Docker documentation:

Docker Cloud 为您的容器提供了两种查找其他服务的方式:

  • 直接使用服务和容器名称作为主机名

  • 使用基于 Docker Compose 链接的服务链接

服务和容器主机名在服务时自动更新 扩大或缩小或重新部署。作为用户,您可以配置服务 名称,Docker Cloud 使用这些名称来查找 为您提供服务和容器。您可以在代码中使用主机名 提供允许您轻松交换服务容器的抽象 或组件。

服务链接创建环境变量,允许容器 在堆栈内相互通信,或与其他服务通信 在堆栈之外。您可以明确指定服务链接,当您 创建新服务或编辑现有服务,或在 服务堆栈的堆栈文件。

来自Docker compose documentation

可以通过与别名相同的主机名访问链接服务的容器,如果未指定别名,则使用服务名。

【讨论】:

  • 这行得通!几个小时以来,我一直试图弄清楚这一点。那么“链接”是否必要?如果我不这样做会是什么问题?刚刚学习...但感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2020-05-29
  • 2022-07-01
  • 2017-07-28
  • 2021-05-16
  • 2021-09-30
  • 2016-05-24
相关资源
最近更新 更多