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  # 设置存储库
  • 安装Docker CE和containerd
yum -y install docker-ce coker-ce-cli containerd.io	# 安装最新版

上面那条命令是安装最新版,若要安装指定版本,先列出可用的版本列表

yum list docker-ce --showduplicates | sort -r

选择一个版本安装

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io # 安装指定版本,用版本号替换掉VERSION_STRING即可
  • 安装完成后,可以启动docker了
systemctl start docker	# 启动
systemctl restart docker # 重启
systemctl stop docker	# 关闭
  • 使用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
...

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

由于本文针对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文件。

  1. 消费者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包

TIPS:文件名称最好命名为Dockerfile,构建镜像的命令可以省事儿,且jar包需要在构建的上下文内。

  1. 生产者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
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包

分别到三个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 .

后面有个.代表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

docker ps查看下运行的容器

在这里插入图片描述

Jenkins+Gitlab+Docker普通部署运行

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

  • 在消费者和提供者项目的pom.xml文件中增加插件,docker-maven-plugin
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.13</version>
    <configuration>
        <imageName>${artifactId}:${version}</imageName><!--镜像名称-->
        <baseImage>java:8</baseImage><!--依赖的基础镜像-->
        <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory><!--表示target目录-->
                <include>${project.build.finalName}.jar</include><!--表示要复制的文件-->
            </resource>
        </resources>
    </configuration>
</plugin>
  • 定位到服务器Maven安装目录下,修改conf/settings.xml文件,在pluginGroups标签下新增docker插件的配置
<pluginGroup>com.spotify</pluginGroup>

若无此配置,打包将会报错: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
    
    • 第二步,执行打包构建镜像
    clean package docker:build
    
    • 第三步,创建并执行容器
    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
    

在这里插入图片描述

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

在这里插入图片描述

Jenkins+Gitlab+Dockerfile部署运行

当遇到比较复杂的场景时,我们可以使用Dockerfile的方式。具体如下:

  • 首先修改项目的pom.xml文件
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.13</version>
    <configuration>

        <imageName>${artifactId}:${version}</imageName><!--镜像名称-->
        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory><!--Dockerfile的文件位置-->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory><!--表示target目录-->
                <include>${project.build.finalName}.jar</include><!--表示要复制的文件-->
            </resource>
        </resources>
    </configuration>
</plugin>
  • 那么就需要在项目(各个子工程)的根目录/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包

其他两个生产者

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包
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包

完事儿后,在Jenkins重新构建项目即可。

