1. 程式人生 > >Docker學習(2):介紹

Docker學習(2):介紹

1.1 什麼是Docker

1.Docker開源專案背景

Docker是基於Go語言實現的開源容器專案,誕生於2013年年初,最初發起者是dotCloud公司。Docker自開源後受到廣泛的關注和討論,目前已有多個相關專案(包括Docker三劍客、Kubernetes等),逐漸形成了圍繞Docker容器的生態體系。

Docker的構想是要實現“Build,Ship and Run Any App,Anywhere”,即通過對應用的封裝(Packaging)、分發(Distribution)、部署(Deployment)、執行(Runtime)生命週期進行管理,達到應用元件“一次封裝,到處執行”的目的。這裡的應用元件,既可以是一個 Web應用、一個編譯環境,也可以是一套資料庫平臺服務,甚至是一個作業系統或叢集。

簡單地講,讀者可以將Docker容器理解為一種輕量級的沙盒(sandbox)。每個容器內執行著一個應用,不同的容器相互隔離,容器之間也可以通過網路互相通訊。容器的建立和停止都十分快速,幾乎跟建立和終止原生應用一致;另外,容器自身對系統資源的額外需求也十分有限,遠遠低於傳統虛擬機器。很多時候,甚至直接把容器當作應用本身也沒有任何問題.

1.2 為什麼要使用Docker

1.Docker容器虛擬化的好處

通過容器來打包應用,解耦應用和執行平臺。意味著遷移的時候,只需要在新的伺服器上啟動需要的容器就可以了,無論新舊伺服器是否是同一型別的平臺。這無疑將節約大量的寶貴時間,並降低部署過程出現問題的風險。

2.Docker在開發和運維中的優勢

Docker在開發和運維過程中,具有如下幾個方面的優勢:

  • 更快的交付和部署。使用Docker,開發人員可以使用映象來快速構建一套標準的開發環境;開發完成之後,測試和運維人員可以直接使用完全相同環境來部署程式碼。只要開發測試過的程式碼,就可以確保在生產環境無縫執行。Docker可以快速建立和刪除容器,實現快速迭代,大量節約開發、測試、部署的時間。並且,整個過程全程可見,使團隊更容易理解應用的建立和工作過程。
  • 更高效的資源利用。Docker容器的執行不需要額外的虛擬化管理程式(Virtual Machine Manager,VMM,以及Hypervisor)支援,它是核心級的虛擬化,可以實現更高的效能,同時對資源的額外需求很低。跟傳統虛擬機器方
    式相比,要提高一到兩個數量級。
  • 更輕鬆的遷移和擴充套件。Docker容器幾乎可以在任意的平臺上執行,包括物理機、虛擬機器、公有云、私有云、個人電腦、伺服器等,同時支援主流的作業系統發行版本。這種相容性讓使用者可以在不同平臺之間輕鬆地遷移應用。
  • 更簡單的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。並且所有修改都以增量的方式被分發和更新,從而實現自動化並且高效的容器管理。

3.Docker與虛擬機器比較

在這裡插入圖片描述

第2章 核心概念與安裝配置

本章首先介紹Docker的三大核心概念。

  • 映象(Image)
  • 容器(Container)
  • 倉庫(Repository)
    只有理解了這三個核心概念,才能順利地理解Docker容器的整個生命週期。

2.1 核心概念

Docker的大部分操作都圍繞著它的三大核心概念——映象、容器和倉庫而展開。因此,準確把握這三大核心概念對於掌握Docker技術尤為重要。

1.Docker映象

Docker映象類似於虛擬機器映象,可以將它理解為一個只讀的模板。例如,一個映象可以包含一個基本的作業系統環境,裡面僅安裝了Apache應用程式(或使用者需要的其他軟體)。可以把它稱為一個Apache映象。映象是建立Docker容器的基礎。通過版本管理和增量的檔案系統,Docker提供了一套十分簡單的機制來建立和更新現有的映象,使用者甚至可以從網上下載一個已經做好的應用映象,並直接使用。

2.Docker容器

Docker容器類似於一個輕量級的沙箱,Docker利用容器來執行和隔離應用。容器是從映象建立的應用執行例項。可以將其啟動、開始、停止、刪除,而這些容器都是彼此相互隔離的、互不可見的。可以把容器看做是一個簡易版的Linux系統環境(包括root使用者許可權、程序空間、使用者空間和網路空間等)以及執行在其中的應用程式打包而成的盒子。

映象自身是隻讀的。容器從映象啟動的時候,會在映象的最上層建立一個可寫層。

