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月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
10天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
185 7
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
10天前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
35 3
|
26天前
|
Docker 容器
docker中使用Dockerfile自动创建数据卷
【10月更文挑战第12天】
17 5
|
22天前
|
监控 jenkins 持续交付
Docker和Jenkins有什么不同
【10月更文挑战第18天】Docker和Jenkins有什么不同
|
30天前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
91 1
|
1月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
1月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
36 4
|
1月前
|
运维 Linux 开发工具
第22篇 如何部署gitLab进行开发版本控制
第22篇 如何部署gitLab进行开发版本控制
|
1月前
|
jenkins Java 持续交付
Docker搭建jenkins环境
这篇文章详细介绍了如何利用Docker搭建Jenkins环境,包括拉取Jenkins镜像、配置端口映射及初始化设置的步骤。
123 0
Docker搭建jenkins环境