docker-组合链接 mysql 和 php 容器

docker-compose linking mysql and php containers

我有一个docker-组成如下:

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 version 17.05.0-ce, build 89658be

docker-compose --version

docker-compose version 1.13.0, build 1719ceb

lsb_release -a

No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.10 (jessie) Release: 8.10 Codename: jessie

如果我 运行 遵循命令并检查 php 容器上的 /etc/host 我看不到 linking(当我执行 docker 容器时我看到--link )

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 系统中看到相同的行为,可能是我做错了什么或遗漏了什么?

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

从同一网络访问

你的情况:

尝试从 web ping 到 dbsmysql

旧版容器链接已弃用,并将在未来某个时间从 docker 中删除。手头的问题是您希望您的 web 容器与您的 db 容器通信。

解决方法很简单。

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

假设已完成,您现在可以在撰写时执行此操作...

您现在可以在 docker 文件中定义 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   

这将解决这个难题。