1
前言

前面一篇文章介绍了使用docker+jenkins一键发布github上的springboot项目。但是一旦有多个为服务需要一起发布的时候,一个一个的配置,发布实在是太累了,有没有什么可以一次打包多个docker镜像,然后部署镜像文件为运行的容器呢?docker-compose完美的解决了这一问题。本篇文章将使用springcloud项目为例。

docker-compose是什么

我们简单介绍一下docker-compose的定义:
Docker Compose是Docker三剑客的最后一个,第一个是Machine,用来在不同平台下快速安装Docker的,第二个是Swarm,帮助Docker在集群中运转,第三个便是Docker Compose,用来帮助用户运行容器组(请注意,不是单独的容器)。

springcloud配置
ps:
   1.需要安装docker-componse。我这里是安装了的,具体安装教程这里不再述说。安装好后,具体查看方式如下:

   [root@iamcrawler /]# docker-compose -version
   docker-compose version 1.24.1, build 4667896
   
   2.本文教程github地址:https://github.com/iamcrawler/micro.git

第一步跟Docker Compose的关系不大,安装Image,在案例中我们使用了docker-maven-plugin这一个插件来操作,然后编写了一个build-image.sh的脚本,一键完成所有项目的Image安装。

docker-maven-plugin的配置如下:

   <!---- eureka为例子:--->
 <build>
        <finalName>crawler-eureka</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- Docker maven plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <!-- Docker maven plugin -->
        </plugins>
    </build>

第二步:build-image.sh的内容就不粘贴了,基本就是分别进入各个子服务的目录下,再依次执行

mvn clean package -Dmaven.test.skip=true docker:build

来完成Image的安装。

第三步:编写docker-compose.yml文件,打包镜像(image)

docker-compose.yml应该位于项目的根目录下,且在命名上不能有偏差。
在编写docker-compose.yml时,我们要注意,要定义的容器组位于services下,每一个services的Id一般跟子项目的artifactId保持一致,并在其下再去定义所采用的Image、启动失败时是否重启、容器名称、主机名称、及监听和开放的端口号、依赖的服务等等内容。

image: ${您采用的Image}
restart: ${是否在失败时重启,是的话为always}
container_name: ${运行时的容器名称}
hostname: ${配置网络的主机名称,可用于容器组内的通讯}
ports: 
  - "1234:1234" ${监听和开放的端口号}
depends_on:
  - docker-compose-eureka ${依赖的服务}

那么案例中的docker-compose.yml的内容就不粘贴了,比较多,大家请去项目中查阅。

第四步:启动容器

docker-compose up -d

-d表示守护进程启用

后续:我们可以关闭容器

docker-compose down

最后,我们将其过程放在jenkins上就好了:


##打包
mvn clean install -Dmaven.test.skip=true
echo "maven 执行完毕"
cur=$(pwd)
echo "当前路径$cur"

dockerpids1=$(docker ps -f name="crawler-*" | awk '{print $1}' )
for dockerpid in $dockerpids1
do 
  echo "被删除的容器 $dockerpid"
  docker stop $dockerpid
  docker rm $dockerpid
done  

dockerpids2=$(docker ps -f name="*-service" | awk '{print $1}' )
for dockerpid in $dockerpids2
do 
  echo "被删除的容器 $dockerpid"
  docker stop $dockerpid
  docker rm $dockerpid
done  

echo "容器已删除完毕!"

ipids=$(docker images | grep "springcloud/*" | awk '{print $3}')
for imagesid in $ipids
do
  echo "被删除的image $imagesid"
  docker rmi $imagesid
done  

echo "旧的docker docker-demo 容器和镜像已删除"

sh build-image.sh

echo "docker打包完成"


docker-compose up -d


echo "容器启动完成,结束."

本文参照:https://www.liumapp.com/articles/2018/04/19/1524100110011.html


crawler
327 声望79 粉丝

专注技术多年,曾任职京东,汉得等公司主研