做爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具備衆多的優點。首先,docker 容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。linux
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。git
對比傳統虛擬機總結docker
特性json |
容器ubuntu |
虛擬機bash |
---|---|---|
啓動 | 秒級 | 分鐘級 |
硬盤使用 | 通常爲 MB | 通常爲 GB |
性能 | 接近原生 | 弱於 |
系統支持量 | 單機支持上千個容器 | 通常幾十個 |
Ubuntu 14.04 版本系統中已經自帶了 Docker 包,能夠直接安裝。服務器
$ sudo apt-get update $ sudo apt-get install -y docker.io $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker $ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
若是使用操做系統自帶包安裝 Docker,目前安裝的版本是比較舊的 0.9.1。 要安裝更新的版本,能夠經過使用 Docker 源的方式。工具
要安裝最新的 Docker 版本,首先須要安裝 apt-transport-https 支持,以後經過添加源來安裝。性能
$ sudo apt-get install apt-transport-https $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update $ sudo apt-get install lxc-docker
若是是較低版本的 Ubuntu 系統,須要先更新內核。操作系統
$ sudo apt-get update $ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring $ sudo reboot
而後重複上面的步驟便可。
安裝以後啓動 Docker 服務。
$ sudo service docker start啓動docker以後,在終端輸入 docker --version 並回車,若是顯示出了版本信息,則說明Docker已經安裝成功。
sudo docker pull ubuntu 這條命令將從docker官方鏡像庫中獲取名爲Ubuntu的鏡像到本地,命令實際上至關於$ sudo docker pull registry.hub.docker.com/ubuntu
命令,即從註冊服務器registry.hub.docker.com
的倉庫下載ubuntu鏡像。$ sudo docker pull registry.hub.docker.com/ubunturegistry.hub.docker.com
有時候官方倉庫註冊服務器下載較慢,能夠從其餘倉庫下載。 從其它倉庫下載時須要指定完整的倉庫註冊服務器地址。例如
$ sudo docker pull dl.dockerpool.com:5000/ubuntu Pulling dl.dockerpool.com:5000/ubuntu ab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete
完成後,便可隨時使用該鏡像了,例如建立一個容器,讓其中運行 bash 應用。
$ sudo docker run -t -i ubuntu /bin/bash root@fe7fc4bd8fc9:/#
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
在列出信息中,能夠看到幾個字段信息
ID
號(惟一)其中鏡像的 ID
惟一標識了鏡像,注意到 ubuntu:14.04
和 ubuntu:trusty
具備相同的鏡像 ID
,說明它們其實是同一鏡像。
TAG
信息用來標記來自同一個倉庫的不一樣鏡像。例如 ubuntu
倉庫中有多個鏡像,經過 TAG
信息來區分發行版本,例如 10.04
、12.04
、12.10
、13.04
、14.04
等。例以下面的命令指定使用鏡像 ubuntu:14.04
來啓動一個容器。
$ sudo docker run -t -i ubuntu /bin/bash
若是不指定具體的標記,則默認使用 latest
標記信息。
先使用下載的鏡像啓動容器。
$ sudo docker run -t -i ubuntu /bin/bash root@0b2616b0e5a8:/#
注意:記住容器的 ID,稍後還會用到。
在容器中添加 json 和 gem 兩個應用。
root@0b2616b0e5a8:/# gem install json
當結束後,咱們使用 exit 來退出,如今咱們的容器已經被咱們改變了,使用 docker commit
命令來提交更新後的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中,-m
來指定提交的說明信息,跟咱們使用的版本控制工具同樣;-a
能夠指定更新的用戶信息;以後是用來建立鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 信息。建立成功後會返回這個鏡像的 ID 信息。
使用 docker images
來查看新建立的鏡像。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 99ec81b80c55 4 weeks ago 266 MB ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
以後,可使用新的鏡像來啓動容器
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root@78e82f680994:/#
若是要導出鏡像到本地文件,可使用 docker save
命令。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest c4ff7513909d 5 weeks ago 225.4 MB ... $sudo docker save -o ubuntu.tar ubuntu
可使用 docker load
從導出的本地文件中再導入到本地鏡像庫,例如
$ sudo docker load --input ubuntu.tar
或
$ sudo docker load < ubuntu.tar
這將導入鏡像以及其相關的元數據信息(包括標籤等)。
$ sudo docker rmi ouruser/sinatra:v2 Untagged: ouruser/sinatra:v2 Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
*注意:在刪除鏡像以前要先用 docker rm
刪掉依賴於這個鏡像的全部容器。
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(stopped)的容器從新啓動。
由於 Docker 的容器實在過輕量級了,不少時候用戶都是隨時刪除和新建立容器。
所須要的命令主要爲 docker run
。
例如,下面的命令輸出一個 「Hello World」,以後終止容器。
$ sudo docker run ubuntu /bin/echo 'Hello world' Hello world
這跟在本地直接執行 /bin/echo 'hello world'
幾乎感受不出任何區別。
下面的命令則啓動一個 bash 終端,容許用戶進行交互。
$ sudo docker run -t -i ubuntu /bin/bash root@af8bae53bdd3:/#
其中,-t
選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上, -i
則讓容器的標準輸入保持打開。
在交互模式下,用戶能夠經過所建立的終端來輸入命令,例如
root@af8bae53bdd3:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
更多的時候,須要讓 Docker 容器在後臺以守護態(Daemonized)形式運行。此時,能夠經過添加 -d
參數來實現。
例以下面的命令會在後臺運行容器。
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
容器啓動後會返回一個惟一的 id,也能夠經過 docker ps
命令來查看容器信息。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5535038e28 ubuntu /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
要獲取容器的輸出信息,能夠經過 docker logs
命令。
$ sudo docker logs insane_babbage hello world hello world hello world . . .
當利用 docker run
來建立容器時,Docker 在後臺運行的標準操做包括:
能夠利用 docker start
命令,直接將一個已經終止的容器啓動運行。
容器的核心爲所執行的應用程序,所須要的資源都是應用程序運行所必需的。除此以外,並無其它的資源。能夠在僞終端中利用 ps
或 top
來查看進程信息。
root@ba267838cc1b:/# ps PID TTY TIME CMD 1 ? 00:00:00 bash 11 ? 00:00:00 ps
可見,容器中僅運行了指定的 bash 應用。這種特色使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。
可使用 docker stop
來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。 例如對於上一章節中只啓動了一個終端的容器,用戶經過 exit
命令或 Ctrl+d
來退出終端時,所建立的容器馬上終止。
終止狀態的容器能夠用 docker ps -a
命令看到。例如
sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSNAMES ba267838cc1b ubuntu "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton 1e5535038e28 ubuntu /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
處於終止狀態的容器,能夠經過 docker start
命令來從新啓動。
此外,docker restart
命令會將一個運行態的容器終止,而後再從新啓動它。
-d
參數時,容器啓動後會進入後臺。 某些時候須要進入容器進行操做,有不少種方法,包括使用docker attach
命令或 nsenter
工具等。
docker attach
是Docker自帶的命令。下面示例如何使用該命令。
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia $sudo docker attach nostalgic_hypatia root@243c32535da7:/#
docker import 和docker export 導入、導出容器
若是要導出本地某個容器,可使用 docker export
命令。
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test $ sudo docker export 7691a814370e > ubuntu.tar
這樣將導出容器快照到本地文件。
可使用 docker import
從容器快照文件中再導入爲鏡像,例如
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也能夠經過指定 URL 或者某個目錄來導入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
*注:用戶既可使用 docker load
來導入鏡像存儲文件到本地鏡像庫,也可使用 docker import
來導入一個容器快照到本地鏡像庫。這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時能夠從新指定標籤等元數據信息。
可使用 docker rm
來刪除一個處於終止狀態的容器。 例如
$sudo docker rm trusting_newton trusting_newton
若是要刪除一個運行中的容器,能夠添加 -f
參數。Docker 會發送 SIGKILL
信號給容器。
更多命令可在終端輸入docker --help 查看。