1. 程式人生 > >CentOS系統下docker的安裝配置及使用詳解

CentOS系統下docker的安裝配置及使用詳解

http://www.server110.com/docker/201411/11105.html



1 docker簡介
    Docker 提供了一個可以執行你的應用程式的封套(envelope),或者說容器。它原本是 dotCloud 啟動的一個業餘專案,並在前些時候開源了。它吸引了大量的關注和討論,導致 dotCloud 把它重新命名到 Docker Inc。它最初是用 Go 語言編寫的,它就相當於是加在 LXC(LinuX Containers,linux 容器)上的管道,允許開發者在更高層次的概念上工作。
    Docker 擴充套件了 Linux 容器(Linux Containers),或著說 LXC,通過一個高層次的 API 為程序單獨提供了一個輕量級的虛擬環境。Docker 利用了 LXC, cgroups 和 Linux 自己的核心。和傳統的虛擬機器不同的是,一個 Docker 容器並不包含一個單獨的作業系統,而是基於已有的基礎設施中作業系統提供的功能來執行的。


    Docker類似虛擬機器的概念,但是與虛擬化技術的不同點在於下面幾點:
    1.虛擬化技術依賴物理CPU和記憶體,是硬體級別的;而docker構建在作業系統上,利用作業系統的containerization技術,所以docker甚至可以在虛擬機器上執行。
    2.虛擬化系統一般都是指作業系統映象,比較複雜,稱為“系統”;而docker開源而且輕量,稱為“容器”,單個容器適合部署少量應用,比如部署一個redis、一個memcached。
    3.傳統的虛擬化技術使用快照來儲存狀態;而docker在儲存狀態上不僅更為輕便和低成本,而且引入了類似原始碼管理機制,將容器的快照歷史版本一一記錄,切換成本很低。

    4.傳統的虛擬化技術在構建系統的時候較為複雜,需要大量的人力;而docker可以通過Dockfile來構建整個容器,重啟和構建速度很快。更重要的是Dockfile可以手動編寫,這樣應用程式開發人員可以通過釋出Dockfile來指導系統環境和依賴,這樣對於持續交付十分有利。
    5.Dockerfile可以基於已經構建好的容器映象,建立新容器。Dockerfile可以通過社群分享和下載,有利於該技術的推廣。
    Docker 會像一個可移植的容器引擎那樣工作。它把應用程式及所有程式的依賴環境打包到一個虛擬容器中,這個虛擬容器可以執行在任何一種 Linux 伺服器上。這大大地提高了程式執行的靈活性和可移植性,無論需不需要許可、是在公共雲還是私密雲、是不是裸機環境等等。

    Docker也是一個雲端計算平臺,它利用Linux的LXC、AUFU、Go語言、cgroup實現了資源的獨立,可以很輕鬆的實現檔案、資源、網路等隔離,其最終的目標是實現類似PaaS平臺的應用隔離。
    Docker 由下面這些組成:
    1. Docker 伺服器守護程式(server daemon),用於管理所有的容器。
    2. Docker 命令列客戶端,用於控制伺服器守護程式。
    3. Docker 映象:查詢和瀏覽 docker 容器映象。

2 docker特性

    檔案系統隔離:每個程序容器執行在完全獨立的根檔案系統裡。
    資源隔離:可以使用cgroup為每個程序容器分配不同的系統資源,例如CPU和記憶體。
    網路隔離:每個程序容器執行在自己的網路名稱空間裡,擁有自己的虛擬介面和IP地址。
    寫時複製:採用寫時複製方式建立根檔案系統,這讓部署變得極其快捷,並且節省記憶體和硬碟空間。
    日誌記錄:Docker將會收集和記錄每個程序容器的標準流(stdout/stderr/stdin),用於實時檢索或批量檢索。
    變更管理:容器檔案系統的變更可以提交到新的映像中,並可重複使用以建立更多的容器。無需使用模板或手動配置。
    互動式Shell:Docker可以分配一個虛擬終端並關聯到任何容器的標準輸入上,例如執行一個一次性互動shell。