3.Docker倉庫

Docker倉庫類似於程式碼倉庫,它是Docker集中存放映象檔案的場所。有時候會看到有資料將Docker倉庫和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器是存放倉庫的地方,其上往往存放著多個倉庫。每個倉庫集中存放某一類映象,往往包括多個映象檔案,通過不同的標籤(tag)來進行區分。例如存放Ubuntu作業系統映象的倉庫稱為Ubuntu倉庫,其中可能包括14.04、12.04等不同版本的映象。倉庫註冊伺服器的示例如圖2-1所示。

根據所儲存的映象公開分享與否,Docker倉庫可以分為公開倉庫(Public)和私有倉庫(Private)兩種形式。目前,最大的公開倉庫是官方提供的Docker Hub,其中存放了數量龐大的映象供使用者下載。國內不少雲服務提供商(如時速雲、阿里雲等)也提供了倉庫的本地源,可以提供穩定的國內訪問。
當然,使用者如果不希望公開分享自己的映象檔案,Docker也支援使用者在本地網路內建立一個只能自己訪問的私有倉庫。當用戶建立了自己的映象之後就可以使用push命令將它上傳到指定的公有或者私有倉庫。這樣使用者下次在另外一臺機器上使用該映象時,只需要將其從倉庫上pull下來就可以了。

第3章 使用Docker映象

映象(image)是Docker三大核心概念中最為重要的,自Docker誕生之日起“映象”就是相關社群最為熱門的關鍵詞。
Docker執行容器前需要本地存在對應的映象,如果映象沒儲存在本地,Docker會嘗試先從預設映象倉庫下載(預設使用Docker Hub公共註冊伺服器中的倉庫),使用者也可以通過配置,使用自定義的映象倉庫。本章將介紹圍繞映象這一核心概念的具體操作,包括如何使用pull命令從
Docker Hub倉庫中下載映象到本地,如何檢視本地已有的映象資訊和管理映象標籤,如何在遠端倉庫使用search命令進行搜尋和過濾,如何刪除映象標籤和映象檔案,如何建立使用者定製的映象並且儲存為外部檔案。最後,還介紹如何往Docker Hub倉庫中推送自己的映象。

3.1 獲取映象

映象是執行容器的前提,官方的Docker Hub網站已經提供了數十萬個映象供大家開放下載。
可以使用docker pull命令直接從Docker Hub映象源來下載映象。該命令的格式為docker pull NAME[:TAG]。其中,NAME是映象倉庫的名稱(用來區分映象),TAG是映象的標籤(往往用來表示版本資訊)。通常情況下,描述一個映象需要包括“名稱+標籤”資訊。
例如,獲取一個Ubuntu 14.04系統的基礎映象可以使用如下的命令:

14.04: Pulling from library/ubuntu
6c953ac5d795: Pull complete
3eed5ff20a90: Pull complete
f8419ea7c1b5: Pull complete
51900bc9e720: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:97421885f3da3b23f52eeddcaa9f8f91172a8ac3cd5d3cd40b51c7aad09f66cc
Status: Downloaded newer image for ubuntu:14.04

對於Docker映象來說,如果不顯式指定TAG,則預設會選擇 latest標籤,這會下載倉庫中最新版本的映象。

下載過程中可以看出,映象檔案一般由若干層(layer)組成,6c953ac5d795這樣的串是層的唯一id(實際上完整的 id包括256位元,由64個十六進位制字元組成)。使用docker pull命令下載時會獲取並輸出映象的各層資訊。當不同的映象包括相同的層時,本地僅儲存層的一份內容,減小了需要的儲存空間。

pull子命令支援的選項主要包括:-a,--all-tags=true|false:是否獲取倉庫中的所有映象,預設為否。
下載映象到本地後,即可隨時使用該映象了,例如利用該映象建立一個容器,在其中執行bash應用,執行ping localhost命令:

$ docker run -it ubuntu:14.04 bash
[email protected]:/# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.018 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.018/0.033/0.058/0.017 ms
[email protected]:/# exit
exit

3.2 檢視映象資訊

1.使用images命令列出映象
使用docker images命令可以列出本地主機上已有映象的基本資訊。
例如,下面的命令列出了上一小節中下載的映象資訊:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2fa927b5cdd3 2 weeks ago 122 MB
ubuntu latest 2fa927b5cdd3 2 weeks ago 122 MB
ubuntu 14.04 8f1bd21bd25c 2 weeks ago 188 MB

