容器里Nginx、MySQL的配置文件、日志是否应该挂载到宿主上?


一、容器里Nginx、MySQL的配置文件、日志是否应该挂载到宿主上?如果不挂载到宿主,每次修改配置文件,都需要保存镜像;如果挂载到宿主,启动容器前,需要先把配置文件拷贝到宿主相应的目录;哪一种方式比较好呢?

二、A容器挂载了卷1,将A容器保存成镜像,根据镜像启动B容器,启动B容器时未挂载卷,B容器内仍然存在卷1,且无法删除,请问这是什么原因?如何删除卷1?
已邀请:

shlallen - DaoCloud软件工程师,合伙人

赞同来自: DockOne 田浩浩 -无夏之年- feifei435 lojunren styshoo itbj00更多 »


您好,配置和日志均是Docker内部比较棘手的问题。

先说日志,如果将日志存储在容器内部,自然意义不大;如果将日志存储于宿主的volume中,似乎可以做到持久化,也便于管理查看,但是对于迁移,横向扩展会造成不少的不便。是否可以尝试将日志通过一个log服务来完成,同时将log服务也dockerize,这样的话,问题就回归到了应用容器与log服务容器通信的问题上了。

关于配置,在Docker Container概念中,如果还是把配置文件和镜像捆绑在一起的话,就失去了配置文件动态配置的意义了,的确不建议这么做。除此之外,正如博主所言,可以将配置文件通过volume的形式挂载到容器内部,用户在宿主管理配置,应用程序在容器内部使用配置。另外,还可以使用环境变量的方式来使用配置,当然如果配置较多的话,使用Docker 原生态的docker client来传输环境变量很不方便,如果使用第三方的dockerclient来使用的话,会较方便,如dockerclient in go,docker-py等。

苦逼少侠 - 去哪儿网互联网研发工程师,docker爱好

赞同来自: 田浩浩 itbj00


我的想法刚好和你想反,我都是在宿主机改配置,然后挂载到容器里面用,持久化可复用,和容器无关。目前nginx MySQL zookeeper等我都是这么处理。

icebolt - Docker爱好者暗黑

赞同来自: tonynba itbj00


配置文件看具体是什么配置,容器启动和删除是非常容易的,所以配置文件我一般的方法是,启动的时候生成。不同环境配置不同,我一般都是通过启动的时候传入env变量来解决。

至于配置文件的版本控制,一般是通过git来统一管理。配置文件做版本变更的时候,我会重启新的容器,热切换后,删除旧容器。

日志一般的处理方法是放到宿主的固定目录,通过卷挂载到容器内。然后再通过日志管理收集到日志处理的服务器进行统一的分析。

难易 - 华为杭州研究院PaaS开发者

赞同来自: -无夏之年-


配置最大的问题是,不同程序的配置的逻辑完全不同,有些是ini格式,有些是json或者yaml,xml格式,这些配置起作用的机制也完全不一样。生命周期不同。

做的重了,就是搞一个配置中心,用zookeeper或者etcd来存放数据,客户端通过sdk来存取配置。但这就要倾入用户代码。

做的轻一些,通过环境变量注入,就像heroku或者deis或者flynn那样,又不一定够用,例如java程序很多就偏好xml。

我的看法是,首先要定义配置信息的生命周期,配置信息的生命周期是否和容器的一致?如果一致的话,可以在创建容器的时候去做注入……

xautll

赞同来自:


配置文件通过zookeeper做集中管理,log的话存储在volume中即可

要回复问题请先登录注册