若是還未了解過 Docker, 建議先閱讀上一篇文章 初識 Docker。php
倉庫(Repository)就是存放鏡像的地方。相似於 Node
的 npm
; Python
的 PyPi
。html
註冊服務器(Registry)的概念比較容易與倉庫混淆。實際上註冊服務器是用來管理倉庫的服務器,一個服務器上能夠存在多個倉庫,而每一個倉庫下能夠有多個鏡像。前端
例如對於倉庫地址 hub.dockerpool.com/nginx
來講,hub.dockerpool.com
是註冊服務器的地址,nginx
是倉庫名。linux
目前 Docker 官方維護的一個公共倉庫,大部分需求咱們均可以從 Docker Hub 中直接下載鏡像來實現。nginx
咱們能夠在 hub.docker.com/ 註冊一個 Docker 帳號。git
能夠經過 docker login
命令在終端輸入用戶名及密碼來完成 Docker Hub 的登陸。web
咱們也能夠經過 docker logout
退出登陸。docker
經過上一篇文章能夠知道,使用 docker search
搜索鏡像時,搜索出來能夠看到下面的鏡像列表。npm
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12036 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1671 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 742 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 78
bitnami/nginx Bitnami nginx Docker Image 71 [OK]
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 56 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 28 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 24 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 24
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 22
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 18 [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 17 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
複製代碼
根據是不是官方提供,能夠將鏡像分爲兩類。json
一類是相似 nginx
這樣的鏡像,被稱爲基礎鏡像或跟鏡像。這些基礎鏡像由 Docker 公司建立、驗證、支持、提供。這樣的鏡像每每使用單個單詞做爲名字。
還有一種類型,好比 feiben/nginx
鏡像,它是由 Docker Hub 的註冊用戶建立並維護的,每每帶有用戶名稱前綴。能夠經過前綴 username/
來指定使用某個用戶提供的鏡像,好比 feiben
用戶。
用戶登陸後能夠經過 docker push
命令來把本身的鏡像推送到 Docker Hub,例如將 nginx
鏡像改爲咱們本身的鏡像,而後推送到 Docker Hub。
首先經過 docker pull nginx
將 nginx
鏡像下載到本地。
給 nginx
添加標籤 docker tag nginx feiben/nginx:1.17.5
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
feiben/nginx 1.17.5 f949e7d76d63 2 weeks ago 126MB
nginx latest f949e7d76d63 2 weeks ago 126MB
複製代碼
將本身的鏡像推送到 Docker Hub
$ docker push feiben/nginx:1.17.5
The push refers to repository [docker.io/feiben/nginx]
509a5ea4aeeb: Mounted from library/nginx
3bb51901dfa3: Mounted from library/nginx
2db44bce66cd: Mounted from library/nginx
1.17.5: digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76 size: 948
複製代碼
稍等片刻,咱們就能夠搜索出推送的鏡像了
$ docker search feiben
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
feiben/nginx 0
複製代碼
咱們能夠經過 Docker Hub 指定跟蹤一個目標網站(支持 GitHub 或 BitBucket)上的項目,項目一旦有新的提交或者建立了新標籤,將會觸發 Docker Hub 自動構建鏡像並推送到 Docker Hub中。
設置自動構建的步驟以下:
完成自動構建配置以後,指定的分支一旦提交代碼就會觸發自動構建,咱們能夠在倉庫頁面的 Timeline 選項卡中查看每次構建的狀態。
除了 Docker Hub 的自動構建外,咱們也可使用 Travis CI 等持續集成工具來實現自動構建。
公司的項目通常不予許咱們上傳到 Docker Hub 這類的公共倉庫中,全部學會建立一個私有倉庫也是很是必要的。
咱們能夠經過獲取官方的 registry
鏡像來運行。
$ docker run -d -p 5000:5000 --restart=always --name registry registry
複製代碼
這將使用官方提供的 registry
鏡像來啓動私有倉庫。默認狀況下,倉庫會被建立在容器的 /var/lib/registry
目錄下。咱們能夠經過 -v
參數將鏡像文件存放在本地的指定路徑。
$ docker run -d \
> -p 5000:5000 \
> -v /opt/data/registry:/var/lib/registry \
> --restart=always \
> registry
複製代碼
這時咱們能夠經過瀏覽器訪問 http://domain:5000/v2/_catalog
查看倉庫是否啓動成功。
domain
是你的域名或 ip 地址,下文中的 domain
同理。首先使用 docker tag
將本地的 nginx
鏡像添加標籤
$ docker tag nginx:latest domain/nginx:latest
複製代碼
接下來就可使用 docker push
命令將鏡像推送到咱們的私有倉庫中
$ docker push domain/nginx:latest
The push refers to repository [domain/nginx]
Get https://domain/v2/: EOF
複製代碼
出現上面的提示時,說明推送失敗了。由於 Docker 默認使用 HTTPS 的方式推送鏡像。咱們能夠經過 Docker 的配置來取消這個限制。
對於 Linux 系統,咱們能夠在 /etc/docker/deamon.json
(deamon.josn
文件不存在則新建該文件)添加下面的配置
{ "insecure-registries": ["domain:5000"] }
複製代碼
對於桌面版,咱們能夠在 Docker 的設置 Daemon
選項中的 Insecure registries
中加上 domain:5000
。
【注】若是倉庫主機是遠程服務器的話,須要將服務器與本地的 docker 配置進行修改
設置完成後再使用上面的命令進行推送。除了上面這種方式外,咱們也能夠將私有倉庫的地址配置成支持 HTTPS
訪問的,本文就不做展開了。
$ docker push domain:5000/nginx:latest
The push refers to repository [domain:5000/nginx]
509a5ea4aeeb: Pushed
3bb51901dfa3: Pushed
2db44bce66cd: Pushed
latest: digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76 size: 948
複製代碼
當看到上面的信息時,說明已經推送成功了。咱們能夠再次訪問 http://domain:5000/v2/_catalog
進行驗證
$ curl http://domain:5000/v2/_catalog
{"repositories":["nginx"]}
複製代碼
看到這個說明上傳成功了。
搜索私有倉庫的鏡像並不能用 docker search
命令, 只能經過 http://domain:5000/v2/image_name/tags/list
查看指定鏡像存在的 tag
列表
$ curl domain:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest"]}
複製代碼
首先咱們經過 docker rmi
將本地的鏡像刪除(取消標籤)。
$ docker rmi domain:5000/nginx
Untagged: domain:5000/nginx:latest
Untagged: domain:5000/nginx@sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76
複製代碼
再使用 docker images
確認 domain:5000/nginx
這個鏡像在本地不存在,接下來咱們就能夠從私有倉庫進行下載。
$ docker pull domain:5000/nginx:latest
複製代碼
除了使用官方提供的 Registry,咱們也可使用 Nexus3.x 來建立倉庫,關於如何使用 Nexus 版本的倉庫將放到下一篇文章中。固然你也能夠從 https://docker_practice.gitee.io/zh-cn/repository/nexus3_registry.html 學習。
若是你喜歡個人文章,但願能夠關注一下個人公衆號【前端develop】