简单的docker容器:构建专用映像或mount config作为卷?

时间:2017-06-08 14:51:56

标签: docker docker-compose dockerfile docker-stack

我正在整理一个docker-compose.yml文件,为我正在处理的项目运行多项服务。该项目有一个Magento和Wordpress网站,位于同一个域下,“同一域”方面需要一个非常简单的nginx容器来将请求路由到任一服务。

所以我将这个架构设计为4个容器(visualisation):

  • “magento”容器,使用内部项目特定图像。
  • “wordpress”容器,使用内部项目特定的图像。
  • 运行mysql:5.6的“db”容器,其中init db dumps挂载在/docker-entrypoint-initdb.d
  • 运行nginx:alpine并在/etc/nginx/nginx.conf处安装自定义配置的“路由器”容器。这用作反向代理,设置了两个位置指令。 location /路由到“magento”,location /blog路由到“wordpress”。

我想保持简单并避免构建不必要的自定义图像,但在“路由器”的上下文中我不确定我所做的是最好的方法,或者如果这样做会更好特定的图像。

我倾向于将当前的自定义配置安装到nginx:alpine容器中的方法,因为配置特定于正在运行的堆栈 - 它作为单个独立容器没有意义。

所以这两种方法没有自定义图像,我们在docker-compose.yml

中有以下内容
      router:
        image: nginx:alpine
        networks:
          - projectnet
        ports:
          - "80:80"
        volumes:
           - "./router/nginx.conf:/etc/nginx/nginx.conf"

否则,我们有Dockerfile包含以下内容,正如我在互联网和其他StackOverflow响应中看到的那样。

    FROM nginx:alpine

    ADD nginx.conf /etc/nginx/

是否有人支持/反对任何一种方法?

1 个答案:

答案 0 :(得分:1)

如果你在'烘烤' nginx配置(你的第二种方法)

ADD nginx.conf /etc/nginx/

它使你的docker容器更加可移植 - 也就是说,它们可以在任何能够运行docker的服务器上下载和运行,它只会起作用。

如果您使用选项1,在运行时安装配置文件,那么您将一个依赖项传输到容器的外部。这使得它成为依赖关系,必须在docker的外部进行管理。

在我看来,最好在dockerfiles中放置尽可能多的依赖项,因为它使它们更具可移植性和更高的自动化(例如,非常适合CI管道)

在运行时安装文件是有原因的,这些通常以环境特定的设置为中心(尽管这些也可以在docker中很大程度上克服)或“敏感”。应用程序开发人员不应该或无法访问的文件。例如ssl证书,数据库密码等