3 兩個基礎概念images與container

    Container和Image 在Docker的世界裡,Image是指一個只讀的層(Layer),這裡的層是AUFS裡的概念,最直觀的方式就是看一下docker官方給出的圖:


    Docker使用了一種叫AUFS的檔案系統,這種檔案系統可以讓你一層一層地疊加修改你的檔案,最底下的檔案系統是隻讀的,如果需要修改檔案,AUFS會增加一個可寫的層(Layer),這樣有很多好處,例如不同的Container可以共享底層的只讀檔案系統(同一個Kernel),使得你可以跑N多個Container而不至於你的硬碟被擠爆了!這個只讀的層就是Image!而如你所看到的,一個可寫的層就是Container。
    那Image和Container的區別是什麼?很簡單,他們的區別僅僅是一個是隻讀的層,一個是可寫的層,你可以使用docker commit 命令,將你的Container變成一個Image,也就是提交你所執行的Container的修改內容,變成一個新的只讀的Image,這非常類似於git commit命令。

4 docker安裝與啟動

    安裝docker


[[email protected] /]# yum -y install docker-io

    更改配置檔案


[[email protected] /]# vi /etc/sysconfig/docker

    other-args列更改為:other_args="--exec-driver=lxc --selinux-enabled"

    啟動docker服務


[[email protected] /]# service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:                                               [  OK  ]

    將docker加入開機啟動
[[email protected] /]# chkconfig docker on

    基本資訊檢視

    docker version:檢視docker的版本號,包括客戶端、服務端、依賴的Go等


[[email protected] /]# docker version
Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.2
Git commit (client): 63fe64c/1.0.0
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.2
Git commit (server): 63fe64c/1.0.0

    docker info :檢視系統(docker)層面資訊,包括管理的images, containers數等
[[email protected] /]# docker info
Containers: 16
Images: 40
Storage Driver: devicemapper
 Pool Name: docker-253:0-1183580-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 2180.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 3.4 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: lxc-0.9.0
Kernel Version: 2.6.32-431.el6.x86_64

5 映象的獲取與容器的使用

    映象可以看作是包含有某些軟體的容器系統,比如ubuntu就是一個官方的基礎映象,很多映象都是基於這個映象“衍生”,該映象包含基本的ubuntu系統。再比如,hipache是一個官方的映象容器,執行後可以支援http和websocket的代理服務,而這個映象本身又基於ubuntu。

    搜尋映象
    docker search <image>:在docker index中搜索image


[[email protected] /]# docker search ubuntu12.10
NAME                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mirolin/ubuntu12.10                                                         0
marcgibbons/ubuntu12.10                                                     0
mirolin/ubuntu12.10_redis                                                   0
chug/ubuntu12.10x32         Ubuntu Quantal Quetzal 12.10 32bit  base i...   0
chug/ubuntu12.10x64         Ubuntu Quantal Quetzal 12.10 64bit  base i...   0

    下載映象

    docker pull <image> :從docker registry server 中下拉image


[[email protected] /]# docker pull chug/ubuntu12.10x64

    檢視映象 

    docker images: 列出images

    docker images -a :列出所有的images(包含歷史)

    docker images --tree :顯示映象的所有層(layer)

    docker rmi  <image ID>: 刪除一個或多個image


[[email protected] /]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64   latest              0b96c14dafcd        4 months ago        270.3 MB
[[email protected] /]# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64   latest              0b96c14dafcd        4 months ago        270.3 MB
<none>                <none>              31edfed3bb88        4 months ago        175.8 MB
[[email protected] /]# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
└─31edfed3bb88 Virtual Size: 175.8 MB
  └─0b96c14dafcd Virtual Size: 270.3 MB Tags: chug/ubuntu12.10x64:latest
