前言
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"] }
再重启即可