文章首發於公衆號《程序員果果》mysql
地址:mp.weixin.qq.com/s/tBh6kT4I5…nginx
在 Docker 中,當咱們執行 docker pull xxx 的時候 ,它其實是從 registry.hub.docker.com 這個地址去查找,這就是Docker公司爲咱們提供的公共倉庫。在工做中,咱們不可能把企業項目push到公有倉庫進行管理。因此爲了更好的管理鏡像,Docker不只提供了一箇中央倉庫,同時也容許咱們搭建本地私有倉庫。這一篇介紹registry、harbor兩種私有倉庫搭建。git
Docker 官方提供了一個搭建私有倉庫的鏡像 registry ,只需把鏡像下載下來,運行容器並暴露5000端口,就可使用了。程序員
docker pull registry:2
複製代碼
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
複製代碼
Registry服務默認會將上傳的鏡像保存在容器的/var/lib/registry,咱們將主機的/opt/registry目錄掛載到該目錄,便可實現將鏡像保存到主機的/opt/registry目錄了。github
瀏覽器訪問http://127.0.0.1:5000/v2,出現下面狀況說明registry運行正常。sql
如今經過push鏡像到registry來驗證一下。docker
查看本地鏡像:shell
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 568c4670fa80 5 weeks ago 109MB
ubuntu latest 93fd78260bd1 7 weeks ago 86.2MB
elasticsearch 6.5.1 32f93c89076d 7 weeks ago 773MB
複製代碼
要經過docker tag將該鏡像標誌爲要推送到私有倉庫:ubuntu
docker tag nginx:latest localhost:5000/nginx:latest
複製代碼
經過 docker push 命令將 nginx 鏡像 push到私有倉庫中:瀏覽器
docker push localhost:5000/nginx:latest
複製代碼
訪問 http://127.0.0.1:5000/v2/_catalog 查看私有倉庫目錄,能夠看到剛上傳的鏡像了:
下載私有倉庫的鏡像,使用以下命令:
docker pull localhost:5000/鏡像名:版本號
例如
docker pull localhost:5000/nginx:latest
複製代碼
docker 官方提供的私有倉庫 registry,用起來雖然簡單 ,但在管理的功能上存在不足。 Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,harbor使用的是官方的docker registry(v2命名是distribution)服務去完成。harbor在docker distribution的基礎上增長了一些安全、訪問控制、管理的功能以知足企業對於鏡像倉庫的需求。
地址:github.com/goharbor/ha… 本文是有 v1.2.2
解壓下載的安裝包 harbor-offline-installer-v1.2.2.tgz
tar -xvf harbor-offline-installer-v1.2.2.tgz
複製代碼
修改 harbor.cfg
#hostname 改成本地ip,非 Mac OS系統 能夠不指定端口
hostname = 192.168.31.143:9090
#設置secretkey_path 的路徑爲 當前目錄的data下
secretkey_path = ./data
複製代碼
須要注意的是,非 Mac 用戶只須要 修改 harbor.cfg 中的 hostname ,就能夠直接經過./install.sh 就能夠構建鏡像,並把服務啓動起來。不須要 secretkey_path 和 下面 docker-compose.yml 的修改
修改 docker-compose.yml
由於harbor使用了不少目錄掛載,Mac有不少目錄是不容許掛載的,因此若是是Mac用戶,須要修改docker-compose.yml 中的掛載目錄,修改後的 docker-compose.yml 以下:
version: '2'
services:
log:
image: vmware/harbor-log:v1.2.2
container_name: harbor-log
restart: always
volumes:
- ./log/:/var/log/docker/:z
ports:
- 127.0.0.1:1514:514
networks:
- harbor
registry:
image: vmware/registry:2.6.2-photon
container_name: registry
restart: always
volumes:
- ./data/registry:/storage:z
- ./common/config/registry/:/etc/registry/:z
networks:
- harbor
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.2.2
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.2.2
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.2.2
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
- ./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.2.2
container_name: harbor-jobservice
env_file:
- ./common/config/jobservice/env
restart: always
volumes:
- ./data/job_logs:/var/log/jobs:z
- ./common/config/jobservice/app.conf:/etc/jobservice/app.conf:z
- ./data/secretkey:/etc/jobservice/key:z
networks:
- harbor
depends_on:
- ui
- adminserver
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "jobservice"
proxy:
image: vmware/nginx-photon:1.11.13
container_name: nginx
restart: always
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
ports:
- 9090: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
複製代碼
經過運行 install.sh 構建鏡像,並把服務啓動起來:
./install.sh
複製代碼
訪問 http://127.0.0.1:9090/ 以下:
默認 admin 用戶的密碼爲 Harbor12345 ,能夠在 harbor.cfg 進行修改。登陸後以下:
圖中的項目是以前上傳的 ,新部署的 Harbor 登陸後項目下是空的。
能夠建立項目,建立用戶,給項目分配用戶等等,操做都很簡單 。
###3. 上傳鏡像 首先登陸私有倉庫,可使用 admin 用戶 ,也可使用咱們本身建立的具備上傳權限的用戶:
docker login -u admin -p Harbor12345 127.0.0.1:9090
複製代碼
要經過docker tag將該鏡像標誌爲要推送到私有倉庫,例如:
docker tag nginx:latest 127.0.0.1:9090/library/nginx:latest
複製代碼
上傳鏡像:
docker push 127.0.0.1:9090/library/nginx:latest
複製代碼
訪問 http://127.0.0.1:9090/harbor/projects ,在 library 項目下能夠看見剛上傳的 nginx鏡像了:
歡迎掃碼或微信搜索公衆號《程序員果果》關注我,關注有驚喜~