使用 docker-compose 相互链接 docker 容器时如何处理 IP 地址?
How to handle IP addresses when linking docker containers with each other using docker-compose?
我正在使用 docker-compose 构建完整的开发堆栈。
应用程序需要 mysql 服务器才能工作。
mysql 服务器是由 docker-compose 设置的外部容器:
mysql:
image: mysql:5.6
volumes:
- /data/mysql:/var/lib/mysql
- ./docker/mysql.d:/etc/mysql/conf.d
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
应用程序有自己的 docker-compose.yml 并引用 mysql 容器:
my-application:
build: . # the Dockerfile resides in the current folder
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:mysql
environment:
DOCKER_ENVIRONMENT: dev
DB_NAME: local_db
DB_PASS: password
DB_USER: root
DB_HOST: # how to set the mysql's IP address?
我无法在 docker-compose 中传递它们,因为它是动态的。
我知道应用程序知道 mysql IP 地址,因为我设置了某些变量:
application-container$ env|grep ADDR
MYSQL_PORT_3306_TCP_ADDR=172.17.0.241
但这不是我要求的DB_HOST
。
我能否以某种方式将变量映射到 DB_HOST
或进行不同的设置?
您不必设置 IP,但您可以引用容器的虚拟 主机名,这与您命名 linked 的值相同容器。
这意味着您确实可以在 docker-compose.yml
中设置 DB_HOST,可以使用 links
(推荐)或 external_links
:
your_application:
build: .
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:docker-mysql
environment:
DB_HOST: docker-mysql
当您连接到您的 docker 容器时,您可以连接到您的 mysql 容器:
application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360
当您 link 容器来自同一个 docker-composer.yml 时,它的工作原理相同。
这也是documented:
Link to containers in another service. Either specify both the service
name and the link alias (SERVICE:ALIAS), or just the service name
(which will also be used for the alias).
links:
- db
- db:database
- redis
An entry with the alias' name will be created in /etc/hosts inside
containers for this service, e.g:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
Environment variables will also be created - see the environment
variable reference for details.
我正在使用 docker-compose 构建完整的开发堆栈。
应用程序需要 mysql 服务器才能工作。
mysql 服务器是由 docker-compose 设置的外部容器:
mysql:
image: mysql:5.6
volumes:
- /data/mysql:/var/lib/mysql
- ./docker/mysql.d:/etc/mysql/conf.d
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
应用程序有自己的 docker-compose.yml 并引用 mysql 容器:
my-application:
build: . # the Dockerfile resides in the current folder
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:mysql
environment:
DOCKER_ENVIRONMENT: dev
DB_NAME: local_db
DB_PASS: password
DB_USER: root
DB_HOST: # how to set the mysql's IP address?
我无法在 docker-compose 中传递它们,因为它是动态的。
我知道应用程序知道 mysql IP 地址,因为我设置了某些变量:
application-container$ env|grep ADDR
MYSQL_PORT_3306_TCP_ADDR=172.17.0.241
但这不是我要求的DB_HOST
。
我能否以某种方式将变量映射到 DB_HOST
或进行不同的设置?
您不必设置 IP,但您可以引用容器的虚拟 主机名,这与您命名 linked 的值相同容器。
这意味着您确实可以在 docker-compose.yml
中设置 DB_HOST,可以使用 links
(推荐)或 external_links
:
your_application:
build: .
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:docker-mysql
environment:
DB_HOST: docker-mysql
当您连接到您的 docker 容器时,您可以连接到您的 mysql 容器:
application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360
当您 link 容器来自同一个 docker-composer.yml 时,它的工作原理相同。
这也是documented:
Link to containers in another service. Either specify both the service name and the link alias (SERVICE:ALIAS), or just the service name (which will also be used for the alias).
links: - db - db:database - redis
An entry with the alias' name will be created in /etc/hosts inside containers for this service, e.g:
172.17.2.186 db 172.17.2.186 database 172.17.2.187 redis
Environment variables will also be created - see the environment variable reference for details.