欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jenkins+Docker自动化部署Spring boot项目 (二)搭建docker私库Harbor

程序员文章站 2022-05-17 08:33:11
...

前言

docker镜像的push、pull都需要镜像库。现在不少大厂提供免费的镜像库,如docker hub,163 hub,也可以自己搭建一个私有镜像库。我用了vmware公司开源的harbor作为docker私有库,相比docker官方提供的私有库registry,harbor提供了管理界面,还可以分配用户权限,适合企业级使用。这是harbor的地址.
harbor不是一个镜像,而是有多个镜像支撑,所以需要去官方手动下载一个installer,再在installker中的原始配置文件中配置好相应参数,再运行脚本生成镜像所需要的配置文件,最后通过docker-compose启动。

前置条件

OS: ubuntu 16
docker版本: 17
docker-compose版本: 1.21

搭建过程

下载installer

这里 下载最新版本的harbor安装器,它分在线和离线两种包,我下载的时候,最新版本是1.5.1,还未提供在线包,所以下载了离线包。
下载成功后,在linux任意目录解压

tar xvf harbor-offline-installer-<version>.tgz

配置

解压出来后就是一个同名文件夹,里面有很多文件和文件夹,我们只需要配置两个文件harbor.cfg和docker-compose.yml。
harbor.cfg只要配置如下一个地方

#The IP address or hostname to access admin UI and registry service.
#DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname = 192.168.1.100:8090 

harbor支持域名和ip两种方式,我用了简单的ip方式,还可以配置https访问。harbor.cfg中的ui_url_protocol属性设置为https。当然,https证书要自己做。具体可参考官网
docker-compose.yml主要是改下容器映射的端口,默认是把容器内的80端口映射到宿主机的80端口,现在改成映射宿主机的8090端口(我把容器其它往外映射的端口也改到宿主机上不常用端口上了)
Jenkins+Docker自动化部署Spring boot项目 (二)搭建docker私库Harbor
然后执行install.sh,没问题的话,会生成配置文件和启动镜像。如果镜像未启动,则使用命令docker-compose up启动。
注意:如果后面想改harbor.cfg的内容并生效,单独重启容器是没用的,需要重新执行prepare后再启动容器,命令如下:

$ sudo docker-compose down -v
$ vim harbor.cfg
$ sudo prepare
$ sudo docker-compose up -d

启动成功后,harbor会启动八个docker容器,看着有点多,但资源占的都不多。
然后浏览器打开http://ip:8090进入管理平台,默认密码是admin/Harbor12345。在管理平台,可以管理镜像和用户权限控制。
Jenkins+Docker自动化部署Spring boot项目 (二)搭建docker私库Harbor

推送拉取镜像

推送

首先有一个spring boot项目,pom.xml文件添加如下内容:

    <properties>
        <docker.image.prefix>192.168.1.100:8090</docker.image.prefix>
        <docker.project.name>demo</docker.project.name>
  </properties>
  <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <repository>${docker.image.prefix}/${docker.project.name}/${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

在项目主目录下写Dockerfile文件,内容如下:

FROM java:8
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
RUN bash -c 'touch /app.jar'
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 7882
CMD ["-jar", "/app.jar"]
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Xms256m", "-Xmx512m",  "-XX:PermSize=64m", "-XX:MaxPermSize=128m", "-Xss512k"]

我在ENTRYPOINT中设置了JVM堆内存参数是为了控制容器占内存太大。

执行mvn打包和打成镜像命令

mvn clean package -DskipTests dockerfile:build

dockerfile:build命令需要在安装docker的环境下执行

执行完毕后,当前机器通过sudo docker images就可以看到刚才打好的镜像,镜像名字是192.168.1.100:8090/demo/项目名。
先登录再执行镜像推送命令:

sudo docker login --u admin -p Harbor12345 192.168.1.100:8090
sudo docker push 192.168.1.100:8090/demo/项目名

拉取镜像

拉取镜像很简单

sudo docker login --u admin -p Harbor12345 192.168.1.100:8090
sudo docker pull 192.168.1.100:8090/demo/项目名

harbor就这样搭建配置完成了。

遇到的问题

在docker login的时候会报这个错:http: server gave HTTP response to HTTPS client,这是因为Haror设置了http,docker客户端默认是https,需要改下本地docker环境
在/etc/docker/daemon.json(如果没有就新建)中添加以下代码:

{ "insecure-registries":["xx.xx.xx.xx:8090"] }

再重启即可