【发布时间】:2016-01-06 09:18:56
【问题描述】:
我正在使用 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 或进行不同的设置吗?
【问题讨论】:
-
为什么你的 mysql 服务器在一个外部的 docker-composer.yml 文件上?这真的需要吗?通常,如果您有需要一起运行的容器化应用程序,则必须仅在一个 docker-composer.yml 中进行配置。
-
@nessuno 我想将那个 mysql 容器用于多个项目。我不需要 12 台 mysql 服务器飞来飞去。此外,我将 mysql 数据映射到位于
/data/mysql的大型 HDD,因为 mysql 数据库可能变得非常庞大。如果你有多个 mysql 实例映射到同一个文件夹会导致文件系统锁定问题。 -
你可以把mysql容器配置和你的应用程序放在一起,我猜你只需要运行带有
--no-recreate标志的docker-compose。之后你只有一个 mysql 容器,你可以直接在 docker-compose.yml 文件中使用他的名字引用那个容器。因此使DB_HOST: mysql. -
@nessuno 然而,当我有另一个项目也需要一个 mysql 容器时,如果两个 mysql 容器都启动了,我将拥有两个 mysql 容器。如果两者都映射到同一个目录,它们就会互相锁定。我只想要一个 mysql 容器,用于我可能在我的机器上开发的所有应用程序。
-
旁注:我不认为我最初的目标是让外部数据库容器成为一个好的解决方案。相反,每个应用程序堆栈都应该独立工作。
标签: docker ip docker-compose