Docker、Jenkins、Harbor 构建镜像部署 SpringBoot 项目

Harbor 是由 VMware 公司开源的企业级的 Docker Registry 管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能,具有 web 管理功能,有了它之后能够很方便的管理容器镜像,搭配 Jenkins 使用很是方便。

安装 docker-compose

Harbor 由多个组件组成,每个组件都是以 Docker 容器的形式构建的,因此,我们使用 Docker Compose 来对它进行部署。用于部署 Harbor 的 Docker Compose 模板位于 harbor/docker-compose.yml 中,这个模板文件中有多个镜像定义,常见有:harbor-log、harbor-db、harbor-core、harbor-portal等等,版本不一样,所以依赖的容器熟练不一样,需要借助 docker-compose 去加载 docker-compose.yml 工程配置文件来启停 Harbor 组件容器。

所以我们需要提前安装好Docker Compose

1、下载 Docker Compose,设置权限

# 命令下载(网络不好可能失败,推荐手动下载的方式)
curl -L https://github.com/docker/compose/releases/download/v2.5.1/docker-compos-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 设置权限
chmod +x /usr/local/bin/docker-compose

# 手动下载
https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-linux-x86_64
# 如果手动下载需要改文件的名称
mv docker-compose-linux-x86_64 docker-compose
# 设置权限
chmod +x /usr/local/bin/docker-compose
# 创建软连接,有时会出现不能全局使用的情况
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看版本号,测试是否安装成功
docker-compose --version

安装 Harbor

我这里安装 harbor2.5.1 需要 docker版本17.06.0以上,不然下面执行.install.sh 会报错

1、下载安装包

官网地址:https://goharbor.io/

下载地址: https://github.com/goharbor/harbor/releases

这里直接用 wget 下载,可能会因为网络问题下载比较慢,这里可以自行使用迅雷下载,下载完成后上传到相应的服务器上

wget 方式下载(比较慢):wget https://github.com/goharbor/harbor/releases/download/v2.5.1/harbor-offline-installer-v2.5.1.tgz

2、解压配置

# 解压安装包
tar -zxvf 
# 进入解压的 harbor 文件中
cd /harbor/
# 拷贝配置文件
cp harbor.yml.tmpl harbor.yml
# 修改 harbor.yml 中的 hostname、https证书路径、admin密码
vi harbor.yml

barbor.yml示例如下:

# 这里只能是服务器 IP 或者域名,不能使用localhost 或 127.0.0.1
#hostname: reg.mydomain.com
hostname: 192.168.2.129

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  # 避免端口和nginx端口冲突,这里修改成没有使用的端口
  #port: 80
  port: 8099
# https related config
# 由于我们是在本地或虚拟机操作,可以不用安装,需要注意的是,如果不开启https,需要把https的内容注释掉,否则会报错
# 下载地址: https://goharbor.io/docs/1.10/install-config/configure-https/
#https:
  # https port for harbor, default is 443
  #port: 443
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path
# 登录用户界面的密码, 不是必须修改的,可以默认
harbor_admin_password: Harbor12345

# Harbor DB configuration
# harborDB 用于 db_auth 的MySQL数据库 root 用户的密码
database:
  # The password for the root user of Harbor DB. Change this before any production use.
  password: root123
  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
  max_idle_conns: 100
  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
  # Note: the default number of connections is 1024 for postgres of harbor.
  max_open_conns: 900

编辑完执行 install.sh 脚本进行安装

./install.sh

报了一个错误,提示我现在的版本是 1.13.1 ,需要安装 17.06.0 以上的版本

[Step 0]: checking if docker is installed ...

Note: docker version: 1.13.1
✖ Need to upgrade docker package to 17.06.0+.

第一步:

# 卸载 Docker

# 列出当前 Docker 相关的安装包

yum list installed|grep docker


# 如果已经存在,则卸载对应的包

yum -y remove Docker包(比如docker-ce-cli.x86_64 )

# 最后删除 Docker 目录

rm -rf /var/lib/docker
rm -rf /var/lib/containerd

第二步:

# 下载阿里源repo文件
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 检查 yum 源
yum makecache
# 查看 yun 有哪些 docker-ce 的版本
yum list docker-ce --showduplicates | sort -r
# 安装 docker 
yum -y install docker-ce-18.06.0.ce-3.el7
# 配置阿里云的镜像加速器,修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器
# 执行命令:
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://p0pgcdb3.mirror.aliyuncs.com"]
}
EOF

# 加载配置文件,重启服务
systemctl daemon-reload 
systemctl restart docker

重新执行 install.sh 安装 harbor

在这里插入图片描述
在这里插入图片描述
3、查看 harbor 安装情况

# 查看拉取的 harbor 镜像
docker images
# 查看所有容器
docker ps -a
# 查看 docker-compose 容器相关运行情况
docker-compose ps

4、访问 harbor

http://192.168.2.129:8099/
在这里插入图片描述
使用默认账号和设置的密码:admin/Harbor123456

在这里插入图片描述
下面看看是怎么实现 pull 到 harbor 上面。

1、首先我们在 harbor 上面创建一个项目,这个项目存放我们的所有镜像
在这里插入图片描述
在这里插入图片描述
2、以 nginx 为例

# 拉取 nginx
docker pull nginx
# 查看拉取的镜像
docker images
# 推 nginx 镜像到 haror
docker tag nginx:latest 192.168.2.129:8099/dev/nginx:v1
docker push 192.168.2.129:8099/dev/nginx:v1

报了一个错误:
The push refers to repository [192.168.2.129:8099/dev/nginx]
Get https://192.168.2.129:8099/v2/: http: server gave HTTP response to HTTPS client

docker 私有仓库服务器,默认是基于 https 传输的,所以我们需要在服务器 192.168.2.129 做相关设置,不使用 https 传输

# 编辑 daemon.json 配置
vi /etc/docker/daemon.json
改成如下:
"insecure-registries": ["192.168.2.129:8099:8099"],
"live-restore": true

在这里插入图片描述

这里我只用了同一台服务器配置,如果大家有多个服务器的,可以在另一台安装 docker,编辑 daemon.json 把 IP 修改成安装 harbor服务器的 IP 即可。

# 执行下面两条命令,重新启动 docker
systemctl daemon-reload
systemctl restart docker

执行 push 时出现以下错误

The push refers to repository [192.168.2.129:8099/dev/nginx]
d874fd2bc83b: Preparing 
32ce5f6a5106: Preparing 
f1db227348d0: Preparing 
b8d6e692a25e: Preparing 
e379e8aedd4d: Preparing 
2edcec3590a4: Waiting 
unauthorized: unauthorized to access repository: dev/nginx, action: push: unauthorized to access repository: dev/nginx, action: push

原因分析:
错误提示对存储库访问未经授权,这是因为 harbor 上的访问认证导致的,需要在服务器上进行 harbor 仓库登录。

docker login 192.168.2.129:8099

在这里插入图片描述
输入账号和密码登录就好

另外一种登陆:


echo Harbor123456 > /etc/docker_passwd
cat /etc/docker_passwd
cat /etc/docker_passwd  | docker login -u admin --password-stdin http://192.168.2.129:8099

在这里插入图片描述

登录以后我们再次推送

docker push 192.168.2.129:8099/dev/nginx:v1

在这里插入图片描述在这里插入图片描述
在仓库管理平台上可以看到就证明推送成功了

这里我们删除镜像再从仓库 pull 下来

# 删除镜像,比如 nginx
docker rmi nginx:latest
# pull 镜像
docker pull 192.168.2.129:8099/dev/nginx:v1

在这里插入图片描述
这里我们从远程仓库下载 nginx 镜像,push 到我们的仓库,再从我们的仓库 pull 下来,启动 pull 的镜像运行容器,

docker run -d -p 8086:80 192.168.2.129:8099/dev/nginx:v1

在这里插入图片描述
在这里插入图片描述
请求 http://192.168.2.129:8086/ 可以看到 nginx 已经启动,证明 harbor 已经实现 pull 和 push 功能

