1. 程式人生 > >Docker學習(三)-----Docker映象和倉庫瞭解以及加速

Docker學習(三)-----Docker映象和倉庫瞭解以及加速

映象(Image)是構建容器的基礎,映象是一種分層結構的檔案系統。我們可以從倉庫(Repository)中下載映象,而倉庫又儲存在Registry中,Docker Hub是Docker官方提供的Registry。即可以從Docker Hub的頂層倉庫中免費獲取官方提供的基於映象,又可以將自已構建的映象存放於Docker Hub的使用者倉庫中。

什麼Docker映象

映象是一個只讀的層(layer),由檔案系統疊加構成。而映象又是容器(Container)的構成單元,我們一般會將應用構建成標準的映象元件,一或多個映象疊加又構成了容器。

bootfs
Docker由檔案系統疊加組成,其最底層是一個引導檔案系統,即:bootfs,這個很像Linux或Unix的引導檔案系統。引導檔案系統負責載入容器,容器載入完成後會被移到記憶體中,而引導檔案系統會被解除安裝,以留出更多的記憶體初始化(initrd)磁碟。

rootfs
在引導檔案系統之上是root檔案系統,即:rootfs。rootfs是在容器啟動時,其內部可見的檔案系統,其中會包含容器所需要的檔案、工具、容器檔案等。rootfs可以是一或多個作業系統映象(基礎映象),如:Debian、Ubuntu、CentOS等。
在Linux系統引導過程中,系統核心啟動時,會首先載入一個只讀的rootfs。系統對其做完整性等檢測後,再決定是否將其切換為讀/寫模式,或者用一種新的rootfs代替當前rootfs。Docker的設計思想與此類似,不同的是Docker不會將檔案系統改為讀寫模式,而是利用聯合載入(Union mount)技術,在rootfs之上載入更多的只讀檔案系統。

聯合載入(Union mount)
聯合載入(Union mount)是指一次載入多個檔案系統,但外面看來只有一個檔案系統。聯合載入會將各層檔案系統疊加到一起,這樣最終看到的是一個包含所有檔案和目錄的、合併後的檔案系統。

映象(Image)
在Docker中將這種檔案稱為映象(Image),或者說上Docker容器的檔案系統是由多個映象來構成的。一個映象,可以放在另一個映象之上。位於底層的映象稱之為父映象,而位於最底層的映象稱之為基礎映象(Base Image)。

當從一個映象啟動容器時,Docker會從該映象的最頂層載入一個讀/寫檔案系統,而我們的應用就會運行於這個讀/寫層中。

映象從哪裡來

docker pull命令會把映象從Registry的映象倉庫中將映象拉到本地,使用docker run命令建立、執行容器時,如果本地不存在建立容器的鏡,首先也會從映象倉庫下載映象。
映象是從映象倉庫下載下來的。映象儲存在映象倉庫,而映象倉庫儲存在Registry。Registry是由Docker運營的一個公共映象服務,即:Docker Hub(類似於GitHub)。

Docker Registry是開源的,個人或組織也可以執行自己的Registry。市場上除了Docker官方的Registry外,還有很多第三方Registry服務。這些Registry服務大多基於Docker Registry或Docker Trusted Registry(Docker公司提供的商業版的Docker Hub)構建。

映象倉庫

映象在儲存Docker Hub的倉庫(Repository)中的,映象倉庫類似於Git中倉庫的概念。一個倉庫中可以儲存很多映象,或者說很多版本的映象。也和Git一樣,Docker Hub也通過標籤(tag)來標籤映象的不同版本。如:ubuntu映象的倉庫中就包含了12.04、14.04、16.10、trusty、latest等不同的映象版本。
在使用docker pull等命令下載映象時,如果不指定映象版本,預設將下載latest版本。如果需要下載指定版本的映象,可以通過倉庫名:標籤名的形式下載。
如,下載14.04版本的ubuntu映象:

$ sudo docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
c60055a51d74: Pull complete 
755da0cdb7d2: Pull complete 
969d017f67e6: Pull complete 
37c9a9113595: Pull complete 
a3d9f8479786: Pull complete 
Digest: sha256:8f5f12335124c1b78e4cf2f8860d395f75ba279bae70a3c18dd470e910e38ec5
Status: Downloaded newer image for ubuntu:14.04

下載完成後,可以通過docker images檢視當前已下載的映象:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              f49eec89601e        12 days ago         129 MB
ubuntu              14.04               b969ab9f929b        12 days ago         188 MB

