一个开发的docker-compose服务运维经验

682 阅读4分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

温馨提示:如果只想看(拷贝)脚本,请直接滑鼠标滚轮,如果了解一下整个过程,会更酷哦!

产生背景

最近在公司单撸一个微服务项目,在开发和测试环境,经常有服务需要升级迭代的需求,每一次都耗费了大量的时间,于是乎想着该优化优化整个流程。

限制

多个微服务项目写在同一个docker-compose.yml中,方便维护,而默认多个微服务处于同一个network中,不用处理复杂的网络问题。

注:docker-compse的文件中如果不显性定义Network,那会默认创建一个父文件夹_default的Network。

parent:

|—> ...

|—> docker-compose.yml

默认Network:parent_default

三个阶段

阶段一:梭哈

在第一阶段,由于本着先实现功能,在优化体验的原则,采用了一把梭哈的原则。

提炼出我们作为开发的常见运维需求,无外乎两个。重启、重新构建。

重启,直接在项目文件夹使用

docker-compose restart

重新构建

#服务都停止
docker-compose down

# 编译打包项目
mvn clean install

# 使用docker的build构建新的镜像(各个微服务提供Dockerfile文件)
docker-compose build

# 重新启动
docker-compose up -d

于是乎,这样就完美的解决了需求。

但是,这样在实际过程中体验奇迹糟糕。

首先就是时间问题,由于所有的服务都在重启和重新构建,它的整个流程类似于单线程的过程,服务一多起来,动则好几分钟甚至数十分钟都是常见的。

其次就是服务的运维需求不一致

例如mysq/redis/gateway的服务,大部分情况下非但不需要重启,一旦停止服务,将会造成服务不可用,在联调阶段带来极其糟糕的体验。

为了解决这些痛点,开始进入了第二个阶段。

阶段二:点擒

docker-compose是支持对定义的Service进行单个控制的。

在这个阶段,服务编排和启动顺序都在自己的脑海中,也定义在docker-compose.yml的service顺序中。

重启

docker-compose restart service1

# 或者
docker-compose stop service1
docker-compose rm service1
docker-compose up -d service1

重新构建

docker-compose stop service1

docker-compose rm service1

docker rmi service1(images name)

#mvn clean install (maven打包需要自行判断使用全量还是指定模块)
mvn clean install -pl service1

docker-compose build service1

docker-compose up -d service1

在这一阶段,体验就会好很多。

对一个服务进行运维的时候,就可以单点对该服务进行控制。

整体的等待时间从数十分钟级别到达了分钟内的级别。

但是自己手敲命令不cool,这些流程也是很固化的,这个时候就考虑使用脚本老搞了。

阶段三:脚本

废话不多说,直接上脚本。

#!/bin/bash
app_name="$1"
deploy="$2"

apps=(
        service1
        service2
        service3
        service4
        service5
)

#用已有镜像重启
restart() {
        docker-compose stop $app_name
        echo '----------容器已停止------------'
        echo yes | docker-compose rm $app_name
        echo '----------容器已删除------------'
        docker-compose up -d $app_name
        echo '----------容器重启成功----------'
        docker-compose logs -f $app_name
}

#获取新的镜像并重启
rebuild() {

        echo '------------开始编译项目---------'
        mvn clean install

        echo '------------开始停止容器---------'
        docker-compose stop $app_name
        echo '----------容器已停止------------'echo '-----------开始删除容器----------'
        echo yes | docker-compose rm $app_name
        echo '-----------容器已删除-----------'

        docker rmi $app_name
        echo '-----------镜像已删除-----------'

        echo '-------开始替换docker-compose.yml对应服务的版本号'
        docker-compose build $app_name
        echo '-------------docker-compose.yml---版本替换成功'echo '----------获取新的镜像并重启------------'
        docker-compose up -d $app_name
        echo '----------容器重启成功----------'
        docker-compose logs -f $app_name
}

if [ ! -n "$1" ]; then
        echo "服务名不能为空,请传入服务名!"
        exit

else
        if [[ ! "${apps[@]}" =~ "${1}" ]]; then
                echo "服务:[$1] 不存在,请检查后重试! "
                exit
        fi
        if [ $2 == "restart" ]; then
                echo "服务名:["${app_name}"]重启"
                restart
        else
                rebuild
        fi
fi

展望

这个脚本已经很好的解决了一部分的问题,但是并没有完美的解决掉所有的问题。例如:服务还是会中断等问题。

打算再写两篇文章进行研究,欢迎您的关注!

1、用docker-compose实现滚动更新

2、docker-compose下的数据持久化(mysql/redis/minio)实践

参考

  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information