Jenkins+Gitlab+Docker(Dockerfile)部署

简介: Jenkins+Gitlab+Docker(Dockerfile)部署

Docker部署运行
​ 上一篇内容中使用Jenkins(运行服务器)+Gitlab(代码存储库)+Webhook(网络钩子)的方式部署运行我们的项目。需要我们在服务器上做好很多相关的环境配置及依赖。

​ 那么假如有这样一个场景:需要把不同技术栈的项目部署到同一台服务器上运行。比如PHP、.NET、Java、Python的程序都部署到同一台服务器,那么可能由于各自依赖包及环境有冲突,或依赖软件版本不同造成无法兼容的问题。

​ 再假如,企业需要搭建一套新的服务,8台服务器,每台都需要Java运行环境、Tomcat都需要去执行安装JDK、配置环境变量、Tomcat配置等相同的流程,重复劳动。

​ 那么要避免这些问题,我们可以使用容器虚拟化技术,如Docker。Docker能使环境隔离,完美规避软件无法兼容的问题。只需要配置好一台服务器,可以把镜像上传到仓库,其他服务器直接拉取下来即可一键使用。

Docker介绍
​ Docker是一个开源项目,非常优秀的开源容器引擎,基于Google公司推出的Go语言实现。Docker能将应用程序间环境隔离,帮助用户更快交付部署,高效利用宿主机资源。Docker很适合微服务架构,单个容器运行单个程序。

​ Docker有3个基本概念:

镜像:镜像定义了运行容器的资源,用户可以使用Dockerfile自定义镜像,可以看作它是由一条条指令构成
容器:镜像运行起来,就是容器,麻雀虽小,五脏俱全,它有自己的文件系统、网络、以及各种软件,相当于是一个微型的操作系统
仓库:仓库主要用于存储,存储镜像的地址。可将镜像上传至仓库,也能从仓库上pull下来镜像(类似gitlab代码存储)
Docker安装
安装Docker的官方文档地址:https://docs.docker.com/engine/install/,Docker支持安装在多种操作系统上,Windows、Mac、Centos、Ubuntu等,笔者这里选择Centos。一般安装一个CE版本的就可以了。

使用yum安装yum-utils软件包和设置稳定的存储库
yum -y install yum-utils # 安装yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 设置存储库
1
2
安装Docker CE和containerd
yum -y install docker-ce coker-ce-cli containerd.io # 安装最新版
1
上面那条命令是安装最新版,若要安装指定版本,先列出可用的版本列表

yum list docker-ce --showduplicates | sort -r
1
选择一个版本安装

yum install docker-ce- docker-ce-cli- containerd.io # 安装指定版本,用版本号替换掉VERSION_STRING即可
1
安装完成后,可以启动docker了
systemctl start docker # 启动
systemctl restart docker # 重启
systemctl stop docker # 关闭
1
2
3
使用docker version看下docker是否安装完毕及版本号
Client: Docker Engine - Community
Version: 24.0.6
API version: 1.43
Go version: go1.20.7
Git commit: ed223bc
Built: Mon Sep 4 12:35:25 2023
OS/Arch: linux/amd64
Context: default

Server: Docker Engine - Community
Engine:
Version: 24.0.6
...
1
2
3
4
5
6
7
8
9
10
11
12
13
Docker镜像加速器

Docker的镜像默认是在Docker Hub上下载的,但是国内下载很慢,下载大镜像时问题尤为突出,甚至还会断开。我们可以使用其他的镜像源,如阿里云,只需要注册一个账号,进入镜像服务,点击镜像加速器,可以免费获取一个镜像加速的地址。

命令贴到这里

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6yqx5sih.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8
由于本文针对Docker部署运行项目的,需要点Docker的基础,一些常用的Docker命令就不再赘述了,可以到网上查看一些资料。

Dockerfile常用指令
介绍下Dockerfile的常用指令

