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

目录
相关文章
|
4月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
213 5
|
4月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
1838 4
|
4月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
1296 7
|
4月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
755 4
|
4月前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
3150 8
|
4月前
|
Kubernetes jenkins 持续交付
Artifact Hub在Kubernetes中的应用:部署Jenkins的脚本整理
以上步骤断言清晰明确地描述了如何通过Artifact Hub 使用Helm图表来部署Kubernetes 中得Jenkis 实例,并且提供了相应得Shell 脚本作为执行指南. 这样不但能够帮助用户快速地进行操作, 同时也能够通过自定义参数来满足不同用户需求.
150 5
|
5月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
482 12
docker 部署 sftp
|
5月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
1870 6
存储 jenkins 持续交付
671 2