Harbor是VMWare在GitHub上开源的一个用于存储和分发Docker镜像的企业级Registry服务器,实际上通过官方文档我们可以很方便地搭建一个Harbor仓库。
Github链接:https://github.com/goharbor/harbor
官方安装指南:https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
下面介绍下如何在服务器上安装Harbor
系统:ubuntu server16.04
版本:docker v17.06.0-ce或更高 docker-compose v1.18.0或更高
本例使用的是docker 19.03.0 docker-compose v1.24.1
首先需要注意的是,如果是将电脑作为服务器,请务必配置静态ip并安装有docker,若需要建立https连接,请务必安装openssl
说明:由于大多数命令需要有root权限,故笔者描述的是root账号下的情况
1.安装docker-compose(docker-compose是docker官方的容器编排工具,可以定义和运行多容器Docker应用程序)
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#下载docker-compose的当前稳定版本
chmod +x /usr/local/bin/docker-compose
#对二进制文件赋予权限
docker-compose --version
#查看是否安装成功
2.下载harbor脱机安装包并解压(由于国内网络问题,建议下载脱机安装包进行脱机安装)
wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.2-rc1.tgz
tar xvf harbour-offline-installer-v1.8.2-rc1.tgz
3.打开解压后文件,编辑harbor.yml
配置文件中各项意义在官方文档中均有描述,这里不多说,还请移步官方文档
主要配置的是hostname以及关于协议的配置,hostname改为主机ip,如果使用http协议,注释掉https的相关行就好,端口默认选择80,若被占用可以进行修改,至于配置https后文再来描述
其他关于账号密码等可自行修改,用户处可先不添加,在图形化界面后添加。
4.修改完harbor.yml后运行install.sh文件
./install.sh
系统会自动从docker上拉取镜像并启动服务
在运行完后便可在浏览器键入http://yourdomain.com:port来进行访问,管理员账号密码在harbor.yml上请自行配置
5.docker login在http情况下访问harbor
docker login在默认情况下是采用https协议,所以我们应该将选项insecure-registry添加到docker的配置文件中。
打开/etc/docker/daemon.json,添加如下内容
{
"insecure-registries":["yourdomain.com:port"]
}
然后运行
systemctl daemon-reload
systemctl restart docker
如果是自己的域名是自己造的,记得打开/etc/hosts加下ip与域名对应。
然后就可以通过docker login去登陆仓库并可以上传镜像。
上传注意:
打tag的时候需要将镜像重命名,不然上传不到自己的仓库
docker tag imagename:version yourdomain.com/diretory/imagename:version
docker push yourdomain.com/diretory/imagename:version
6.https协议自签名方式访问
在这里先说明,最好对ip地址自己起一个域名并存放于/etc/hosts中与ip对应,并在下面的yourdomain.com中使用自己起的域名,如果不这样做,在后面的docker login中会出现错误,不能实现https通信
首先需要创建证书,此时需要安装openssl
##在存放证书的文件夹下操作
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=yourdomain.com" \##此处根据地区修改
-key ca.key \
-out ca.crt
openssl genrsa -out yourdomain.com.key 4096
openssl req -sha512 -new \
-subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=yourdomain.com" \
-key yourdomain.com.key \
-out yourdomain.com.csr
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in yourdomain.com.csr \
-out yourdomain.com.crt
cp yourdomain.com.crt /data/cert/
cp yourdomain.com.key /data/cert/
##/data/cert为存放证书的例子,可以建在不同地方
openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert
cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
cp ca.crt /etc/docker/certs.d/yourdomain.com/
##需提前建好文件夹/etc/docker/certs.d/yourdomain.com
最终的/etc/docker文件夹如下所示
/etc/docker
├── certs.d
│ └── yourdomain.com
│ ├── ca.crt
│ ├── yourdomain.cert
│ └── yourdomain.key
├── daemon.json
└── key.json
然后创建证书后对harbor.yml进行配置
取消掉关于https的注释(注意不要注释掉http的相关内容)然后对配置进行修改,证书地址为上文中作为例子使用的/data/cert,大家依据自身情况进行修改
#set hostname
hostname: yourdomain.com
http:
port: 80
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/cert/yourdomain.com.crt
private_key: /data/cert/yourdomain.com.key
然后对harbor重新加载配置并重启(这也是对harbor修改配置后重新加载的方法)
./prepare
docker-compose down -v
docker-compose up -d
这样我们就可以通过浏览器去访问网站了https://ip:port,由于我们的网站是自签名的,所以网站会报警,相信此证书就好。
linux使用终端访问的时候,在客户机上修改/etc/hosts添加ip与域名的对应,并修改/etc/docker/daemon.json文档
{
"insecure-registries":["yourdomain.com:port"]##port为https的端口
}
再在终端运行
systemctl daemon-reload
systemctl restart docker
此时应该就可以在客户机上进行登录操作了
docker login yourdomain.com
##下为交互命令
username:
password:
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
docker push同http协议时的命名方式,不再重述。