命令 含义
FROM image_name:tag 依赖的基础镜像
MAINTAINER name 镜像作者,维护者
ENV key value 设置环境变量
RUN command 编译镜像时运行的命令
CMD 启动容器时运行的命令
ENTRYPOINT 设置容器的入口程序
ADD source target 复制文件,若是压缩包,复制后会自动解压,路径只能是构建时的上下文内
COPY source target 与ADD指令类似,但压缩文件不会被解压,路径只能是构建时的上下文内
WORKDIR path 指定工作目录
ARG 设置编译镜像时,加入的参数
VOLUME 指定挂载的目录
EXPOSE 声明暴露的端口
LABEL 添加元数据到镜像
USER 设置运行镜像时的用户或UID,后续的RUN也会使用指定的用户
Docker部署运行项目
现在可以编写Dockerfile文件构建出镜像,然后通过镜像创建容器启动。

还以上篇文章的三个jar包为例(一个消费者,两个生产者),为它们创建Dockerfile文件。

消费者Dockerfile
FROM java:8
COPY consumer-1.0-SNAPSHOT.jar consumer-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 9001
ENTRYPOINT ["java","-jar","consumer-1.0-SNAPSHOT.jar"] # 启动jar包
1
2
3
4
TIPS:文件名称最好命名为Dockerfile,构建镜像的命令可以省事儿,且jar包需要在构建的上下文内。

生产者1
FROM java:8
COPY provider-8001-1.0-SNAPSHOT.jar provider-8001-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8001
ENTRYPOINT ["java","-jar","provider-8001-1.0-SNAPSHOT.jar"] # 启动jar包
1
2
3
4
生产者2
FROM java:8
COPY provider-8002-1.0-SNAPSHOT.jar provider-8002-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8002
ENTRYPOINT ["java","-jar","provider-8002-1.0-SNAPSHOT.jar"] # 启动jar包
1
2
3
4
分别到三个Dockerfile所在目录下,执行构建命令

docker build -t consumer:0.0.1-SNAPSHOT .
docker build -t provider1:0.0.1-SNAPSHOT .
docker build -t provider2:0.0.1-SNAPSHOT .
1
2
3
后面有个.代表Dockerfile文件的相对位置,表示当前路径

运行完毕后,docker images查看镜像

3个镜像就已经构建完毕了,分别创建它们的启动容器启动即可。

docker run --name consumer -d -p 9001:9001 consumer:0.0.1-SNAPSHOT
docker run --name provider1 -d -p 8001:8001 provider1:0.0.1-SNAPSHOT
docker run --name provider2 -d -p 8002:8002 provider2:0.0.1-SNAPSHOT
1
2
3
docker ps查看下运行的容器

Jenkins+Gitlab+Docker普通部署运行
上面介绍的是简单的Docker部署运行,那么完整的一整套流程采用Jenkins+Gitlab+Docker的方式部署运行。

在消费者和提供者项目的pom.xml文件中增加插件,docker-maven-plugin


com.spotify
docker-maven-plugin
0.4.13

${artifactId}:${version}
java:8
["java","-jar","${project.build.finalName}.jar"]


/
${project.build.directory}
${project.build.finalName}.jar



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
定位到服务器Maven安装目录下,修改conf/settings.xml文件,在pluginGroups标签下新增docker插件的配置

com.spotify
1
若无此配置,打包将会报错:No plugin found for prefix ‘docker’ in the current project and in the plugin groups.

到Jenkins项目主界面,点击配置,修改之前的配置,定位到构建(Build)一栏

