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-name
或 alias-name
.
从同一网络访问
你的情况:
尝试从 web
ping 到 dbs
或 mysql
。
旧版容器链接已弃用,并将在未来某个时间从 docker 中删除。手头的问题是您希望您的 web 容器与您的 db 容器通信。
解决方法很简单。
- 使用环境变量动态定义数据库访问DB_HOST。
- 在您的应用程序中加载此环境,如果未定义此变量,则使用
localhost
或 127.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
这将解决这个难题。
我有一个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-name
或 alias-name
.
你的情况:
尝试从 web
ping 到 dbs
或 mysql
。
旧版容器链接已弃用,并将在未来某个时间从 docker 中删除。手头的问题是您希望您的 web 容器与您的 db 容器通信。
解决方法很简单。
- 使用环境变量动态定义数据库访问DB_HOST。
- 在您的应用程序中加载此环境,如果未定义此变量,则使用
localhost
或127.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
这将解决这个难题。