Jenkins 、maven 构建和 push

如果要借助 Jenkins、Maven 等工具将构建好的Docker images push 到某个服务器的 Docker 上,就必须开启该服务中 Docker 的远程连接接口。比如,我通过 Jenkins 将镜像推送到 192.168.2.129 的 Docker 服务里面,就在这个服务里面配置 Docker。

1、编辑 Docker 服务的配置文件

vi /usr/lib/systemd/system/docker.service

在这里插入图片描述

在 ExecStart 这里加入如下内容

ExecStart=/usr/bin/dockerd

在 /etc/docker/daemon.json 中写入以下内容

"hosts":[
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2375"
  ]

在这里插入图片描述
2、重载配置和重启服务

systemctl daemon-reload 
systemctl restart docker

3、请求 http://192.168.2.129:2375 能访问到,表示配置成功,注意这里换成你服务的 ip
在这里插入图片描述
4、代码编写

4.1、引入 Docker 插件


<build>
        <!--这里指定 package 的 jar 包名称-->
        <finalName>jenkins-images-jar</finalName>
        <plugins>
            <!-- 这里是创建项目时就带上的 SpringBoot 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!-- Dockerfile maven plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.10</version>
                <!--将插件绑定在某个phase执行-->
                <!-- 镜像构建完毕之后自动推送到仓库 -->
                <executions>
                    <execution>
                        <id>default</id>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <username>admin</username>    <!--   docker私有仓库用户名,已登录则不需要 -->
                    <password>Harbor123456</password>    <!--   docker私有仓库密码,已登录则不需要   -->
                    <repository>192.168.2.129:8099/dev/${project.build.finalName}</repository>
                    <tag>${project.version}</tag>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>

            </plugin>
        </plugins>
    </build>

4.2、编写 Dockerfile

# 指定基础镜像
FROM openjdk:8
LABEL maintainer=Tommy
# 设置工作目录
WORKDIR /home/webapps
# 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY target/jenkins-images-jar.jar ./
# 为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
ENTRYPOINT ["java","-Dspring.profiles.active=dev" , "-jar","/home/webapps/jenkins-images-jar.jar"]
# 暴露容器中的端口
EXPOSE 9100

这里需要主要一点:Dockerfile 文件和 pom.xml 同一级才能生效,不然 jenkins 构建会报错

在这里插入图片描述

push 代码到 gitee 上面

4.3、jenkins 中在创建的任务中配置打包构建并且 images 镜像推送

在这里插入图片描述

在这里插入图片描述

4.3.2、保存以后点击立即构建看一下效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后启动镜像

docker run -p 本机映射端口:镜像映射端口 -d  --name 启动镜像名称  镜像名称:镜像版本号
docker run -d -p 6001:9100 --name=jenkins-images-jar.jar 192.168.2.129:8099/dev/jenkins-images-jar:0.0.1-SNAPSHOT

在这里插入图片描述
当然这里你也可以在 jenkins 中配置 shell 执行命令

启动容器以后请求 IP+映射端口成功
在这里插入图片描述

最后

这里有个问题就是,因为我所有的操作都是在同一个服务器完成,在实现功能的过程中出现了很多的问题,最后都找到解决的办法,大家可以实现多服务器分配操作不同的功能,例如:

名称IP地址安装软件
基础服务器192.168.0.1Docker、Jenkins、SonarQube、JDK、Maven、Git
Docker仓库服务器192.168.0.2Docker、Harbor
部署应用服务器192.168.0.3Docker

大致的流程图如下:

在这里插入图片描述

  • 开发人员把代码提交到 Gitee 代码仓库
  • Jenkins 从 Gitlee 中拉取代码,编译并打成 jar 包,然后构建成 Docker 镜像,将镜像上传到 Harbor 私有仓库
  • Jenkins 发送 SSH 远程命令,让部署应用服务器到 Harbor 私有仓库拉取镜像到本地,然后创建容器
  • 最后用户可以访问到容器
    • 2
      点赞
    • 19
      收藏
      觉得还不错? 一键收藏
    • 1
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值