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

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官方給出的圖:html


Docker使用了一種叫AUFS的文件系統,這種文件系統可讓你一層一層地疊加修改你的文件,最底下的文件系統是隻讀的,若是須要修改文件,AUFS會增長一個可寫的層(Layer),這樣有不少好處,例如不一樣的Container能夠共享底層的只讀文件系統(同一個Kernel),使得你能夠跑N多個Container而不至於你的硬盤被擠爆了!這個只讀的層就是Image!而如你所看到的,一個可寫的層就是Container。
那Image和Container的區別是什麼?很簡單,他們的區別僅僅是一個是隻讀的層,一個是可寫的層,你可使用docker commit 命令,將你的Container變成一個Image,也就是提交你所運行的Container的修改內容,變成一個新的只讀的Image,這很是相似於git commit命令。
4 docker安裝與啓動
安裝dockerlinux

[root@localhost /]# yum -y install docker-iogit

更改配置文件web

[root@localhost /]# vi /etc/sysconfig/dockerredis

other-args列更改成:other_args="--exec-driver=lxc --selinux-enabled"
啓動docker服務docker

[root@localhost /]# service docker start
Starting cgconfig service: [ OK ]
Starting docker: [ OK ]shell

將docker加入開機啓動
[root@localhost /]# chkconfig docker onubuntu

基本信息查看
docker version:查看docker的版本號,包括客戶端、服務端、依賴的Go等bash

[root@localhost /]# 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數等
[root@localhost /]# 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

[root@localhost /]# 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

[root@localhost /]# docker pull chug/ubuntu12.10x64

查看鏡像
docker images: 列出images
docker images -a :列出全部的images(包含歷史)
docker images --tree :顯示鏡像的全部層(layer)
docker rmi <image ID>: 刪除一個或多個image

[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
[root@localhost /]# 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
[root@localhost /]# 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
[root@localhost /]# docker rmi <image ID> ....

使用鏡像建立容器

[root@localhost /]# docker run chug/ubuntu12.10x64 /bin/echo hello world
hello world

交互式運行
[root@localhost /]# docker run -i -t chug/ubuntu12.10x64 /bin/bash
root@2161509ff65e:/#

查看容器
docker ps :列出當前全部正在運行的container
docker ps -l :列出最近一次啓動的container
docker ps -a :列出全部的container(包含歷史,即運行過的container)
docker ps -q :列出最近一次運行的container ID

[root@localhost /]# 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
[root@localhost /]# 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
[root@localhost /]# 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
[root@localhost /]# 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可選。

[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chug/ubuntu12.10x64 latest 0b96c14dafcd 4 months ago 270.3 MB
[root@localhost /]# docker commit d0fd23b8d3ac chug/ubuntu12.10x64_2
daa11948e23d970c18ad89c9e5d8972157fb6f0733f4742db04219b9bb6d063b
[root@localhost /]# 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文件

[root@localhost /]# cat /tmp/export.tar | docker import - export:latest
af19a55ff0745fb0a68655392d6d7653c29460d22d916814208bbb9626183aaa
[root@localhost /]# 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文件

[root@localhost /]# docker load < /tmp/save.tar

 

對image打tag
[root@localhost /]# 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路徑下了。

[root@localhost 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

****************************************************************************************轉載請註明原文地址:http://www.server110.com/docker/201411/11105.html

相關文章
相關標籤/搜索