系列文章第五篇中介绍了线上生产环境使用 Docker 集群,这篇文章对原来的架构进行了优化,同时使用了 Docker 最新的一些特性,记录一些流水账。
CentOS
CentOS
和 Docker
确实不搭,但是苦于做不了主,只能硬着头皮上了,所幸没有遇上太大的坑。
必须要
CentOS 7.0
及以上才行,越新越好,内核也要升级到最新。内核版本
Linux 3.10.0-327.36.1.el7.x86_64
有 bug,碰上了就别再折腾,赶紧绕过,Github Issue。
docker-compose
可喜的是新版本的 docker-compose
支持管理集群了,这比以前用 docker service
命令方便多了,只需要将 docker-compose.yml
的 version
修改为 3 或者更高,然后就可以愉快的使用新增的特性了,示例:
version: '3'
services:
nginx:
image: nginx:latest
networks:
- product
ports:
- 8022:80
environment:
TZ: 'Asia/Shanghai'
deploy:
mode: replicated
replicas: 4
placement:
constraints:
- node.role == worker
restart_policy:
condition: any
web-product:
image:web:latest
build:
context: ./
networks:
- product
environment:
TZ: 'Asia/Shanghai'
deploy:
mode: replicated
replicas: 4
placement:
placement:
- node.role == worker
restart_policy:
condition: any
networks:
product:
driver: overlay
推荐在
docker-compose.yml
里面写上build
节点,每次只需要执行docker-compose build --no-cache
就可以构建镜像了,再也不需要记住复杂的镜像名和构建参数了。deploy
节点可以编排发布的一些特性,比如replicas
可以指定运行的容器个数,也可以用placement
来限定容器运行的节点。编写好
docker-compose.yml
文件之后就可以执行下面命令将应用发布到集群中。docker stack deploy --compose-file docker-compose-product.yml web-product
建议 replicas 的数量 > 1,否则上线的时候会出现短暂的 502。
CI
对 ci 一直存在于理论中,这次有幸实践了一把,体验就是比 webhook 靠谱多了,配置也简单,强烈推荐,.gitlab-ci.yml
示例:
# 可自定义上线的每个阶段
stages:
- build
- release
- test
- release
- deploy
- cleanup
build-beta-job:
stage: build
script:
- docker-compose -f docker-compose-beta.yml build --no-cache
- docker-compose -f docker-compose-beta.yml down -v
- docker-compose -f docker-compose-beta.yml up -d
only:
- master
build-release-job:
stage: build
script:
- docker-compose -f docker-compose-release.yml build --no-cache
- docker-compose -f docker-compose-release.yml down
- docker-compose -f docker-compose-release.yml up -d
only:
- master
deploy-product-job:
stage: deploy
script:
- docker build --no-cache -f Dockerfile-product -t 127.0.0.1:5000/web-product:latest .
- docker push 127.0.0.1:5000/web-product:latest
- docker stack deploy --compose-file docker-compose-product.yml web-product
only:
- release
cleanup-job:
stage: cleanup
script:
- docker system prune -f
only:
- master
- release
找一台服务器安装 gitlab-runner,参考链接,建议配置高一些。
在项目中编写
.gitlab-ci.yml
文件,然后推送到gitlab
即可。
镜像结构
对于镜像的处理,依然沿用原来的办法,将环境依赖的扩展等构建好作为一个底层基础镜像,业务代码镜像基于这个基础镜像再构建,可以加快构建速度。
配置文件
鉴于上次搭建时配置文件管理混乱,这次做了统一规划:
为每个环境创建不同的配置文件,可以以环境名后缀。
构建最顶层镜像时连同配置文件一起 build 进去,千万不要在底层镜像修改配置文件。
清除数据
新版的 docker
终于支持对无用数据的清除了,主要有以下命令:
docker image prune:删除无用的镜像。
docker container prune:删除无用的容器。
docker volume prune:删除无用的卷。
docker network prune:删除无用的网络。
docker system prune:删除无用的镜像、容器、卷、网络。
要强制删除可加上 -f
参数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。