Ubuntu下安裝Docker,及Docker的一些經常使用命令操做

1.什麼是 Docker

        Docker 是一個開源項目,Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。
        Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做 Docker 的容器就像操做一個快速輕量級的虛擬機同樣簡單。

2.爲何要使用 Docker

        做爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具備衆多的優點。首先,docker 容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。linux

        容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。git

       對比傳統虛擬機總結docker

特性json

容器ubuntu

虛擬機bash

啓動 秒級 分鐘級
硬盤使用 通常爲 MB 通常爲 GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 通常幾十個

3.在ubuntu下安裝 Docker


經過系統自帶包安裝

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源安裝最新版本

要安裝最新的 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

14.04 以前版本

若是是較低版本的 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已經安裝成功。

4.Docker命令之鏡像(image)篇

docker pull 獲取鏡像

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:/#

docker images 列出鏡像

$ sudo docker images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB

在列出信息中,能夠看到幾個字段信息

  • 來自於哪一個倉庫,好比 ubuntu
  • 鏡像的標記,好比 14.04
  • 它的 ID 號(惟一)
  • 建立時間
  • 鏡像大小

其中鏡像的 ID 惟一標識了鏡像,注意到 ubuntu:14.04 和 ubuntu:trusty 具備相同的鏡像 ID,說明它們其實是同一鏡像。

TAG 信息用來標記來自同一個倉庫的不一樣鏡像。例如 ubuntu 倉庫中有多個鏡像,經過 TAG 信息來區分發行版本,例如 10.0412.0412.1013.0414.04 等。例以下面的命令指定使用鏡像 ubuntu:14.04 來啓動一個容器。

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

若是不指定具體的標記,則默認使用 latest 標記信息。

 

docker commit 建立鏡像

先使用下載的鏡像啓動容器。

$ 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 和docker load  導入導出鏡像

若是要導出鏡像到本地文件,可使用 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

這將導入鏡像以及其相關的元數據信息(包括標籤等)。

docker rmi 移除鏡像

$ sudo docker rmi ouruser/sinatra:v2
Untagged: ouruser/sinatra:v2
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

*注意:在刪除鏡像以前要先用 docker rm 刪掉依賴於這個鏡像的全部容器。


 

5.Docker命令之容器(container)篇

docker run 啓動容器

 

 

啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(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 在後臺運行的標準操做包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像建立並啓動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個 ip 地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢後容器被終止

啓動已終止容器

能夠利用 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 刪除容器

可使用 docker rm 來刪除一個處於終止狀態的容器。 例如

$sudo docker rm  trusting_newton
trusting_newton

若是要刪除一個運行中的容器,能夠添加 -f 參數。Docker 會發送 SIGKILL 信號給容器。

更多命令可在終端輸入docker --help 查看。

相關文章
相關標籤/搜索