[[email protected] /]# docker rmi <image ID> ....

     使用映象建立容器


[[email protected] /]# docker run chug/ubuntu12.10x64  /bin/echo hello world
hello world

    互動式執行
[[email protected] /]# docker run -i -t chug/ubuntu12.10x64  /bin/bash
[email protected]:/#

    檢視容器

    docker ps :列出當前所有正在執行的container
    docker ps -l :列出最近一次啟動的container
    docker ps -a :列出所有的container(包含歷史,即執行過的container)
    docker ps -q :列出最近一次執行的container ID


[[email protected] /]# docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS               NAMES
ccf3de663dc9        chug/ubuntu12.10x64:latest   /bin/bash           22 hours ago        Up 22 hours                             sharp_hypatia
[[email protected] /]# docker ps -l
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                     PORTS               NAMES
f145f184647b        chug/ubuntu12.10x64:latest   /bin/bash           6 seconds ago       Exited (0) 3 seconds ago                       compassionate_galileo
[[email protected] /]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                        PORTS               NAMES
f145f184647b        chug/ubuntu12.10x64:latest   /bin/bash           30 seconds ago      Exited (0) 26 seconds ago                         compassionate_galileo
f4624b42fe7e        chug/ubuntu12.10x64:latest   /bin/bash           2 minutes ago       Exited (0) 2 minutes ago                          sharp_wilson
ccf3de663dc9        chug/ubuntu12.10x64:latest   /bin/bash           22 hours ago        Up 22 hours                                       sharp_hypatia
9cbaa79b9703        chug/ubuntu12.10x64:latest   /bin/bash           22 hours ago        Exited (127) 36 minutes ago                       berserk_mcclintock
2161509ff65e        chug/ubuntu12.10x64:latest   /bin/bash           22 hours ago        Exited (0) 22 hours ago                           backstabbing_mclean
[[email protected] /]# docker ps -q
ccf3de663dc9

    再次啟動容器

    docker start/stop/restart <container> :開啟/停止/重啟container
    docker start [container_id] :再次執行某個container (包括歷史container)
    docker attach [container_id] :連線一個正在執行的container例項(即例項必須為start狀態,可以多個視窗同時attach 一個container例項)
    docker start -i <container> :啟動一個container並進入互動模式(相當於先start,在attach)

    docker run -i -t <image> /bin/bash :使用image建立container並進入互動模式, login shell是/bin/bash
    docker run -i -t -p <host_port:contain_port> :對映 HOST 埠到容器,方便外部訪問容器內服務,host_port 可以省略,省略表示把 container_port 對映到一個動態埠。
    注:使用start是啟動已經建立過得container,使用run則通過image開啟一個新的container。

    刪除容器

    docker rm <container...> :刪除一個或多個container
    docker rm `docker ps -a -q` :刪除所有的container
    docker ps -a -q | xargs docker rm :同上, 刪除所有的container

6 持久化容器與映象

    6.1 通過容器生成新的映象

    執行中的映象稱為容器。你可以修改容器(比如刪除一個檔案),但這些修改不會影響到映象。不過,你使用docker commit <container-id> <image-name>命令可以把一個正在執行的容器變成一個新的映象。

    docker commit <container> [repo:tag] 將一個container固化為一個新的image,後面的repo:tag可選。


[[email protected] /]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64   latest              0b96c14dafcd        4 months ago        270.3 MB
[[email protected] /]# docker commit d0fd23b8d3ac chug/ubuntu12.10x64_2
daa11948e23d970c18ad89c9e5d8972157fb6f0733f4742db04219b9bb6d063b
[[email protected] /]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chug/ubuntu12.10x64_2   latest              daa11948e23d        6 seconds ago       270.3 MB
chug/ubuntu12.10x64     latest              0b96c14dafcd        4 months ago        270.3 MB

    6.2 持久化容器

    export命令用於持久化容器

    docker export <CONTAINER ID> > /tmp/export.tar

    6.3 持久化映象

    Save命令用於持久化映象

    docker save 映象ID > /tmp/save.tar

    6.4 匯入持久化container

    刪除container 2161509ff65e

    匯入export.tar檔案


