Docker學習(2):介紹

1.1 什麼是Docker

1.Docker開源項目背景

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

Docker的構想是要實現「Build,Ship and Run Any App,Anywhere」,即經過對應用的封裝(Packaging)、分發(Distribution)、部署(Deployment)、運行(Runtime)生命週期進行管理,達到應用組件「一次封裝,處處運行」的目的。這裏的應用組件,既能夠是一個 Web應用、一個編譯環境,也能夠是一套數據庫平臺服務,甚至是一個操做系統或集羣。nginx

簡單地講,讀者能夠將Docker容器理解爲一種輕量級的沙盒(sandbox)。每一個容器內運行着一個應用,不一樣的容器相互隔離,容器之間也能夠經過網絡互相通訊。容器的建立和中止都十分快速,幾乎跟建立和終止原生應用一致;另外,容器自身對系統資源的額外需求也十分有限,遠遠低於傳統虛擬機。不少時候,甚至直接把容器看成應用自己也沒有任何問題.web

1.2 爲何要使用Docker

1.Docker容器虛擬化的好處

經過容器來打包應用,解耦應用和運行平臺。意味着遷移的時候,只須要在新的服務器上啓動須要的容器就能夠了,不管新舊服務器是不是同一類型的平臺。這無疑將節約大量的寶貴時間,並下降部署過程出現問題的風險。docker

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

Docker在開發和運維過程當中,具備以下幾個方面的優點:數據庫

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

3.Docker與虛擬機比較

在這裏插入圖片描述

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

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

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

2.1 核心概念

Docker的大部分操做都圍繞着它的三大核心概念——鏡像、容器和倉庫而展開。所以,準確把握這三大核心概念對於掌握Docker技術尤其重要。bash

1.Docker鏡像

Docker鏡像相似於虛擬機鏡像,能夠將它理解爲一個只讀的模板。例如,一個鏡像能夠包含一個基本的操做系統環境,裏面僅安裝了Apache應用程序(或用戶須要的其餘軟件)。能夠把它稱爲一個Apache鏡像。鏡像是建立Docker容器的基礎。經過版本管理和增量的文件系統,Docker提供了一套十分簡單的機制來建立和更新現有的鏡像,用戶甚至能夠從網上下載一個已經作好的應用鏡像,並直接使用。服務器

2.Docker容器

Docker容器相似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用。容器是從鏡像建立的應用運行實例。能夠將其啓動、開始、中止、刪除,而這些容器都是彼此相互隔離的、互不可見的。能夠把容器看作是一個簡易版的Linux系統環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)以及運行在其中的應用程序打包而成的盒子。網絡

鏡像自身是隻讀的。容器從鏡像啓動的時候,會在鏡像的最上層建立一個可寫層。架構

3.Docker倉庫

Docker倉庫相似於代碼倉庫,它是Docker集中存放鏡像文件的場所。有時候會看到有資料將Docker倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器是存放倉庫的地方,其上每每存放着多個倉庫。每一個倉庫集中存放某一類鏡像,每每包括多個鏡像文件,經過不一樣的標籤(tag)來進行區分。例如存放Ubuntu操做系統鏡像的倉庫稱爲Ubuntu倉庫,其中可能包括14.0四、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
root@9c74026df12a:/# 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
root@9c74026df12a:/# 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.0四、latest用來標註不一樣的版本信息。標籤只是標記,並不能標識鏡像內容;
  • 鏡像的ID(惟一標識鏡像),如ubuntu:latest和ubuntu:16.04鏡像的ID都是2fa927b5cdd3,說明它們目前實際上指向同一個鏡像;
  • 建立時間,說明鏡像最後的更新時間;
  • 鏡像大小,優秀的鏡像每每體積都較小。

