栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 插件


        
        jenkins-images-jar
        
            
            
                org.springframework.boot
                spring-boot-maven-plugin
            

            
            
                com.spotify
                dockerfile-maven-plugin
                1.4.10
                
                
                
                    
                        default
                        package
                        
                            build
                            push
                        
                    
                
                
                    admin    
                    Harbor123456    
                    192.168.2.129:8099/dev/${project.build.finalName}
                    ${project.version}
                    
                        target/${project.build.finalName}.jar
                    
                

            
        
    

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 私有仓库拉取镜像到本地,然后创建容器
  • 最后用户可以访问到容器
    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/1004276.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号