在列出的資訊中,可以看到以下幾個欄位資訊。

  • 來自於哪個倉庫,比如ubuntu倉庫用來儲存ubuntu系列的基礎映象;
  • 映象的標籤資訊,比如14.04、latest用來標註不同的版本資訊。標籤只是標記,並不能標識映象內容;
  • 映象的ID(唯一標識映象),如ubuntu:latest和ubuntu:16.04映象的ID都是2fa927b5cdd3,說明它們目前實際上指向同一個映象;
  • 建立時間,說明映象最後的更新時間;
  • 映象大小,優秀的映象往往體積都較小。

其中映象的ID資訊十分重要,它唯一標識了映象。在使用映象ID的時候,一般可以使用該ID的前若干個字元組成的可區分串來替代完整的ID。
TAG資訊用來標記來自同一個倉庫的不同映象。例如ubuntu倉庫中有多個映象,通過TAG資訊來區分發行版本,包括10.04、12.04、12.10、13.04、14.04、16.04等標籤。

映象大小資訊只是表示該映象的邏輯體積大小,實際上由於相同的映象層本地只會儲存一份,物理上佔用的儲存空間會小於各映象的邏輯體積之和。

2.使用tag命令新增映象標籤

為了方便在後續工作中使用特定映象,還可以使用docker tag命令來為本地映象任意新增新的標籤。例如新增一個新的myubuntu: latest映象標籤:

$ docker tag ubuntu:latest myubuntu:latest

3.使用inspect命令檢視詳細資訊

使用docker inspect命令可以獲取該映象的詳細資訊,包括製作者、適應
架構、各層的數字摘要等

$ docker inspect ubuntu:14.04

返回的是一個JSON格式的訊息,如果我們只要其中一項內容時,可以使用引數-f來指定,例如,獲取映象的Architecture:

$ docker inspect -f {{".Architecture"}}
amd64

3.3 搜尋映象

使用docker search命令可以搜尋遠端倉庫中␀享的映象,預設搜尋官方倉庫中的映象。用法為docker search TERM,支援的引數主要包括:

  • –automated=true|false:僅顯示自動建立的映象,預設為否;
  • –no-trunc=true|false:輸出資訊不截斷顯示,預設為否;
  • -s,–stars=X:指定僅顯示評價為指定星級以上的映象,預設為0,即輸出所有映象。
    例如,搜尋所有自動建立的評價為1+的帶nginx關鍵字的映象,如下所示:
$ docker search --automated -s 3 nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 670 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 206 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 67 [OK]
maxexcloo/nginx-php Docker framework container with Nginx and ... 57 [OK]
webdevops/php-nginx Nginx with PHP-FPM 38 [OK]
h3nrik/nginx-ldap NGINX web server with LDAP/AD, SSL and pro... 27 [OK]
bitnami/nginx Bitnami nginx Docker Image 18 [OK]
maxexcloo/nginx Docker framework container with Nginx inst... 7 [OK]
million12/nginx Nginx: extensible, nicely tuned for better... 4 [OK]
webdevops/nginx Nginx container 3 [OK]
ixbox/nginx Nginx on Alpine Linux. 3 [OK]
evild/alpine-nginx Minimalistic Docker image with Nginx 3 [OK]

3.4 刪除映象

1.使用標籤刪除映象

使用docker rmi命令可以刪除映象,命令格式為docker rmi IMAGE[IMAGE...],其中IMAGE可以為標籤或ID。
例如,要刪除掉myubuntu: latest映象,可以使用如下命令:

$ docker rmi myubuntu:latest
Untagged: myubuntu:latest

讀者可能會擔心,本地的ubuntu:latest映象是否會受此命令的影響。無需擔心,當同一個映象擁有多個標籤的時候,docker rmi命令只是刪除該映象多個標籤中的指定標籤而已,並不影響映象檔案。因此上述操作相當於只是刪除了映象2fa927b5cdd3的一個標籤而已。

但當映象只剩下一個標籤的時候就要小心了,此時再使用docker rmi命令會徹底刪除映象。
例如刪除標籤為ubuntu:14.04的映象,由於該映象沒有額外的標籤指向它,執行docker rmi命令,可以看出它會刪除這個映象檔案的所有層:

$ docker rmi ubuntu:14.04
Untagged: ubuntu:14.04
Deleted: sha256:8f1bd21bd25c3fb1d4b00b7936a73a0664f932e11406c48a0ef19d82fd0b7342
Deleted: sha256:8ea3b9ba4dd9d448d1ca3ca7afa8989d033532c11050f5e129d267be8de9c1b4
Deleted: sha256:7db5fb90eb6ffb6b5418f76dde5f685601fad200a8f4698432ebf8ba80757576
Deleted: sha256:19a7e879151723856fb640449481c65c55fc9e186405dd74ae6919f88eccce75
Deleted: sha256:c357a3f74f16f61c2cc78dbb0ae1ff8c8f4fa79be9388db38a87c7d8010b2fe4
Deleted: sha256:a7e1c363defb1f80633f3688e945754fc4c8f1543f07114befb5e0175d569f4c

2.使用映象ID刪除映象

當使用docker rmi命令,並且後面跟上映象的ID(也可以是能進行區分的部分ID串字首)時,會先嚐試刪除所有指向該映象的標籤,然後刪除該映象檔案本身。

注意,當有該映象建立的容器存在時,映象檔案預設是無法被刪除的,例如,先利用ubuntu:14.04映象建立一個簡單的容器來輸出一段話

$ docker run ubuntu:14.04 echo 'hello! I am here!'
hello! I am here!

3.5 建立映象

建立映象的方法主要有三種:基於已有映象的容器建立、基於本地模板匯入、基於Dockerfile建立。
本節將重點介紹前兩種方法。最後一種基於Dockerfile建立的方法將在後續章節專門予以詳細介紹。

1.基於已有映象的容器建立

該方法主要是使用docker commit命令。命令格式為docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]],主要選項包括:

  • -a,–author="":作者資訊;
  • -c,–change=[]:提交的時候執行 Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
  • -m,–message="":提交訊息;
  • -p,–pause=true:提交時暫停容器執行。
    下面將演示如何使用該命令建立一個新映象。首先,啟動一個映象,並在其中進行修改操作,例如建立一個test檔案,之後退出:
$ docker run -it ubuntu:14.04 /bin/bash
[email protected]:/# touch test
[email protected]:/# exit

記住容器的ID為a925cb40b3f0。
此時該容器跟原ubuntu:14.04映象相比,已經發生了改變,可以使用docker commit命令來提交為一個新的映象。提交時可以使用ID或名稱來指定容器:

$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27

順利的話,會返回新建立的映象的ID資訊,例如9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27。
此時檢視本地映象列表,會發現新建立的映象已經存在了:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test 0.1 9e9c814023bc 4 seconds ago 188 MB

2.基於本地模板匯入
使用者也可以直接從一個作業系統模板檔案匯入一個映象,主要使用dockerimport命令。命令格式為docker import[OPTIONS]file|URL|-[REPOSITORY[:TAG]]。
要直接匯入一個映象,可以使用OpenVZ提供的模板來建立,或者用其他已匯出的映象模板來建立。OPENVZ模板的下載地址為 http://openvz.org/Download/templates/precreated。
例如,下載了ubuntu-14.04的模板壓縮包,之後使用以下命令匯入:

$ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

然後檢視新匯入的映象,會發現它已經在本地存在了:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB

3.6 存出和載入映象

使用者可以使用docker save和docker load命令來存出和載入映象。

1.存出鏡像

如果要匯出映象到本地檔案,可以使用docker save命令。例如,匯出本地的ubuntu:14.04映象為檔案ubuntu_14.04.tar,如下所示:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 8f1bd21bd25c 2 weeks ago 188 MB
...
$ docker save -o ubuntu_14.04.tar ubuntu:14.04

之後,使用者就可以通過複製ubuntu_14.04.tar檔案將該映象分享給他人。

2.載入映象

可以使用docker load將匯出的tar檔案再匯入到本地映象庫,例如從檔案ubuntu_14.04.tar匯入映象到本地映象列表,如下所示:

$ docker load --input ubuntu_14.04.tar

$ docker load < ubuntu_14.04.tar

這將匯入映象及其相關的元資料資訊(包括標籤等)。匯入成功後,可以使用docker images命令進行檢視。

3.7 上傳映象
可以使用docker push命令上傳映象到倉庫,預設上傳到Docker Hub官方
倉庫(需要登入)。命令格式為:

docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

使用者在Docker Hub網站註冊後可以上傳自制的映象。例如使用者user上傳本地的test:latest映象,可以先新增新的標籤user/test:latest,然後用docker push命令上傳映象:

$ docker tag test:latest user/test:latest
$ docker push user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
Please login prior to push:
Username:
Password:
Email:

第一次上傳時,會提示輸入登入資訊或進行註冊.

第4章 操作Docker容器

第5章 訪問Docker倉庫


來源:docker技術入門與實戰