使用 Docker 管理 dev/test/prod 环境
Managing dev/test/prod environments with Docker
关于这个主题似乎有一些相互矛盾的信息。我是 Docker 的新手,需要一些帮助。我有几个 docker 容器到 运行 一个应用程序,有些容器需要不同的配置文件来进行本地开发和生产。我似乎无法找到一种巧妙的方法来使用 Docker 自动执行此操作。
我的包含自定义配置的容器是 Nginx、Freeradius,我的 code/data 容器是 Laravel 因此需要一个 .env.php 文件(目前是 L4.2)。
我已经在 docker compose 中尝试了 Dockers 环境变量:
docker-compose.yml:
freeradius:
env_file: ./env/freeradius.env
./env/freeradius.env
DB_HOST=123.56.12.123
DB_DATABASE=my_database
DB_USER=me
DB_PASS=itsasecret
除非我无法在 /etc/freeradius/mods-enabled/sql
需要的地方选取这些变量。
如何将 Docker 变为 运行 作为具有本地配置的 'local' 容器,或作为具有生产配置的 'production' 容器而无需实际构建不同的容器容器,而无需附加到每个容器来手动配置它们。我需要它自动化,因为这最终将用于相当大的生产环境,该环境将拥有包含许多实例的大型服务器集群。
很高兴学习 Ansible,如果这是人们实现这一目标的方式。
如果您不能使用环境变量来配置应用程序(这是我对问题的理解),那么另一种选择是使用卷来提供配置文件。
您可以将 "data volume containers"(仅用于共享文件和目录的容器)与 volumes_from
一起使用,也可以使用命名卷。
数据卷容器
如果采用 "data volume container" 路线,您将创建一个包含所有环境配置文件的容器。每个需要文件的服务都使用 volumes_from: - config
。在开发中你会有这样的东西:
configs:
build: dev-configs/
freeradius:
volumes_from:
- configs
dev-configs
目录将需要一个 Dockerfile
来构建映像,它将有一堆 VOLUME
指令用于所有配置路径。
对于生产(和其他环境),您可以创建一个覆盖文件,用不同的容器替换配置服务:
docker-compose.prod.yml:
configs:
build: prod-configs/
您可能还想在开发和生产之间更改其他设置,这些设置也可以放入此文件中。然后你 运行 使用覆盖文件编写:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
您可以在此处了解更多信息:http://docs.docker.com/compose/extends/#multiple-compose-files
命名卷
如果您选择 "named volume" 路线,配置起来会更容易一些。在 dev 上,您使用 docker volume create thename
创建一个卷并将一些文件放入其中。在您的配置中直接使用它:
freeradius:
volumes:
- thename:/etc/freeradius/mods-enabled/sql
在生产中,您需要在每台主机上创建该命名卷,或者使用支持多主机的卷驱动程序插件(我相信 flocker 就是其中一个例子)。
使用 Dockerize 的运行时配置
最后,另一个不涉及卷的选项是使用 https://github.com/jwilder/dockerize,它允许您在 运行 时间从环境变量生成配置。
关于这个主题似乎有一些相互矛盾的信息。我是 Docker 的新手,需要一些帮助。我有几个 docker 容器到 运行 一个应用程序,有些容器需要不同的配置文件来进行本地开发和生产。我似乎无法找到一种巧妙的方法来使用 Docker 自动执行此操作。
我的包含自定义配置的容器是 Nginx、Freeradius,我的 code/data 容器是 Laravel 因此需要一个 .env.php 文件(目前是 L4.2)。
我已经在 docker compose 中尝试了 Dockers 环境变量:
docker-compose.yml:
freeradius:
env_file: ./env/freeradius.env
./env/freeradius.env
DB_HOST=123.56.12.123
DB_DATABASE=my_database
DB_USER=me
DB_PASS=itsasecret
除非我无法在 /etc/freeradius/mods-enabled/sql
需要的地方选取这些变量。
如何将 Docker 变为 运行 作为具有本地配置的 'local' 容器,或作为具有生产配置的 'production' 容器而无需实际构建不同的容器容器,而无需附加到每个容器来手动配置它们。我需要它自动化,因为这最终将用于相当大的生产环境,该环境将拥有包含许多实例的大型服务器集群。
很高兴学习 Ansible,如果这是人们实现这一目标的方式。
如果您不能使用环境变量来配置应用程序(这是我对问题的理解),那么另一种选择是使用卷来提供配置文件。
您可以将 "data volume containers"(仅用于共享文件和目录的容器)与 volumes_from
一起使用,也可以使用命名卷。
数据卷容器
如果采用 "data volume container" 路线,您将创建一个包含所有环境配置文件的容器。每个需要文件的服务都使用 volumes_from: - config
。在开发中你会有这样的东西:
configs:
build: dev-configs/
freeradius:
volumes_from:
- configs
dev-configs
目录将需要一个 Dockerfile
来构建映像,它将有一堆 VOLUME
指令用于所有配置路径。
对于生产(和其他环境),您可以创建一个覆盖文件,用不同的容器替换配置服务:
docker-compose.prod.yml:
configs:
build: prod-configs/
您可能还想在开发和生产之间更改其他设置,这些设置也可以放入此文件中。然后你 运行 使用覆盖文件编写:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
您可以在此处了解更多信息:http://docs.docker.com/compose/extends/#multiple-compose-files
命名卷
如果您选择 "named volume" 路线,配置起来会更容易一些。在 dev 上,您使用 docker volume create thename
创建一个卷并将一些文件放入其中。在您的配置中直接使用它:
freeradius:
volumes:
- thename:/etc/freeradius/mods-enabled/sql
在生产中,您需要在每台主机上创建该命名卷,或者使用支持多主机的卷驱动程序插件(我相信 flocker 就是其中一个例子)。
使用 Dockerize 的运行时配置
最后,另一个不涉及卷的选项是使用 https://github.com/jwilder/dockerize,它允许您在 运行 时间从环境变量生成配置。