docker-compose链接mysql和php容器

时间:2018-02-10 12:35:51

标签: docker docker-compose docker-container

我有一个docker-compose如下:

version: '3.2'
services:
  web:
    build: .
    image: lap
    volumes:
      - ./webroot:/var/www/app
      - ./configs/php.ini:/usr/local/etc/php/php.ini
      - ./configs/vhost.conf:/etc/apache2/sites-available/000-default.conf

    links:
      - dbs:mysql
  dbs:
    image: mysql
    ports:
      - "3307:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - ./configs/conf.d:/etc/mysql/conf.d
      - /var/mysql:/var/lib/mysql   

docker --version

  

Docker版本17.05.0-ce,build 89658be

docker-compose --version

  

docker-compose版本1.13.0,build 1719ceb

lsb_release -a

  

没有可用的LSB模块。   经销商ID:Debian   描述:Debian GNU / Linux 8.10(jessie)   发布:8.10   代号:jessie

如果我在php容器上运行以下命令并检查/ etc / host,我看不到链接(我在使用docker container时链接 - 链接)

docker-compose up -d docker exec -it web_1 bash root@web_1> cat /etc/hosts

  

127.0.0.1 localhost

     

:: 1 localhost ip6-localhost ip6-loopback

     

fe00 :: 0 ip6-localnet

     

ff00 :: 0 ip6-mcastprefix

     

ff02 :: 1 ip6-allnodes

     

ff02 :: 2 ip6-allrouters

     

172.18.0.3 9c401ea7d031

dbs容器被分配了127.18.0.2个ip地址,我期待的内容如上所述/etc/hosts

  

127.18.0.2 dbs mysql

我在我的某个Mac OSX系统中看到了相同的行为,可能是我做错了什么或丢失了什么?

2 个答案:

答案 0 :(得分:0)

来自docker-compose的service-name可以访问容器。 docker-compose的links只是此服务名称的别名。它应该可以通过service-namealias-name从同一网络访问。

在你的情况下:

尝试从web ping dbsmysql

答案 1 :(得分:0)

旧版容器链接已弃用,将来会从docker中删除。手头的问题是您希望Web容器与数据库容器通信。

解决方案很简单。

  • 使用环境变量动态定义数据库访问DB_HOST。
  • 在您的应用中加载此环境,如果未定义此变量,则使用localhost127.0.0.1作为后备值。

假设已经完成,你现在可以在你的作品上做到这一点......

您现在可以在dockerfile中定义DB_HOST=dbs

version: '3.2'
    services:
      web:
          build: .
          image: lap
          volumes:
             - ./webroot:/var/www/app
             - ./configs/php.ini:/usr/local/etc/php/php.ini
             - ./configs/vhost.conf:/etc/apache2/sites-available/000-default.conf
          environment:
             - DB_HOST=dbs
      dbs:
          image: mysql
          ports:
             - "3307:3306"
          environment:
             - MYSQL_ROOT_PASSWORD=root
          volumes:
             - ./configs/conf.d:/etc/mysql/conf.d
             - /var/mysql:/var/lib/mysql   

这将解决这个难题。