可以看到,本機除latest版的映象外,又多出了一個14.04版本的映象。

需要注意的是,我們可以看到相比完整的Ubuntu系統來說,映象要小的多。這是因為,映象並不是一個完整的系統,而是一個裁剪版的系統,只包含了支援系統執行的有限元件。

除了在docker pull命令中可以指定映象標籤(版本)外,使用映象的docker run和docker run命令同樣可以指定。

如,使用16.04版本的ubuntu映象執行一個容器:

$ sudo docker run -t -i --name ubuntu_16.04 ubuntu:16.04 /bin/bash
Unable to find image 'ubuntu:16.04' locally
16.04: Pulling from library/ubuntu
Digest: sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf71cf53415f29c130950
Status: Downloaded newer image for ubuntu:16.04

docker images檢視,同樣會下載指定版本的映象到本地:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               f49eec89601e        12 days ago         129 MB
ubuntu              latest              f49eec89601e        12 days ago         129 MB
ubuntu              14.04               b969ab9f929b        12 days ago         188 MB

映象標籤(tag)

為區分一個倉庫中的不同映象(不同映象版本),Docker Hub引入標籤。

我們在前面介紹,映象由檔案系統疊加構成。而映象又是由多層構成,每一層包含了檔案和配置兩部分,我們一般會把層(Layer)做為一個獨立的單元。而標籤就是對這些映象層的標記。

通過映象層和標籤,我們可以輕鬆實現映象和容器的模組化管理。通過一定的提交、構建機制,還可以很輕鬆的在現在映象的基礎上構建新映象。

為了方便映象的查詢,同一個映象可以存在不同的標籤。如,上面的ubuntu:latest 與 ubuntu:16.04 具有相同的映象ID,映象ID才是映象的唯一標識。

倉庫型別

在Docker Hub有型別的倉庫:使用者倉庫(User Repository)和頂層倉庫(Top-level Repository)。其中,使用者倉庫是由使用者建立的倉庫;而頂層倉庫由Doker官方建立和維護。
登入Docker Hub後,可以通過Create-Create Repository連結建立使用者建立:

使用者倉庫由使用者名稱和倉庫名兩部分組成,如,joe/myrepository:
使用者名稱:joe
倉庫名:myrepository
用可以基於頂層倉庫構建自己的倉庫。下載使用者倉庫中的映象與項層倉庫下載規則相同:

$ sudo docker pull joe/myrepository:latest

映象(Image)的基礎操作

顯示所有映象

通過映象建立容器後,映象從映象倉庫(Registry)下載到本地。可以通過docker images命令檢視本地主機上的映象:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              f49eec89601e        8 days ago          129 MB

如上所示,我們在介紹Docker 容器時,使用ubuntu映象建立容器。該鏡存放於Docker Hub一個名為ubuntu的倉庫中,而其下載到本地後,會被儲存在/var/lib/docker目錄下。

拉取(下載)映象

使用docker run命令從映象啟動容器時,如果映象在本地不存在,那麼首先會從Docker Hub中下載該映象。
如,我們按如下方式執行一個互動式容器後:

$ sudo docker run -i -t --name joe_ubuntu ubuntu /bin/bash

建立後,會在宿主機上儲存了一個ubuntu映象,其版本號為latest,即,最後一個版本的映象。
為了加快容器啟動時間,在執行容器前,可以通過docker pull命令將映象先下載到本地。
如,拉取一個centos6版本的CentOS基礎映象:

$ sudo docker pull centos:centos6
centos6: Pulling from library/centos
32c4f4fef1c6: Pull complete 
Digest: sha256:1092df198d3da4faccc0660941b763ce5adf133b0ec71701b760d6f173c1f47b
Status: Downloaded newer image for centos:centos6

在這個示例中,使用倉庫名:版本號形式下載了一個centos映象。如果不指定版本號,預設將下載最後一個版本,即:latest。

下載完成後,就可以通docker images命令工看到這個映象。也可以docker images命令後指定映象名檢視:

$ sudo docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos6             8315978ceaaa        3 months ago        195 MB

查詢映象

查詢映象有兩種方式:Docker Hub線上查詢映象、docker search命令查詢。

線上查詢映象

可以通過Docker Hub官網線上查詢映象:
https://hub.docker.com (需要註冊登入)
如,通過centos關鍵字可以搜尋到名稱中含有該關鍵字的相關映象:

點選進行之後有獲取的命令。

docker search命令查詢

