Harbor 是由 VMware 公司开源的企业级的 Docker Registry 管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能,具有 web 管理功能,有了它之后能够很方便的管理容器镜像,搭配 Jenkins 使用很是方便。
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
我这里安装 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
# 查看拉取的 harbor 镜像
docker images
# 查看所有容器
docker ps -a
# 查看 docker-compose 容器相关运行情况
docker-compose ps
4、访问 harbor
http://192.168.2.129:8099/
使用默认账号和设置的密码:admin/Harbor123456
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 等工具将构建好的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"
]
systemctl daemon-reload
systemctl restart docker
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>
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 镜像推送
最后启动镜像
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地址 | 安装软件 |
---|---|---|
基础服务器 | 192.168.0.1 | Docker、Jenkins、SonarQube、JDK、Maven、Git |
Docker仓库服务器 | 192.168.0.2 | Docker、Harbor |
部署应用服务器 | 192.168.0.3 | Docker |
大致的流程图如下: