• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    安装 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

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

    ./install.sh
    
    • 1

    报了一个错误,提示我现在的版本是 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+.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第一步:

    # 卸载 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    第二步:

    # 下载阿里源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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    重新执行 install.sh 安装 harbor

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

    # 查看拉取的 harbor 镜像
    docker images
    # 查看所有容器
    docker ps -a
    # 查看 docker-compose 容器相关运行情况
    docker-compose ps
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

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

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

    执行 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    docker login 192.168.2.129:8099
    
    • 1

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

    另外一种登陆:

    
    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
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    登录以后我们再次推送

    docker push 192.168.2.129:8099/dev/nginx:v1
    
    • 1

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

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

    # 删除镜像,比如 nginx
    docker rmi nginx:latest
    # pull 镜像
    docker pull 192.168.2.129:8099/dev/nginx:v1
    
    • 1
    • 2
    • 3
    • 4

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

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

    在这里插入图片描述
    在这里插入图片描述
    请求 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
    
    • 1

    在这里插入图片描述

    在 ExecStart 这里加入如下内容

    ExecStart=/usr/bin/dockerd
    
    • 1

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

    "hosts":[
        "unix:///var/run/docker.sock",
        "tcp://0.0.0.0:2375"
      ]
    
    • 1
    • 2
    • 3
    • 4

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

    systemctl daemon-reload 
    systemctl restart docker
    
    • 1
    • 2

    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>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里需要主要一点: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
    
    • 1
    • 2

    在这里插入图片描述
    当然这里你也可以在 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 私有仓库拉取镜像到本地,然后创建容器
    • 最后用户可以访问到容器
    • 相关阅读:
      Spring AOP 基于注解源码整理
      Windows OpenGL 图像伽马线
      企业电子招投标采购系统源码之电子招投标的组成
      java 文件上传 MultipartFile
      设计模式-组合模式Composite(结构型)
      如何将网站部署到浏览器?
      关于.NET代码质量度量和分析的一些总结
      Linux学习第34天:Linux LCD 驱动实验(一):星星之火可以燎原
      Golang 获取本地 IP 地址方法
      QT下TCP协议实现数据网络传输
    • 原文地址:https://blog.csdn.net/wuhuayangs/article/details/125557597