還可以使用docker search命令查詢映象。命令格式如下:

docker search [OPTIONS] TERM
如,通過centos關鍵字查詢映象:

$ sudo docker search centos
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                 The official build of CentOS.                   3063      [OK]       
jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8...   57                   [OK]
jdeathe/centos-ssh-apache-php          CentOS-6 6.8 x86_64 - Apache / PHP-FPM / P...   25                   [OK]
nimmis/java-centos                     This is docker images of CentOS 7 with dif...   23                   [OK]
consol/centos-xfce-vnc                 Centos container with "headless" VNC sessi...   18                   [OK]
million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   12                   [OK]

通過命令查詢時,返回資訊包括:
倉庫名(NAME)
映象描述(DESCRIPTION)
使用者評價(STARS)
是否官方式映象(OFFICIAL)
是否自動構建(AUTOMATED)- 即由Docker Hub自動構建(Automated Build)流程建立
查詢到指定映象後,就可以git pull命令下載映象。

如,下載名為jdeathe/centos-ssh的映象:

$ sudo docker pull jdeathe/centos-ssh

映象下載後,就可以通過下載的映象建立或啟動容器,也可以基於這些映象構建自己的映象。

映象刪除

當映象不再需要時,可以將映象從刪除。刪除映象使用docker rmi命令。
如,刪除jdeathe/centos-ssh的映象:

$ sudo docker rmi jdeathe/centos-ssh
Untagged: jdeathe/centos-ssh:latest
Untagged: jdeathe/[email protected]:7dbd9e7e37bac65bc6aff99472ea2919b38ede8da3a09c58bf56d4a3523d5abf
Deleted: sha256:c3c34686b22ea2290d2c0316dde74ed4d2639b2f2ab27a7b72734dbc397ee2db
Deleted: sha256:ef89b3ead0b29fdc9e02a040830df8e18186f65e92134e0ec8bbd6f3d2e0f77e
Deleted: sha256:fe9df9eef47591a7afeba1a0747bf2b9b75dc31d9521df0dffd1cfa2677e82a7

刪除和映象時,我們會看到很多的Deleted行。這是因為,Docker映象是一種以層(Layer)為單位的分層檔案系統,每一行Deleted都表示一個映象層被刪除。

注意:docker rmi只能刪除本地映象,並不能刪除映象倉庫。映象倉庫需要登入Docker Hub後,在後臺刪除對應的Repository。

刪除映象時,可以同時刪除多個映象:

$ sudo docker rmi image1 image2

刪除映象時,也可以指定版本號:

$ sudo docker rmi centos:centos6

映象加速

我們安裝好docker之後首先第一件是應該是給它作映象加速,否則其他的操作會比較慢。

最常使用的 Registry 公開服務是官方的 Docker Hub,這也是預設的 Registry,並擁有大量的高質量的官方映象。除此以外,還有 CoreOS 的 Quay.io,CoreOS 相關的映象儲存在這裡;Google 的 Google Container Registry,Kubernetes 的映象使用的就是這個服務。

由於某些原因,在國內訪問這些服務可能會比較慢。國內的一些雲服務商提供了針對 Docker Hub 的映象服務(Registry Mirror),這些映象服務被稱為加速器。常見的有 阿里雲加速器、DaoCloud 加速器 等。使用加速器會直接從國內的地址下載 Docker Hub 的映象,比直接從 Docker Hub 下載速度會提高很多。

國內也有一些雲服務商提供類似於 Docker Hub 的公開服務。比如 時速雲映象倉庫、網易雲映象服務、DaoCloud 映象市場、阿里雲映象庫 等。

鑑於國內網路問題,後續拉取Docker 映象十分緩慢,我們可以需要配置加速器來解決。

阿里雲和DaoCloud的加速器使用起來有點麻煩,需要註冊以及驗證等等,在官網連結裡有它們的安裝配置使用方式,推薦使用ustc和網易加速器,直接修改registry-mirrors配置引數即可。

檢視docker版本

使用命令檢視docker版本,因為不同的版本,配置加速器的方法不同。

sudo  docker version

配置映象加速器(Docker版本1.10.0以上)

新版的 Docker 針對linux版本使用 /etc/docker/daemon.json(Linux) 來配置 Daemon。
請在該配置檔案中加入(沒有該檔案的話,請先建一個):
使用命令

sudo vi /etc/docker/daemon.json

然後使用命令重啟docker即可。

sudo service docker restart

配置映象加速器(Docker版本1.10.0以下)

