harbor修改非80端口為5000


Harbor是什么

  1. Harbor是VMware公司開源的企業級DockerRegistry項目,其目標是幫助用戶迅速搭建一個企業級的Dockerregistry服務。
  2. 它以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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM