倉庫(Repository)是集中存放鏡像的地方。
一個容易與之混淆的概念是註冊服務器(Registry)。實際上註冊服務器是存放倉庫的具體服務器,每一個服務器上能夠有多個倉庫,而每一個倉庫下面有多個鏡像。從這方面來講,倉庫能夠被認爲是一個具體的項目或目錄。例如對於倉庫地址hub.docker.com/_/ubuntu來講,hub.docker.com是註冊服務器地址,ubuntu是倉庫名。
倉庫又分公共倉庫和私有倉庫,在本文將展現如何使用DockerHub官方倉庫進行登陸、下載等基本操做;最後還將介紹建立和使用私有倉庫的基本操做。php
目前Docker官方維護了一個公共倉庫https:/hub.docker.com,其中已經包括15000多個的鏡像。大部分需求均可以經過在Docker Hub中直接下載鏡像來實現。mysql
能夠經過執行docker login命令來輸入用戶名、密碼和郵箱來完成註冊和登陸。註冊成功後,本地用戶目錄的.dockercfg中將保存用戶的認證信息。sql
用戶無需登陸便可經過docker search命令來查找官方倉庫中的鏡像,並利用docker pull命令來將它下載到本地。
在前面博文中,已經具體介紹瞭如何使用docker pull命令。例如以centos爲關鍵詞進行搜索:docker
[root@gavin ~]# sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 5488 [OK] ansible/centos7-ansible Ansible on Centos7 122 [OK] jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.6.1810 x86… 111 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC session… 96 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 59 imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 57 [OK]
...
根據是否爲官方提供,可將這些鏡像資源分爲兩類。一種是相似centos這樣的基礎鏡像,稱爲基礎或根鏡像。這些鏡像是由Docker公司建立、驗證、支持、提供。這樣的鏡像每每使用單個單詞做爲名字。
還有一種類型,好比ansible/centos7-ansible鏡像,它是由DockerHub的用戶ansible建立並維護的,帶有用戶名稱爲前綴,代表是某用戶的某倉庫。能夠經過用戶名稱前綴user_
name/來指定使用某個用戶提供的鏡像,好比ansible用戶的鏡像前綴爲ansible/。
另外,在查找的時候經過-s N參數能夠指定僅顯示評價爲N星以上的鏡像。
下載官方centos鏡像到本地以下所示:json
[root@gavin ~]# sudo docker pull centos Using default tag: latest latest: Pulling from library/centos 8ba884070f61: Pull complete Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c Status: Downloaded newer image for centos:latest
用戶也能夠在登陸後經過docker push命令來將本地鏡像推送到Docker Hub。ubuntu
自動建立(Automated Builds)功能對於須要常常升級鏡像內程序來講十分方便。有時候,用戶建立了鏡像,安裝了某個軟件,若是軟件發佈新版本則須要手動更新鏡像。
而自動建立功能使得用戶經過Docker Hub指定跟蹤一個目標網站(目前支持GitHub或BitBucket)上的項目,一旦項目發現新的提交,則自動執行建立。
要配置自動建立,包括以下的步驟:vim
以後,能夠在Docker Hub的「自動建立」頁面中跟蹤每次建立的狀態。centos
安裝Docker後,能夠經過官方提供的registry鏡像來簡單搭建一套本地私有倉庫環境:服務器
[root@gavin ~]# sudo docker run -d -p 5000:5000 registry
這將自動下載並啓動一個registry容器,建立本地的私有倉庫服務。
默認狀況下,會將倉庫建立在容器的/tmp/registry目錄下。能夠經過-v參數來將鏡像文件存放在本地的指定路徑上。
例以下面的例子將上傳的鏡像放到/opt/data/registry目錄:session
[root@gavin ~]# sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此時,在本地將啓動一個私有倉庫服務,監聽端口爲5000。
首先在A虛擬機中搭建私有倉庫,查看其地址爲192.168.1.16:5000。而後在B虛擬中測試上傳和下載鏡像。
在B虛擬機中查看已有鏡像:
[root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 9f38484d220f 5 months ago 202MB
使用docker tag命令將這個鏡像標記爲192.168.1.16:5000/test(格式爲docker tag IMAGE[:TAG] [REGISTRYHOST/] [USERNAME/]NAME[:TAG]):
[root@gavin ~]# sudo docker tag centos:latest 192.168.1.16:5000/test [root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE192.168.1.16:5000/test latest 9f38484d220f 5 months ago 202MB centos latest 9f38484d220f 5 months ago 202MB
使用docker push上傳標記的鏡像:
[root@gavin ~]# sudo docker push 192.168.1.16:5000/test The push refers to repository [192.168.1.16:5000/test] d69483a6face: Pushed latest: digest: sha256:ca58fe458b8d94bc6e3072f1cfbd334855858e05e1fd633aa07cf7f82b048e66 size: 529
如今能夠到任意一臺能訪問到192.168.1.16地址的機器去下載這個鏡像了:
[root@gavin /]# sudo docker pull 192.168.1.16:5000/test Using default tag: latest latest: Pulling from test Digest: sha256:ca58fe458b8d94bc6e3072f1cfbd334855858e05e1fd633aa07cf7f82b048e66 Status: Downloaded newer image for 192.168.1.16:5000/test:latest [root@gavin /]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE192.168.1.16:5000/test latest 9f38484d220f 5 months ago 202MB
推送鏡像到私服報錯:
The push refers to repository [192.168.1.16:5000/test] Get https://192.168.1.16:5000/v2/: http: server gave HTTP response to HTTPS client
緣由:
docker私有倉庫服務器,默認是基於https傳輸的,因此咱們須要在客戶端作相關設置,不使用https傳輸
解決步驟:
[root@gavin ~]# vim /etc/docker/daemon.json
將下面的代碼放進去保存並退出
"insecure-registries":["192.168.1.16:5000"]
最終以下所示:
{ "registry-mirrors": ["https://9pcu7szd.mirror.aliyuncs.com"], "insecure-registries":["192.168.1.16:5000"] }
依次執行下面兩條命令,從新啓動docker:
[root@gavin ~]# systemctl daemon-reload
[root@gavin ~]# systemctl restart docker
這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》