[[email protected] /]# cat /tmp/export.tar | docker import - export:latest
af19a55ff0745fb0a68655392d6d7653c29460d22d916814208bbb9626183aaa
[[email protected] /]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
export                  latest              af19a55ff074        34 seconds ago      270.3 MB
chug/ubuntu12.10x64_2   latest              daa11948e23d        20 minutes ago      270.3 MB
chug/ubuntu12.10x64     latest              0b96c14dafcd        4 months ago        270.3 MB

    6.5 匯入持久化image

    刪除image daa11948e23d

    匯入save.tar檔案


[[email protected] /]# docker load < /tmp/save.tar


    對image打tag
[[email protected] /]# docker tag daa11948e23d load:tag

    6.6 export-import與save-load的區別
    匯出後再匯入(export-import)的映象會丟失所有的歷史,而儲存後再載入(save-load)的映象沒有丟失歷史和層(layer)。這意味著使用匯出後再匯入的方式,你將無法回滾到之前的層(layer),同時,使用儲存後再載入的方式持久化整個映象,就可以做到層回滾。(可以執行docker tag <LAYER ID> <IMAGE NAME>來回滾之前的層)。

    6.7 一些其它命令

    docker logs $CONTAINER_ID #檢視docker例項執行日誌,確保正常執行
    docker inspect $CONTAINER_ID #docker inspect <image|container> 檢視image或container的底層資訊

    docker build <path> 尋找path路徑下名為的Dockerfile的配置檔案,使用此配置生成新的image
    docker build -t repo[:tag] 同上,可以指定repo和可選的tag
    docker build - < <dockerfile> 使用指定的dockerfile配置檔案,docker以stdin方式獲取內容,使用此配置生成新的image
    docker port <container> <container port> 檢視本地哪個埠對映到container的指定埠,其實用docker ps 也可以看到

7 一些使用技巧

    7.1 docker檔案存放目錄

    Docker實際上把所有東西都放到/var/lib/docker路徑下了。


[[email protected] docker]# ls -F
containers/  devicemapper/  execdriver/  graph/  init/  linkgraph.db  repositories-devicemapper  volumes/

    containers目錄當然就是存放容器(container)了,graph目錄存放映象,檔案層(file system layer)存放在graph/imageid/layer路徑下,這樣我們就可以看看檔案層裡到底有哪些東西,利用這種層級結構可以清楚的看到檔案層是如何一層一層疊加起來的。

    7.2  檢視root密碼

    docker容器啟動時的root使用者的密碼是隨機分配的。所以,通過這種方式就可以得到容器的root使用者的密碼了。


docker logs 5817938c3f6e 2>&1 | grep 'User: ' | tail -n1

****************************************************************************************


1 docker簡介
    Docker 提供了一個可以執行你的應用程式的封套(envelope),或者說容器。它原本是 dotCloud 啟動的一個業餘專案,並在前些時候開源了。它吸引了大量的關注和討論,導致 dotCloud 把它重新命名到 Docker Inc。它最初是用 Go 語言編寫的,它就相當於是加在 LXC(LinuX Containers,linux 容器)上的管道,允許開發者在更高層次的概念上工作。
    Docker 擴充套件了 Linux 容器(Linux Containers),或著說 LXC,通過一個高層次的 API 為程序單獨提供了一個輕量級的虛擬環境。Docker 利用了 LXC, cgroups 和 Linux 自己的核心。和傳統的虛擬機器不同的是,一個 Docker 容器並不包含一個單獨的作業系統,而是基於已有的基礎設施中作業系統提供的功能來執行的。
    Docker類似虛擬機器的概念,但是與虛擬化技術的不同點在於下面幾點:
    1.虛