摘要:实践四环境容器化最近把公司的环境做了容器化,目前达到的效果是代码提交到,触发将代码部署到测试服务器,然后就可以根据前后端不同的分支组合的域名来访问,从而省去了每次前后端代码都合并到分支才能测试的环节。
Docker 实践(四): Beta 环境容器化
最近把公司的 beta 环境做了容器化,目前达到的效果是代码提交到 gitlab,触发 webhook 将代码部署到测试服务器,然后就可以根据前后端不同的分支组合的域名来访问,从而省去了每次前后端代码都合并到 master 分支才能测试的环节。
系统架构 域名路由nginx-proxy 是一个 Docker 容器, 是实现本文解决方案的神器,只需简单的配置,便可实现为多个容器路由的功能。
1. 在服务器上安装并运行docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy2. 泛域名解析
假设有域名 foo.bar, 使用泛域名解析将 *.foo.bar解析到当前服务器即可。
3. 启动下游容器假设有一个运行 web 服务的容器,只需要在启动的时候加上 -e VIRTUAL_HOST=web.foo.bar,就可以实现对该容器的访问了。
docker run -e VIRTUAL_HOST=web.foo.bar ...
可视化管理注意:如果使用 docker-compose 管理多个容器的时候,docker-compose 会为这些容器创建一个网桥,这样会使得后来手动创建的容器没法被路由,所以这里不建议使用 docker-compose 来管理。
ui-for-docker 是一个基于 docker remote api 实现的 web 管理界面,虽然界面不怎么样,但是基本上常用的功能已经实现了,前端使用 angular 实现,可以根据自己的需求作修改。
修改方法clone 代码
npm install && bower install
grunt run (更多操作可参看 gruntFile.js 文件)
代码部署使用 Gitlab 提供的 webhook 功能完成自动部署代码,期间遇到一些问题:
文件写入权限通过 webhook 的请求执行用户是 www-data,如果要在 hook 脚本中进行文件的写入操作是总会遇到权限问题,最暴力的办法就是给目录全部 777 或者在 Dockerfile 中将 www-data 用户加入 sudo 组,并且无需输入密码。
echo " data-www ALL=NOPASSWD: ALL" >> /etc/sudoers
当然,正式的环境中需要对权限做严格控制,做到最小权限原则。
hook 响应超时Gitlab 触发 hook 请求之后会一直等待服务器返回 HTTP 200 的状态码,如果没收到,会重复触发 hook,如果 hook 脚本执行时间过长会导致 HTTP 请求超时,或者一次代码提交触发多次部署请求,所以最后我选择用异步的方式,hook 脚本只需要接受上线指令,写入队列,上线过程交给另外一个脚本来完成。
为了减少环境配置的麻烦,可以使用文件队列,php 可参考 Filefifo.php。
可将队列目录挂载到 webhook 容器上,即可实现容器内部写入,主机读取队列(可使用supervisor 来管理该进程),完成代码部署的过程。
日志回显使用 supervisor 管理上线脚本进程,需要把日志回显到 web 界面,首先在 supervisor 的配置文件中配置好日志路径,然后创建一个 websocket 容器,将日志目录挂载到容器中,再tail 读取日志文件,实时显示在 web 界面。
可参考 websocket。
socket.io
node-tail
下游容器下游容器将前后端环境做了分离,降低耦合度,在使用过程中会减少一些麻烦。分离时会遇到浏览器同源策略的问题,可将前后端容器做互联,然后后端容器反向代理到前端容器。
前端容器参考: frontend
后端容器参考: backend
在部署代码的时候可根据不同的分支将代码部署到不同的目录,然后创建容器的时候把不同的分支目录挂载到不同的容器中,即可实现开发分支的随意搭配。
精简镜像对于一些服务,有时候只需要一个非常简单的 web 容器就可以,比如上面的前端容器,但是如果使用 ubuntu + nginx 的配置的时候会发现镜像要几百兆,很不划算,所以考虑精简镜像。
受这篇文章的启发,打算自己用 go 实现一个简单的 web 服务器,这样 build 好的镜像基本上只有十几兆,但是因没有做相关的测试,所以还不敢放在线上。
最后选择了使用 alpine + nginx 的策略,build 之后的镜像之后几十兆,已经减少了很多冗余的东西,具体可参考simple-nginx。
结语经过无数次踩坑和不停的折腾,终于可以勉强使用了,当然还存在一些瑕疵,之后会慢慢修复。
感谢期间帮助过我的每一位同事。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26697.html
摘要:此刻的后手指依旧飞速地敲打键盘,丝毫没有要停不下来意思。阅读本期技术周刊,你不光能弄明白什么是,使用的意义何在,还将被传授秘籍,以达的境界。周刊筛选的每篇内容,是作者的独到见解,踩坑总结和经验分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,听到后排动感十足的清脆键盘响,我就能猜到公司程序员定...
摘要:使用有一段时间了,打算把自己实践过程中的一些理解和感悟记录下来。目录实践一了解架构实践二使用教程实践三下构建开发环境实践四环境容器化实践五生产环境容器化实践六容器监控实践七提升幸福感实践八构建开发环境实践九生产环境优化参考源码分析系列文章 使用 docker 有一段时间了,打算把自己实践过程中的一些理解和感悟记录下来。 系列文章发布在 SegmentFault 上我的专栏 Tairy,...
摘要:虽然可以使用相同的方式部署应用到云端,使用外部负载均衡器,但动态添加或者减少负载均衡节点依旧是痛点。这对使用外部负载均衡器帮助巨大。 数人云今天带来的本篇文章将分享Docker在应用程序生命周期每个阶段中所扮演的角色,以及迁移到Swarm集群时需要考虑的问题。 利用Docker来开发 Docker让工作更轻松。如需要一个部署安装MySQL数据库,或者安装Ghost,又或者Redis数据...
摘要:系列文章第五篇中介绍了线上生产环境使用集群,这篇文章对原来的架构进行了优化,同时使用了最新的一些特性,记录一些流水账。配置文件鉴于上次搭建时配置文件管理混乱,这次做了统一规划为每个环境创建不同的配置文件,可以以环境名后缀。删除无用的容器。 系列文章第五篇中介绍了线上生产环境使用 Docker 集群,这篇文章对原来的架构进行了优化,同时使用了 Docker 最新的一些特性,记录一些流水账...
摘要:数人云容器助力产品迭代力沙龙干货分享实录持续上新,今天是来自人人贷高级运维工程师杜天鹏的分享,与我们细数了人人贷容器化实践过程中遇到的问题以及解决方法。 数人云容器助力产品迭代力MAX沙龙干货分享实录持续上新,今天是来自人人贷高级运维工程师杜天鹏的分享,与我们细数了人人贷容器化实践过程中遇到的问题以及解决方法。 很高兴站在这里和大家一起交流容器技术,我叫杜天鹏,是人人贷的运维工程师。人...
阅读 2954·2021-09-22 15:18
阅读 3375·2019-08-30 15:54
阅读 3244·2019-08-30 15:53
阅读 548·2019-08-30 14:12
阅读 791·2019-08-29 17:01
阅读 2181·2019-08-29 14:04
阅读 1358·2019-08-29 13:09
阅读 837·2019-08-26 17:40