第一步先执行脚本,因为镜像和容器名称都不能重复,所以这段脚本会停止正在运行的容器删除以前的镜像和容器
array=("consumer" "provider-8001" "provider-8002")
for item in ${array[@]};
do
instance=$(docker ps -a | grep $item | head -1);#查找这个容器
image=$(docker images | grep $item | awk '{print $1}' | head -1);#查找镜像
if [ "$instance"x != ""x ] ; then
docker stop $item # 停止容器
docker rm $item # 删除容器
fi
if [ "$image"x != ""x ] ; then
docker rmi $item:1.0-SNAPSHOT # 删除镜像
fi
done
1
2
3
4
5
6
7
8
9
10
11
12
13
第二步,执行打包构建镜像
clean package docker:build
1
第三步,创建并执行容器
docker run --name consumer -d -p 9001:9001 consumer:1.0-SNAPSHOT
docker run --name provider-8001 -d -p 8001:8001 provider-8001:1.0-SNAPSHOT
docker run --name provider-8002 -d -p 8002:8002 provider-8002:1.0-SNAPSHOT
1
2
3

完事儿后,提交下代码到gitlab,然后webhook或手动触发一下构建即可。执行完毕后,看到images和容器都已经创建好,并且容器已经启动。

Jenkins+Gitlab+Dockerfile部署运行
当遇到比较复杂的场景时,我们可以使用Dockerfile的方式。具体如下:

首先修改项目的pom.xml文件


com.spotify
docker-maven-plugin
0.4.13


${artifactId}:${version}
${project.basedir}/src/main/docker


/
${project.build.directory}
${project.build.finalName}.jar



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
那么就需要在项目(各个子工程)的根目录/src/main下,创建一个docker的目录,再创建一个Dockerfile文件
消费者Dockerfile

FROM java:8
COPY consumer-1.0-SNAPSHOT.jar consumer-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 9001
ENTRYPOINT ["java","-jar","consumer-1.0-SNAPSHOT.jar"] # 启动jar包
1
2
3
4
其他两个生产者

FROM java:8
COPY provider-8001-1.0-SNAPSHOT.jar provider-8001-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8001
ENTRYPOINT ["java","-jar","provider-8001-1.0-SNAPSHOT.jar"] # 启动jar包
1
2
3
4
FROM java:8
COPY provider-8002-1.0-SNAPSHOT.jar provider-8002-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8002
ENTRYPOINT ["java","-jar","provider-8002-1.0-SNAPSHOT.jar"] # 启动jar包
1
2
3
4
完事儿后,在Jenkins重新构建项目即可。

看到这里,可能会有读者比较迷茫,Dockerfile中的COPY指令执行时,打包后的jar包是否和Dockerfile文件在同一上下文中呢?

其实,在项目的pom.xml中引入的docker打包插件已经考虑到这种情况了,它会将你的打包后的jar包和Dockerfile文件拷贝到target/docker的目录下,这时你就不需要担心构建时不在同一目录的问题了。

文章知识点与官方知识档案匹配,可进一步学习相关知识
————————————————
版权声明:本文为CSDN博主「鸢尾の」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45248492/article/details/133828367

目录
相关文章
|
1天前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用合集之关于在Docker环境中部署和维护PolarDB-X,有相关文章可以参考吗
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2天前
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
|
2天前
|
缓存 运维 Serverless
Serverless 应用引擎产品使用之在阿里云函数计算中使用Docker进行部署函数如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
6 0
|
2天前
|
jenkins Java 持续交付
Jenkins离线安装部署教程简记
Jenkins离线安装部署教程简记
11 0
|
4天前
|
数据库 Nacos Docker
基于docker-compose部署微服务基本环境
基于docker-compose部署微服务基本环境
7 0
|
5天前
|
消息中间件 Kafka Docker
docker部署kafka
docker部署kafka
26 1
|
5天前
|
算法 Nacos Docker
docker部署nacos集群
docker部署nacos集群
14 0
|
5天前
|
消息中间件 Kafka Docker
【消息中心】docker部署kafka
【消息中心】docker部署kafka
16 0
|
5天前
|
Java 应用服务中间件 Docker
【Docker】部署启动java项目
【Docker】部署启动java项目
13 2
|
5天前
|
NoSQL 网络安全 Redis
【docker】部署的redis突然连接不上了
【docker】部署的redis突然连接不上了
13 1