Docker实战问题:使用Dockerfile自己build的镜像,启动多个服务进程,在启动时需要通过启动参数里的常量替换配置文件,怎么实现?


Docker版本:1.7
宿主机系统版本:Ubuntu14/CentOS7(build), MAC/Windos7/8/10(使用)

需求场景:用做集成开发环境,测试环境,演示环境快速部署(一般是虚拟机单机);
基础环境:CentOS
环境依赖:SSH,MySQL,Redis,PHP(有版本要求,扩展较多含私有扩展),Nginx(含第三方模块),Memcache,Elasticsearch等;
服务要求:各个服务都需要开机启动(目前我在启动命令后加/sbin/init实现,使用原生方式启动)
配置要求:配置文件中可能需要修改:路径、域名、优化配置等(我目前思路是启动时通过常量传递,然后运行 CMD定义的脚本执行替换配置文件中相关配置);

因为环境必要复杂,仓库里已有的镜像都不能直接拿来使用,需要自己build;

刚接触Docker不就,目前写Dockerfile,build镜像都没有问题了,还有几个问题没有解决,向各路大神请教:
  1. 容器间通信:目前是link方式,后期单主机可能会起多个Docker容器,以及跨宿主机的容期间通信,目前方案无法满足,为容器配置固定ip是最好的方案,参考网上文档操作未成功;
  2. /sbin/init 启动同时使用CMD脚本:后来通过查看官方文档和inspect信息发现会覆盖掉,启动命令/sinb/init 会覆盖掉Dockerfile里的CMD以及encrp.sh,这种方法走不通,这样通过启动参数获取常量修改配置的需求就无法满足;
  3. 镜像大小:做好的镜像非常大,这样维护和共享就很麻烦,因为Docker会吧dockerfile里的每一层都记录收集并提交,目前我的做法,是提前写好各个服务的部署脚本,然后Dockfile中COPY,然后在执行,完成后在清理软件包和yum/apt-get缓存,单nginx镜像来说比之前节省了100M空间,请教其他更想系的Docker瘦身妙招;
  4. Registry认证:因为都是私有镜像,目前提交到内网Registry中,但是有其他地区同事要用,可能需要开房端口,Resitry认证没找到台详细的资料;


再补充吧。。。
已邀请:

oilbeater - 北大学渣@灵雀云

赞同来自: 郭涛


谢邀
问题比较多,有的我也不是很清楚,就知道的谈一下
  1. 可以尝试使用 host 模式,这样容器和主机共享地址,网络的配置会简单一些,同样也牺牲了隔离性但是如果做内部开发和演示,应该还 ok。如果想保留隔离性的同时跨主机通信目前没有什么太轻量级的方法,我们自己的平台倒是实现了跨主机容器通信,但是方法也很重,涉及了很多网络改造的工作。
  2. 如果可以还是建议使用 Dockerfile 中使用的 cmd 或者 entrypoint 方法,自己写脚本来管理应用的启动,可以一个容器里只放一个服务,用微服务的思想制作镜像会容易一些。然后通过 link 相互传递环境变量,应该可以满足你的需求。
  3. 大小的问题需要在 run 的命令中一行完成安装和清理删除,分到多句删除并不会减小镜像体积。另一方面可以考虑用一些小的 base image 来减小镜像体积比如 alpine,具体的还要看你现在 dockerfile 怎么写才能给出更多建议。
  4. 不知道你用的是新版还是旧版 registry,v2 的 registry 提供了很多种鉴权方式,https://github.com/docker/dist ... 3auth 你可以尝试 htpasswd 的方式,相对容易一些,token 的方式需要自己开发认证系统。或者你也可以在我们的平台开个用户把镜像设置为私有,然后开个 organization 把你的同事拉进来也能完成同样的功能。

hello_liuyi

赞同来自:


执行run命令的时候加入参数-e 设置环境变量, 比如-e 'port=3306' 在容器里面即可直接使用参数$port。

teachmyself - teachmyself

赞同来自:


非常感谢!
1. 先按您的方式处理下,网络改造目前来不及,以后再处理;
2. 一个容器里放一个服务目前业务上不太现实,业务太复杂,拆开的话感觉会更麻烦;
3. 目前是在按以下思路处理的:

将所有需要部署的东西写成shell脚本;
Dockfile里,COPY xx.sh /root/xx.sh, 然后 RUN /root/xx.sh;
部署完以后,执行以下命令清理的:
RUN yum clean all; \
rm -rf /usr/local/src/*;
安装过程中还安装了一些工具,编译器,依赖包之类的东西;
方便的话加下你QQ或者微信直接跟您请教下
  1. 目前用的Resitryv2,我研究下您的方案;非常感谢!

田浩浩 - wizmacau developer

赞同来自:

  1. 容器ip问题,目前官方还没有简便的方法,不推荐研究
  2. Optional:挂载一个环境变量的文件,run.sh运行的时候去读取
  3. 镜像优化(未翻译) OR 参考 Dockerfile实战
  4. Registry还未找到解决办法

要回复问题请先登录注册