前言

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端口(我把容器其它往外映射的端口也改到宿主机上不常用端口上了)
这里写图片描述
然后执行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。在管理平台,可以管理镜像和用户权限控制。
这里写图片描述

推送拉取镜像

推送

首先有一个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"] }

再重启即可

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