其中鏡像的ID信息十分重要,它惟一標識了鏡像。在使用鏡像ID的時候,通常可使用該ID的前若干個字符組成的可區分串來替代完整的ID。
TAG信息用來標記來自同一個倉庫的不一樣鏡像。例如ubuntu倉庫中有多個鏡像,經過TAG信息來區分發行版本,包括10.0四、12.0四、12.十、13.0四、14.0四、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
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# 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容器

容器是鏡像的一個運行實例。所不一樣的是,鏡像是靜態的只讀文件,而容器帶有運行時須要的可寫文件層,同時,容器中的應用進程處於運行狀態.

4.1建立容器

命令:create start run wait logs

1.新建容器

可使用 docker [container] create命令新建一個容器

$ docker create -it ubuntu:latest 
af8f4f922dafee22c8fe6cd2aelld16e250 7d61flblfa55b36e94db7ef45178
2.啓動容器
docker [container] start
3.新建井啓動窯器

所須要的命令主要爲 docker [container ]run,等價於先執行 docker [container]
create 命令,再執行 docker [container] start 命令

4. 守護態運行

更多的時候,須要讓 Docker 容器在後臺以守護態( Daemonized )形式運行 此時,能夠
經過添加-d 參數來實現
例如,下面的命令會在後臺運行容器

$ docker -d ubuntu /bin/ sh -c "while true; do echo hello world; sleep l; done 」 
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846
5. 查看容器輸出
$ docker logs ce554267d7a4 
hello world

4.2中止容器

命令:pause/unpause stop prune

1. 暫停窯器

可使用 docker [container] pause CONTAINER [CONTAINER … ]命令來暫停一個運行中的容器;
例如,啓動一個容器,並將其暫停:

$ docker run --name test --rm -it ubuntu bash 
$ docker pause test 
$ docker ps
2. 終止窯器

可使用 docker [container] stop 來終止一個運行中的容器 該命令的格式爲

docker [container] stop [-t | --time[=10]] [CONTAINER ...]

4.3 進人容器

若是須要進入容器進行操做,推薦使用官方的 attach/exec 命令

1. attach 命令

attach Dock 自帶的命令,命令格式爲:

docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] 
CONTAINER
--detach-keys[=[]]:指定退出 attach 模式的快捷鍵序列,
--no-stdin=true|false :是否關閉標準輸入,
--sig-proxy=true|false :是否代理收到的系統信號給應用進程,默認爲 true
2.exec 命令

4.4 刪除容器

docker [container] rm
命令格式爲

docker [container) rm [-f|--force) [-1|--link] [-v|--volumes] CONTAINER [CONTAINER ...]

4.5 導人和導出容器

1.導出容器
docker [container] export [-o|--output [=""]] CONTAINER
2. 導入窯器
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY [:TAG]]

4.6 查看容器

命令:inspect top stats

1.查看容器詳情

查看容器詳情可使用
docker container inspect [OPTIONS] CONTAINER [CONTAINER…]子命令

$ docker container inspect test
2. 查看容器內進程

用 docker [container] top [OPTIONS] CONTAINER [CONTAINER…]子命令

$ docker top test
3. 查看統計信息

docker [container] stats [OPTIONS] [CONTAINER … ]

4.7 其餘容器命令

命令:cp diff port update

1. 複製文件

container cp 命令支持在容器和主機之間複製文件 命令格式爲 docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

2. 查看變動

container diff 看容器內文件系統的變動 命令格式爲 docker [container] diff CONTAINER

3. 查看端口映射

container port 命令能夠查看容器的端口映射’狀況 命令格式爲 docker container
port CONTAINER [PRIVATE_PORT[/PROTO]] 。
例如,查看 test 容器的端口映射狀況:

$ docker container port test 
9000/tcp - > o.o o 0:9000
4. 更新配置

container update 命令能夠更新容器的一些運行時配置,主要是一些資源限制份額
命令格式爲:

docker [container] update [OPTIONS] CONTAINER [CONTAINER...]

第5章 訪問Docker倉庫


來源:docker技術入門與實戰

相關文章
相關標籤/搜索