在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要帮用户解决如何通过Docker安装的JenkinsGitLab部署Vue.js项目的问题。首先,我得回忆一下用户提供的三个引用内容,看看有没有相关的配置步骤。引用1提到在Jenkins的系统设置里配置GitLab的URL和API Token,并测试连接,这可能涉及到JenkinsGitLab的集成。引用2和引用3都提到了Docker相关的配置,比如.dockerignore文件,以及使用docker-compose来启动容器,还有Jenkins容器日志的查看。 用户的需求是使用Docker安装JenkinsGitLab,然后部署Vue项目。首先,我应该分步骤来写,可能包括环境准备、安装DockerDocker Compose、配置GitLabJenkins容器、创建Vue项目,然后在Jenkins中设置流水线,最后自动化部署。 需要注意用户提供的引用中提到的关键点,比如在Jenkins系统管理里的GitLab配置,以及docker-compose的使用。引用3还提到用户组和权限的问题,比如jenkins用户组是994,可能需要处理权限问题,比如挂载目录的权限或者容器内用户的权限设置。 另外,用户提供的引用中有提到Jenkins Job的配置,可能需要创建一个Pipeline项目,拉取GitLab中的代码,然后执行构建命令,比如npm install和npm run build,之后将构建产物部署到指定目录。可能需要使用到Node.js环境,所以需要考虑在Jenkins容器中安装Node或者使用带有Node环境的镜像。 可能还需要处理Docker网络的问题,确保Jenkins容器能够访问GitLab容器,或者它们在同一网络中。同时,SSH密钥的配置也很重要,让Jenkins能够从GitLab拉取代码,这可能需要将SSH密钥添加到Jenkins的凭证中。 接下来,我需要整理这些步骤,按照逻辑顺序排列,确保每一步都清晰,并且引用提供的参考信息。比如,在配置GitLab部分时,引用1的步骤,输入URL和API Token,测试连接。在Docker Compose配置部分,引用3提到了docker-compose up -d和查看日志的方法。 还要注意用户可能遇到的常见问题,比如权限错误,如何查看容器日志,如何处理构建后的文件部署,比如使用rsync或者直接复制到Nginx的目录中。此外,自动化触发构建可能需要配置GitLab的Webhook,引用1中的API Token可能用于此。 最后,生成相关问题,可能需要考虑优化部署流程,处理依赖,或者错误排查等。比如如何优化Jenkins构建速度,如何处理构建缓存,或者如何配置HTTPS等。</think>### 分步配置教程 #### 1. 环境准备 - 安装 DockerDocker Compose 确保服务器已安装 DockerDocker Compose。若未安装,执行以下命令: ```bash curl -fsSL https://get.docker.com | bash -s docker sudo systemctl enable docker && sudo systemctl start docker sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ``` #### 2. 配置 GitLab 容器 - 创建 `docker-compose.yml` 文件,定义 GitLab 服务: ```yaml version: '3' services: gitlab: image: gitlab/gitlab-ce:latest container_name: gitlab restart: always ports: - "80:80" - "443:443" - "22:22" volumes: - ./gitlab/config:/etc/gitlab - ./gitlab/logs:/var/log/gitlab - ./gitlab/data:/var/opt/gitlab ``` 通过 `docker-compose up -d` 启动容器,使用 `docker logs gitlab` 查看日志[^3]。 #### 3. 配置 Jenkins 容器 - 修改 `docker-compose.yml`,添加 Jenkins 服务: ```yaml jenkins: image: jenkins/jenkins:lts container_name: jenkins restart: always ports: - "8080:8080" - "50000:50000" volumes: - ./jenkins:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock # 允许Jenkins调用Docker user: "jenkins:994" # 确保权限与宿主机Docker组匹配[^3] ``` 启动后访问 `http://服务器IP:8080`,根据提示完成初始化。 #### 4. 集成 JenkinsGitLab - **配置 GitLab API Token** 在 GitLab 中生成 API Token(`Profile -> Access Tokens`),进入 Jenkins 的 `系统管理 -> 系统设置 -> GitLab`,填写 URL 和 Token 并测试连接[^1]。 - **添加 SSH 密钥** 将 Jenkins 容器的公钥(位于 `/var/jenkins_home/.ssh/id_rsa.pub`)添加到 GitLab 的 Deploy Keys 中,确保代码拉取权限。 #### 5. 创建 Vue.js 项目 - 在 GitLab 中创建新项目,推送 Vue.js 代码至仓库。确保项目包含: - `Dockerfile`:定义构建镜像步骤 - `.dockerignore`:排除 `node_modules` 等无关文件[^2] #### 6. 配置 Jenkins 流水线 1. **新建 Pipeline 任务** 选择 `新建任务 -> Pipeline`,在 **Pipeline** 部分配置 Git 仓库地址(如 `git@gitlab.example.com:group/project.git`)。 2. **编写 Jenkinsfile** 在项目根目录添加 `Jenkinsfile`,示例内容: ```groovy pipeline { agent any stages { stage('Build') { steps { sh 'npm install' sh 'npm run build' } } stage('Deploy') { steps { sh 'docker build -t vue-app .' sh 'docker stop vue-app || true && docker rm vue-app || true' sh 'docker run -d -p 80:80 --name vue-app vue-app' } } } } ``` 3. **触发自动化构建** 在 GitLab 项目设置中配置 Webhook(`Settings -> Webhooks`),URL 格式为 `http://JenkinsIP:8080/project/任务名`。 #### 7. 验证部署 - 访问 `http://服务器IP`,确认 Vue 应用正常运行。若需排查问题,使用 `docker logs jenkins` 或查看 Jenkins 控制台输出[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值