編輯/etc/sysconfig/docker檔案

sudo vi /etc/sysconfig/docker

在other_args引數後如下內容

other_args="--registry-mirror=https://docker.mirrors.ustc.edu.cn"

重啟服務

service docker restart

可能遇到的問題Repository not found

Pulling repository hello-world
Repository not found

詳細報錯如下:

[[email protected] ~]$ sudo docker search hello
NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
hello-world                                Hello World! (an example of minimal Docker...   518       [OK]       
kitematic/hello-world-nginx                A light-weight nginx container that demons...   98                   
tutum/hello-world                          Image to test docker deployments. Has Apac...   51                   [OK]
openshift/hello-openshift                  Simple Example for Running a Container on ...   24                   
google/nodejs-hello                                                                        20                   [OK]
dockercloud/hello-world                    Hello World!                                    14                   [OK]
karthequian/helloworld                     A simple helloworld nginx container to get...   10                   [OK]
nginxdemos/hello                           NGINX webserver that serves a simple page ...   6                    [OK]
marcells/aspnet-hello-world                ASP.NET vNext - Hello World                     5                    [OK]
crccheck/hello-world                       Hello World web server in under 2.5 MB          3                    [OK]
ppc64le/hello-world                        Hello World! (an example of minimal Docker...   1                    
hello-seattle                              Hello from DockerCon 2016 (Seattle)!            1         [OK]       
yaros1av/hello-core                        Hello from ASP.NET Core!                        1                    
infrastructureascode/hello-world           A tiny "Hello World" web server with a hea...   0                    [OK]
wouterm/helloworld                          A simple Docker image with an Nginx serve...   0                    [OK]
ansibleplaybookbundle/hello-world-apb      An APB which deploys a sample Hello World!...   0                    [OK]
hivesolutions/hello_appier                 Simple hello world application for appier.      0                    [OK]
ansibleplaybookbundle/hello-world-db-apb   An APB which deploys a sample Hello World!...   0                    [OK]
gramercylabs/docker-helloworld             hello world                                     0                    [OK]
silasbw/hello                                                                              0                    
milsonian/hellohttp                        Basic hello world http app in golang            0                    [OK]
s390x/hello-world                          Hello World! (an example of minimal Docker...   0                    
joerx/express-hello-src                    App image for https://github.com/joerx/exp...   0                    
jeffdecola/hello-go                        Useful for Marathon testing.  Prints "Hell...   0                    
tdesikan/hellocab-churner                                                                  0                    
[[email protected] ~]$ sudo docker pull hello-world
latest: Pulling from hello-world

882673a3c694: Pulling fs layer 
Pulling repository hello-world 
Repository not found

原因
嘗試在國內的倉庫中找到相關映象使用 命令遠端指定pull如下:

docker pull hub.c.163.com/public/centos:6.7-tools

可以下載成功,說明是我們的倉庫的配置問題,原倉庫已經被牆,連線不到。

解決方案
參考映象加速章節,修改可用的映象倉庫。

相關推薦

Docker學習()-----Docker映象倉庫瞭解以及加速

映象(Image)是構建容器的基礎,映象是一種分層結構的檔案系統。我們可以從倉庫(Repository)中下載映象,而倉庫又儲存在Registry中,Docker Hub是Docker官方提供的Registry。即可以從Docker Hub的頂層倉庫中免費獲取官

docker學習() docker容器操作(容器建立、刪除、檢視、啟動、停止)

檢視容器 檢視正在執行的容器 docker ps 個列意義: 引數名稱 引數意義 CONTAINER ID 容器id IMAGE 建立容器時所使用的映象 COMMAND 執行容器中的軟體執行的命令 CREATED 容器的建立時間

04_Docker入門(下)之docker映象倉庫的使用

docker映象和倉庫 映象介紹 docker映象是由檔案系統疊加而成的。最低端是一個引導檔案系統,即bootfs。當一個容器啟動後,它會將被移動到記憶體中,而引導檔案系統則會被解除安裝,以留出更多的記憶體以供initrd磁碟映象使用。 docker映象第二層是root檔案系統rootfs,它位

使用Docker映象倉庫

前面學習了安裝Docker 和 docker 的一些管理docker容器的命令。 回顧一下 $ sudo docker run -i -t --name another_container ubuntu

Docker學習筆記-mysql映象的使用外網訪問

1.      Pull mysql 執行命令docker pull mysql 2.      建立mysql容器 docker run --name

Docker之- 使用Docker 映象倉庫

目錄 使用Docker 映象和倉庫 什麼是 Docker 映象 列出 Docker 映象 tag 標籤 Docker Hub 拉取映象 查詢映

Docker學習(7)-建立映象

  上一節:Docker學習(6)-docker網路以及訪問已執行的Nginx 在上一節中,已經瞭解了基本的docker網路和瀏覽器訪問在官方倉庫的容器,本節開始製作自己的映象。   本節設計到的知

docker學習(二) docker映象操作(拉取、刪除、映象加速...)

檢視映象列表 docker images 每一列的意思: 列名 意義 備註 REPOSITORY 映象所在的倉庫名稱 TAG 映象標籤 為了區分同一個倉庫下的不同映象,Docker 提供了一種稱為標籤(Tag)的功能。每個映象在列出來時

docker學習docker容器映象打包以及建立網路

1. docker 將容器匯出 為了將容器遷移到其他的地方執行,可以將容器匯出, docker export container_name/container_id > service_name.tar.gz 拷貝到其他的機器後,可以匯入該容器: cat se

Docker學習筆記 — Docker私有倉庫搭建

和Mavan的管理一樣,Dockers不僅提供了一箇中央倉庫,同時也允許我們使用registry搭建本地私有倉庫。 使用私有倉庫有許多優點: 節省網路頻寬,針對於每個映象不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可; 提供映象資源利用,針對

docker學習() gradle 使用docker外掛自動構建springboot工程

gradle 使用docker外掛自動構建springboot工程 使用gradle 構建springboot工程直接打成docker映象,例子在github例子原始碼。 1 IDEA gradle構建一個Springboot多模組專案,過程略,可參

docker學習-09本地映象釋出到阿里雲

本地映象釋出到阿里雲流程:                 映象的生成方法:根據自定義的dockerfile建立的容器映象(docker build -t 映象名字),將其啟動起來,確保執行正確。 &nb

Docker實戰()Docker 跨主機網路overlay、macvlanflannel

跨主機網路概述 docker跨主機網路方案包括: docker 原生的 overlay 和 macvlan。 第三方方案:常用的包括 flannel、weave 和 calico。 docker通過libnetwork 以及 CNM 將眾多方案整合在一

docker學習7--宿主機容器時間不一致問題

    啟動一個以centos為基礎的映象,進入容器內date '+%Y-%m-%d %H:%M:%S'檢視時間,發現容器時間和宿主機不一致。     一臺宿主機可以有多個docker容器,宿主機的

springboot深入學習()-----docker、spring data

一、spring data思路   spring data使用統一的api來對各種資料庫儲存技術進行資料訪問操作提供了支援,包括oracle、mysql、redis、mongoDB等等。主要是通過spring data commons專案來實現的,提供了crud、查詢、排序和分頁等等功能。 spring

Docker學習兩事(二)容器與主機共享檔案(掛載目錄)

前言及準備 在開始學習docker一段時間後,對於docker的部分命令也算是都試了一遍,在平時使用虛擬機器是就會有檔案與本地主機共享,現在雲伺服器上一堆檔案指令碼,想在容器裡測試,於是就想著掛載個文到容器,其實就是本地主機與容器之間共享檔案。 操作實錄

Docker學習之搭建maven私有倉庫

2018-05-21 07:00:00,772+0000 INFO  [quartz-5-thread-1] *SYSTEM org.sonatype.nexus.quartz.internal.task.QuartzTaskInfo - Task 'Storage facet cleanup' [repos

Docker 學習筆記_安裝使用MongoDB

虛擬機 http .com 端口映射 學習筆記 alt 存儲 鏡像 mage 一、準備 1、宿主機OS:Win10 64 2、虛擬機OS:Ubuntu18.04 3、賬號:docker 二、安裝 1、搜索MongoDB鏡像

Docker學習筆記_安裝使用Zookeeper

ash http rest zook info run 4.4 win png 一、準備   1、宿主機OS:Win10 64位 2、虛擬機OS:Ubuntu18.04 3、賬號:docker 二、安裝 1、搜索鏡像

DOCKER學習_010:Docker的檔案系統以及製作映象

一 檔案系統簡介 1.1 Linux檔案系統 LInux空間組成分為核心空間和使用者空間(使用rootfs) linux檔案系統由 bootes和 rootfs組成, bootes主要包含boot1 oader和 kernel, bootloader主要是引導載入 kernel,當 kernel被載入到記憶體