使用Docker / docker-compose设置连接到'localhost'或'127.0.0.1'

时间:2018-08-14 20:35:41

标签: docker

似乎是一个常见的问题,但是具有不同的上下文,但是在使用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:

1 个答案:

答案 0 :(得分:1)

尝试使用mysql代替localhost

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

根据Docker documentation:

  

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

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

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

  •   
     

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

     

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

来自Docker compose documentation

  

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