Harbor是什么
-
Harbor是VMware公司開源的企業級DockerRegistry項目,其目標是幫助用戶迅速搭建一個企業級的Dockerregistry服務。
-
它以Docker公司開源的registry為基礎,提供了管理UI,基於角色的訪問控制(Role Based Access Control),AD/LDAP集成、以及審計日志(Auditlogging) 等企業用戶需求的功能,同時還原生支持中文。
簡單說來,Harbor封裝了Docker的registry v2,幫用戶提供了許多便捷管理的特性,方便用戶操作。
Harbor提供的特性
- 基於角色控制
用戶和倉庫都是基於項目進行組織的, 而用戶基於項目可以擁有不同的權限。 - 基於鏡像的復制策略
鏡像可以在多個Harbor實例之間進行復制。 - 支持LDAP
Harbor的用戶授權可以使用已經存在LDAP用戶。 - 鏡像刪除 & 垃圾回收
Image可以被刪除並且回收Image占用的空間。 - 友好UI
用戶可以輕松的瀏覽、搜索鏡像倉庫以及對項目進行管理。 - 便於擴展
絕大部分的用戶操作API, 方便用戶對系統進行擴展。 - 輕松部署
Harbor提供了online、offline安裝,除此之外還提供了virtualappliance安裝。
Harbor的安裝與配置
Harbor的github主頁上已經講得很詳細了,在此不再贅述。
Harbor使用過程中的坑
- 配置文件修改
第一次安裝Harbor后,mysql的數據會存儲在/data/database文件夾下。如果你想修改mysql root密碼的話(不管你有沒有重裝),都要先把/data/database刪掉,否則UI容器會一直報“Access denied”的錯誤,即便是重下鏡像也無法解決。(這個問題花費了我大半天的時間,最后終於在官方issues里找到了解決方案T_T)
當然在自己的測試環境里邊可以隨便玩,但如果想把Harbor部署到生產環境中,強烈建議預先配置好各類環境參數,避免改動。 - Nginx端口修改
Harbor的Nginx端口映射到宿主機的80端口上了,一般情況下我們不希望80端口被占用,所以需要修改docker-compose.yml文件:
proxy: image: nginx:1.9 container_name: nginx restart: always volumes: -./common/config/nginx:/etc/nginx ports: - 9999:80 - 443:443 depends_on: - mysql - registry - ui
然后再修改common/templates/registry/config.yml文件:
auth: token: issuer:registry-token-issuer realm: $ui_url:9999/service/token rootcertbundle:/etc/registry/root.crt service: token-service
修改完成后執行sudo ./prepare重新生成配置文件
-
Registry端口修改(非必需)
按照慣例,開放5000端口給registry使用,則修改docker-compose.yml文件,為registry節點添加posts屬性,步驟與修改Nginx配置一樣,不再贅述。
增加這個
ports:
- 5000:5000
[root@k8s-registry-70 harbor]# cat docker-compose.yml version: '2' services: log: image: vmware/harbor-log:v1.5.1 container_name: harbor-log restart: always volumes: - /var/log/harbor/:/var/log/docker/:z - ./common/config/log/:/etc/logrotate.d/:z ports: - 127.0.0.1:1514:10514 networks: - harbor registry: image: vmware/registry-photon:v2.6.2-v1.5.1 container_name: registry restart: always volumes: - /data/registry:/storage:z - ./common/config/registry/:/etc/registry/:z networks: - harbor ports: - 5000:5000 environment: - GODEBUG=netdns=cgo command: ["serve", "/etc/registry/config.yml"] depends_on: - log logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "registry" mysql: image: vmware/harbor-db:v1.5.1 container_name: harbor-db restart: always volumes: - /data/database:/var/lib/mysql:z networks: - harbor env_file: - ./common/config/db/env depends_on: - log logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "mysql" adminserver: image: vmware/harbor-adminserver:v1.5.1 container_name: harbor-adminserver env_file: - ./common/config/adminserver/env restart: always volumes: - /data/config/:/etc/adminserver/config/:z - /data/secretkey:/etc/adminserver/key:z - /data/:/data/:z networks: - harbor depends_on: - log logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "adminserver" ui: image: vmware/harbor-ui:v1.5.1 container_name: harbor-ui env_file: - ./common/config/ui/env restart: always volumes: - ./common/config/ui/app.conf:/etc/ui/app.conf:z - ./common/config/ui/private_key.pem:/etc/ui/private_key.pem:z - ./common/config/ui/certificates/:/etc/ui/certificates/:z - /data/secretkey:/etc/ui/key:z - /data/ca_download/:/etc/ui/ca/:z - /data/psc/:/etc/ui/token/:z networks: - harbor depends_on: - log - adminserver - registry logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "ui" jobservice: image: vmware/harbor-jobservice:v1.5.1 container_name: harbor-jobservice env_file: - ./common/config/jobservice/env restart: always volumes: - /data/job_logs:/var/log/jobs:z - ./common/config/jobservice/config.yml:/etc/jobservice/config.yml:z networks: - harbor depends_on: - redis - ui - adminserver logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "jobservice" redis: image: vmware/redis-photon:v1.5.1 container_name: redis restart: always volumes: - /data/redis:/data networks: - harbor depends_on: - log logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "redis" proxy: image: vmware/nginx-photon:v1.5.1 container_name: nginx restart: always volumes: - ./common/config/nginx:/etc/nginx:z networks: - harbor ports: - 80:80 - 443:443 - 4443:4443 depends_on: - mysql - registry - ui - log logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:1514" tag: "proxy" networks: harbor: external: false [root@k8s-registry-70 harbor]#
-
設置信賴列表
默認情況下,docker對registry的操作是基於https協議的,而Harbor默認是以http協議訪問的,如果這時候執行docker login的操作,會得到這樣的錯誤信息:
Error response from daemon: Get https://xx.xxx.xx.xx/v1/users/: dial tcp xx.xxx.xx.xx:443:getsockopt: connection refused
這時候需要修改docker的啟動文件(Ubuntu16.04下,這個文件是/lib/systemd/system/docker.service),如下所示:
# Modified,origin: ExecStart=/usr/bin/dockerd -H fd:// ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry xx.xxx.xx.xx:5000
然后執行命令:
sudo systemctl daemon-reload sudo systemctl restart docker
Harbor使用
萬事俱備,下面我們來試試上傳鏡像。以docker的官方鏡像hello-world為例,先下載好鏡像,然后給鏡像打tag:
docker tag hello-world xx.xx.xx.xx:5000/test/hello-world
其中“test”為項目名,如果預先沒有創建test項目的話,push的時候會提示:
denied: requested access to the resource is denied
那么現在Harbor UI里新建一個test項目,然后執行:
docker push xx.xx.xx.xx:5000/test/hello-world
大功告成!
再來看拉取鏡像,啟動另一台虛擬機(CentOS系統),然后輸入:
docker pull xx.xx.xx.xx:5000/test/hello-world
開個玩笑,你不會真的直接這樣輸入吧?會報錯的:
http: server gave HTTP response to HTTPS client
解決的方法也很簡單,在/etc/docker/daemon.json(如果沒有就新建)中添加以下代碼:
{ "insecure-registries":["xx.xx.xx.xx:5000"] }
僅限於Docker 1.12+,如果使用較低版本的docker,請自行查找解決方案:)
參考:
https://blog.csdn.net/jycjyc/article/details/90415477
https://blog.csdn.net/dongyuan234/article/details/90298327