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
經過容器來打包應用,解耦應用和運行平臺。意味着遷移的時候,只須要在新的服務器上啓動須要的容器就能夠了,不管新舊服務器是不是同一類型的平臺。這無疑將節約大量的寶貴時間,並下降部署過程出現問題的風險。docker
Docker在開發和運維過程當中,具備以下幾個方面的優點:數據庫
本章首先介紹Docker的三大核心概念。ubuntu
Docker的大部分操做都圍繞着它的三大核心概念——鏡像、容器和倉庫而展開。所以,準確把握這三大核心概念對於掌握Docker技術尤其重要。bash
Docker鏡像相似於虛擬機鏡像,能夠將它理解爲一個只讀的模板。例如,一個鏡像能夠包含一個基本的操做系統環境,裏面僅安裝了Apache應用程序(或用戶須要的其餘軟件)。能夠把它稱爲一個Apache鏡像。鏡像是建立Docker容器的基礎。經過版本管理和增量的文件系統,Docker提供了一套十分簡單的機制來建立和更新現有的鏡像,用戶甚至能夠從網上下載一個已經作好的應用鏡像,並直接使用。服務器
Docker容器相似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用。容器是從鏡像建立的應用運行實例。能夠將其啓動、開始、中止、刪除,而這些容器都是彼此相互隔離的、互不可見的。能夠把容器看作是一個簡易版的Linux系統環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)以及運行在其中的應用程序打包而成的盒子。網絡
鏡像自身是隻讀的。容器從鏡像啓動的時候,會在鏡像的最上層建立一個可寫層。架構
Docker倉庫相似於代碼倉庫,它是Docker集中存放鏡像文件的場所。有時候會看到有資料將Docker倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器是存放倉庫的地方,其上每每存放着多個倉庫。每一個倉庫集中存放某一類鏡像,每每包括多個鏡像文件,經過不一樣的標籤(tag)來進行區分。例如存放Ubuntu操做系統鏡像的倉庫稱爲Ubuntu倉庫,其中可能包括14.0四、12.04等不一樣版本的鏡像。倉庫註冊服務器的示例如圖2-1所示。
根據所存儲的鏡像公開分享與否,Docker倉庫能夠分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。目前,最大的公開倉庫是官方提供的Docker Hub,其中存放了數量龐大的鏡像供用戶下載。國內很多雲服務提供商(如時速雲、阿里雲等)也提供了倉庫的本地源,能夠提供穩定的國內訪問。
固然,用戶若是不但願公開分享本身的鏡像文件,Docker也支持用戶在本地網絡內建立一個只能本身訪問的私有倉庫。當用戶建立了本身的鏡像以後就可使用push命令將它上傳到指定的公有或者私有倉庫。這樣用戶下次在另一臺機器上使用該鏡像時,只須要將其從倉庫上pull下來就能夠了。
鏡像(image)是Docker三大核心概念中最爲重要的,自Docker誕生之日起「鏡像」就是相關社區最爲熱門的關鍵詞。
Docker運行容器前須要本地存在對應的鏡像,若是鏡像沒保存在本地,Docker會嘗試先從默認鏡像倉庫下載(默認使用Docker Hub公共註冊服務器中的倉庫),用戶也能夠經過配置,使用自定義的鏡像倉庫。本章將介紹圍繞鏡像這一核心概念的具體操做,包括如何使用pull命令從
Docker Hub倉庫中下載鏡像到本地,如何查看本地已有的鏡像信息和管理鏡像標籤,如何在遠端倉庫使用search命令進行搜索和過濾,如何刪除鏡像標籤和鏡像文件,如何建立用戶定製的鏡像而且保存爲外部文件。最後,還介紹如何往Docker Hub倉庫中推送本身的鏡像。
鏡像是運行容器的前提,官方的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
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
在列出的信息中,能夠看到如下幾個字段信息。
其中鏡像的ID信息十分重要,它惟一標識了鏡像。在使用鏡像ID的時候,通常可使用該ID的前若干個字符組成的可區分串來替代完整的ID。
TAG信息用來標記來自同一個倉庫的不一樣鏡像。例如ubuntu倉庫中有多個鏡像,經過TAG信息來區分發行版本,包括10.0四、12.0四、12.十、13.0四、14.0四、16.04等標籤。
鏡像大小信息只是表示該鏡像的邏輯體積大小,實際上因爲相同的鏡像層本地只會存儲一份,物理上佔用的存儲空間會小於各鏡像的邏輯體積之和。
爲了方便在後續工做中使用特定鏡像,還可使用docker tag命令來爲本地鏡像任意添加新的標籤。例如添加一個新的myubuntu: latest鏡像標籤:
$ docker tag ubuntu:latest myubuntu:latest
使用docker inspect命令能夠獲取該鏡像的詳細信息,包括製做者、適應
架構、各層的數字摘要等
$ docker inspect ubuntu:14.04
返回的是一個JSON格式的消息,若是咱們只要其中一項內容時,可使用參數-f來指定,例如,獲取鏡像的Architecture:
$ docker inspect -f {{".Architecture"}} amd64
使用docker search命令能夠搜索遠端倉庫中␀享的鏡像,默認搜索官方倉庫中的鏡像。用法爲docker search TERM,支持的參數主要包括:
$ 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]
使用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
當使用docker rmi命令,而且後面跟上鏡像的ID(也能夠是能進行區分的部分ID串前綴)時,會先嚐試刪除全部指向該鏡像的標籤,而後刪除該鏡像文件自己。
注意,當有該鏡像建立的容器存在時,鏡像文件默認是沒法被刪除的,例如,先利用ubuntu:14.04鏡像建立一個簡單的容器來輸出一段話
$ docker run ubuntu:14.04 echo 'hello! I am here!' hello! I am here!
建立鏡像的方法主要有三種:基於已有鏡像的容器建立、基於本地模板導入、基於Dockerfile建立。
本節將重點介紹前兩種方法。最後一種基於Dockerfile建立的方法將在後續章節專門予以詳細介紹。
該方法主要是使用docker commit命令。命令格式爲docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]
,主要選項包括:
$ 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
用戶可使用docker save和docker load命令來存出和載入鏡像。
若是要導出鏡像到本地文件,可使用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文件將該鏡像分享給他人。
可使用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:
第一次上傳時,會提示輸入登陸信息或進行註冊.
容器是鏡像的一個運行實例。所不一樣的是,鏡像是靜態的只讀文件,而容器帶有運行時須要的可寫文件層,同時,容器中的應用進程處於運行狀態.
命令:create start run wait logs
可使用 docker [container] create命令新建一個容器
$ docker create -it ubuntu:latest af8f4f922dafee22c8fe6cd2aelld16e250 7d61flblfa55b36e94db7ef45178
docker [container] start
所須要的命令主要爲 docker [container ]run,等價於先執行 docker [container]
create 命令,再執行 docker [container] start 命令
更多的時候,須要讓 Docker 容器在後臺以守護態( Daemonized )形式運行 此時,能夠
經過添加-d 參數來實現
例如,下面的命令會在後臺運行容器
$ docker -d ubuntu /bin/ sh -c "while true; do echo hello world; sleep l; done 」 ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846
$ docker logs ce554267d7a4 hello world
命令:pause/unpause stop prune
可使用 docker [container] pause CONTAINER [CONTAINER … ]命令來暫停一個運行中的容器;
例如,啓動一個容器,並將其暫停:
$ docker run --name test --rm -it ubuntu bash $ docker pause test $ docker ps
可使用 docker [container] stop 來終止一個運行中的容器 該命令的格式爲
docker [container] stop [-t | --time[=10]] [CONTAINER ...]
若是須要進入容器進行操做,推薦使用官方的 attach/exec 命令
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
…
docker [container] rm
命令格式爲
docker [container) rm [-f|--force) [-1|--link] [-v|--volumes] CONTAINER [CONTAINER ...]
docker [container] export [-o|--output [=""]] CONTAINER
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY [:TAG]]
命令:inspect top stats
查看容器詳情可使用
docker container inspect [OPTIONS] CONTAINER [CONTAINER…]子命令
$ docker container inspect test
用 docker [container] top [OPTIONS] CONTAINER [CONTAINER…]子命令
$ docker top test
docker [container] stats [OPTIONS] [CONTAINER … ]
命令:cp diff port update
container cp 命令支持在容器和主機之間複製文件 命令格式爲 docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
container diff 看容器內文件系統的變動 命令格式爲 docker [container] diff CONTAINER
container port 命令能夠查看容器的端口映射’狀況 命令格式爲 docker container
port CONTAINER [PRIVATE_PORT[/PROTO]] 。
例如,查看 test 容器的端口映射狀況:
$ docker container port test 9000/tcp - > o.o o 0:9000
container update 命令能夠更新容器的一些運行時配置,主要是一些資源限制份額
命令格式爲:
docker [container] update [OPTIONS] CONTAINER [CONTAINER...]
…
來源:docker技術入門與實戰