Docker Swarm的集群化实践以及感想

接触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。


感谢观看,有问题有建议有意见请留言,谢谢!

你可能感兴趣的:(一些感悟,容器)