Docker Swarm的集群化实践以及感想
接触docker也有几年,分为几个阶段:1、最早只会run,stop,start,打好war包丢容器内去跑,把容器当成虚拟机使用。2、把jar包直接打成镜像,服务随镜像启动而生。3、使用gitlab、jenkins和docker集群、以及阿里云容器镜像服务,jenkins持续构建,用脚本打成镜像后push到阿里云仓库管理,可随时回滚项目。4、学习k8s中,计划把当前服务发现治理都用k8s实现下面分
·
接触docker也有几年,分为几个阶段:
1、最早只会run,stop,start,打好war包丢容器内去跑,把容器当成虚拟机使用。
2、把jar包直接打成镜像,服务随镜像启动而生。
3、使用gitlab、jenkins和docker集群、以及阿里云容器镜像服务,jenkins持续构建,用脚本打成镜像后push到阿里云仓库管理,可随时回滚项目。
4、学习k8s中,计划把当前服务发现治理都用k8s实现
下面分享一下我的实现方案:
1、jenkins和gitlab关联,并添加构建完成时脚本:
API_NAME="MYAPP"
IMAGE_NAME="registry-vpc.cn-shanghai.aliyuncs.com/mydocker/$API_NAME"
# 进入target 目录复制jar包
cd /data/jars/script/docker/myapp
mv -f /data/temp_jars/myapp.jar .
#构建docker 镜像
docker build -t $IMAGE_NAME .
DATE_HOUR="`date +%Y%m%d%H%M`"
DATE_DAY="`date +%Y%m%d`"
#打包镜像,版本号为日期和到分钟
docker tag $IMAGE_NAME $IMAGE_NAME:latest
docker push $IMAGE_NAME:latest
docker tag $IMAGE_NAME $IMAGE_NAME:$DATE_HOUR
docker push $IMAGE_NAME:$DATE_HOUR
docker tag $IMAGE_NAME $IMAGE_NAME:$DATE_DAY
docker push $IMAGE_NAME:$DATE_DAY
#更新镜像
docker service update --image $IMAGE_NAME:$DATE_HOUR myapp_myapp
然后是Dockerfile文件:
FROM registry-vpc.cn-shanghai.aliyuncs.com/mydocker/jdk:latest
USER root
#修改时区和编码 以及配一些服务必要的权限
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
RUN groupadd -r admin -g 1000 && \
useradd -u 1000 -r -g admin -d /home/admin -c "Docker image user" admin
COPY myapp.jar /home/admin/myapp.jar
RUN chown -R admin:admin /home/admin /logs &&\
chmod -R 777 /home/admin /logs
#开放的端口
EXPOSE 30000
USER admin
在发布stack的时候定义一些运行时的命令:
version: '3'
services:
myapp:
image: registry-vpc.cn-shanghai.aliyuncs.com/mydocker/myapp
volumes:
- /data/jars/logs:/logs
container_name: multi
network_mode: "bridge"
ports:
- "30000:30000"
command: java -jar -Xms128m -Xmx512m -Dspring.cloud.consul.discovery.hostname=agent -Dspring.cloud.config.profile=pre /home/admin/myapp.jar
extra_hosts:
- "nameserver:172.11.X.X"
- "rocketmq:172.11.X.X"
- "agent:172.11.X.X"
将每个微服务都独自开一个服务,最后只要代码需要更新,在jenkins进行构建操作,后台就会进行构建镜像,上传备份镜像,更新服务,重启服务,达到半自动化的效果。
而且还有一些手动更新的命令:
列出所有服务
docker service ls
添加副本
docker service update --replicas=2 --update-delay 59s myapp_myapp
--update-delay 59s:更新间隔
滚动更新
docker service update --image registry-vpc.cn-hangzhou.aliyuncs.com/mydocker/myapp:latest --update-delay 59s myapp_myapp
latest:版本号
--update-delay 59s:更新间隔,如果只有一个服务可不用
马上回滚
docker service update --rollback --update-delay 59s myapp_myapp
--update-delay 59s:回滚间隔,如果只有一个服务可不用
更新步骤:
1、预发布与生产环境用同一套镜像,预发布服务器上通过jenkins构建,生成镜像,得到一个版本号,如:201806130101,进行测试。
2、测试通过后更新生产环境:
2选1
2.1、进入管理界面,进入service一栏,点击进入需要更新的项目,修改对应的版本号,点击apply changes,更新完成。
2.2、或者,ssh对应服务器,执行:
#列出所有服务
docker service ls
#更新某服务到指定镜像版本
docker service update --image registry-vpc.cn-hangzhou.aliyuncs.com/mydocker/myapp: 201806130101 myapp_myapp
更新完成。
建议使用命令行,遇到更新失败能及时回滚,只能回滚一个版本,如果要回滚更旧的需要用更新命令指定某旧版本号。
#回退至上个版本
docker service update --rollback myapp_myapp
可视化界面的话我用portainer管理,新版本的ui更一目了然。
总结:
docker真的是个不错的东西,我仅仅将其发挥到一成,k8s是趋势,希望我能在下个容器栏目写的是k8s。
感谢观看,有问题有建议有意见请留言,谢谢!
更多推荐
已为社区贡献1条内容
所有评论(0)