【新技术】CentOS系统下docker的安装配置及使用详解
1 docker簡介
? ? Docker 提供了一個(gè)可以運(yùn)行你的應(yīng)用程序的封套(envelope),或者說容器。它原本是dotCloud 啟動(dòng)的一個(gè)業(yè)余項(xiàng)目,并在前些時(shí)候開源了。它吸引了大量的關(guān)注和討論,導(dǎo)致 dotCloud 把它重命名到 DockerInc。它最初是用 Go 語言編寫的,它就相當(dāng)于是加在 LXC(LinuX Containers,linux容器)上的管道,允許開發(fā)者在更高層次的概念上工作。
? ? Docker 擴(kuò)展了 Linux 容器(Linux Containers),或著說LXC,通過一個(gè)高層次的 API 為進(jìn)程單獨(dú)提供了一個(gè)輕量級的虛擬環(huán)境。Docker 利用了 LXC, cgroups 和 Linux自己的內(nèi)核。和傳統(tǒng)的虛擬機(jī)不同的是,一個(gè) Docker容器并不包含一個(gè)單獨(dú)的操作系統(tǒng),而是基于已有的基礎(chǔ)設(shè)施中操作系統(tǒng)提供的功能來運(yùn)行的。
? ? Docker類似虛擬機(jī)的概念,但是與虛擬化技術(shù)的不同點(diǎn)在于下面幾點(diǎn):
? ?1.虛擬化技術(shù)依賴物理CPU和內(nèi)存,是硬件級別的;而docker構(gòu)建在操作系統(tǒng)上,利用操作系統(tǒng)的containerization技術(shù),所以docker甚至可以在虛擬機(jī)上運(yùn)行。
? ?2.虛擬化系統(tǒng)一般都是指操作系統(tǒng)鏡像,比較復(fù)雜,稱為“系統(tǒng)”;而docker開源而且輕量,稱為“容器”,單個(gè)容器適合部署少量應(yīng)用,比如部署一個(gè)redis、一個(gè)memcached。
? ?3.傳統(tǒng)的虛擬化技術(shù)使用快照來保存狀態(tài);而docker在保存狀態(tài)上不僅更為輕便和低成本,而且引入了類似源代碼管理機(jī)制,將容器的快照歷史版本一一記錄,切換成本很低。
? ?4.傳統(tǒng)的虛擬化技術(shù)在構(gòu)建系統(tǒng)的時(shí)候較為復(fù)雜,需要大量的人力;而docker可以通過Dockfile來構(gòu)建整個(gè)容器,重啟和構(gòu)建速度很快。更重要的是Dockfile可以手動(dòng)編寫,這樣應(yīng)用程序開發(fā)人員可以通過發(fā)布Dockfile來指導(dǎo)系統(tǒng)環(huán)境和依賴,這樣對于持續(xù)交付十分有利。
? ?5.Dockerfile可以基于已經(jīng)構(gòu)建好的容器鏡像,創(chuàng)建新容器。Dockerfile可以通過社區(qū)分享和下載,有利于該技術(shù)的推廣。
? ? Docker會(huì)像一個(gè)可移植的容器引擎那樣工作。它把應(yīng)用程序及所有程序的依賴環(huán)境打包到一個(gè)虛擬容器中,這個(gè)虛擬容器可以運(yùn)行在任何一種 Linux服務(wù)器上。這大大地提高了程序運(yùn)行的靈活性和可移植性,無論需不需要許可、是在公共云還是私密云、是不是裸機(jī)環(huán)境等等。
? ?Docker也是一個(gè)云計(jì)算平臺(tái),它利用Linux的LXC、AUFU、Go語言、cgroup實(shí)現(xiàn)了資源的獨(dú)立,可以很輕松的實(shí)現(xiàn)文件、資源、網(wǎng)絡(luò)等隔離,其最終的目標(biāo)是實(shí)現(xiàn)類似PaaS平臺(tái)的應(yīng)用隔離。
? ? Docker 由下面這些組成:
? ? 1. Docker 服務(wù)器守護(hù)程序(server daemon),用于管理所有的容器。
? ? 2. Docker 命令行客戶端,用于控制服務(wù)器守護(hù)程序。
? ? 3. Docker 鏡像:查找和瀏覽 docker 容器鏡像。
2 docker特性
? ? 文件系統(tǒng)隔離:每個(gè)進(jìn)程容器運(yùn)行在完全獨(dú)立的根文件系統(tǒng)里。
? ? 資源隔離:可以使用cgroup為每個(gè)進(jìn)程容器分配不同的系統(tǒng)資源,例如CPU和內(nèi)存。
? ? 網(wǎng)絡(luò)隔離:每個(gè)進(jìn)程容器運(yùn)行在自己的網(wǎng)絡(luò)命名空間里,擁有自己的虛擬接口和IP地址。
? ? 寫時(shí)復(fù)制:采用寫時(shí)復(fù)制方式創(chuàng)建根文件系統(tǒng),這讓部署變得極其快捷,并且節(jié)省內(nèi)存和硬盤空間。
? ?日志記錄:Docker將會(huì)收集和記錄每個(gè)進(jìn)程容器的標(biāo)準(zhǔn)流(stdout/stderr/stdin),用于實(shí)時(shí)檢索或批量檢索。
? ?變更管理:容器文件系統(tǒng)的變更可以提交到新的映像中,并可重復(fù)使用以創(chuàng)建更多的容器。無需使用模板或手動(dòng)配置。
? ?交互式Shell:Docker可以分配一個(gè)虛擬終端并關(guān)聯(lián)到任何容器的標(biāo)準(zhǔn)輸入上,例如運(yùn)行一個(gè)一次性交互shell。
3 兩個(gè)基礎(chǔ)概念images與container
? ? Container和Image在Docker的世界里,Image是指一個(gè)只讀的層(Layer),這里的層是AUFS里的概念,最直觀的方式就是看一下docker官方給出的圖:
? ?Docker使用了一種叫AUFS的文件系統(tǒng),這種文件系統(tǒng)可以讓你一層一層地疊加修改你的文件,最底下的文件系統(tǒng)是只讀的,如果需要修改文件,AUFS會(huì)增加一個(gè)可寫的層(Layer),這樣有很多好處,例如不同的Container可以共享底層的只讀文件系統(tǒng)(同一個(gè)Kernel),使得你可以跑N多個(gè)Container而不至于你的硬盤被擠爆了!這個(gè)只讀的層就是Image!而如你所看到的,一個(gè)可寫的層就是Container。
? ?那Image和Container的區(qū)別是什么?很簡單,他們的區(qū)別僅僅是一個(gè)是只讀的層,一個(gè)是可寫的層,你可以使用dockercommit命令,將你的Container變成一個(gè)Image,也就是提交你所運(yùn)行的Container的修改內(nèi)容,變成一個(gè)新的只讀的Image,這非常類似于gitcommit命令。
4 docker安裝與啟動(dòng)
? ? 安裝docker
[root@localhost?/]#?yum?-y?install?docker-io
? ? 更改配置文件
[root@localhost?/]#?vi?/etc/sysconfig/docker
? ? other-args列更改為:other_args="--exec-driver=lxc--selinux-enabled"
? ? 啟動(dòng)docker服務(wù)
[root@localhost?/]#?service?docker?start
Starting?cgconfig?service:?????????????????????????????????[??OK??]
Starting?docker:???????????????????????????????????????????????[??OK??]
? ? 將docker加入開機(jī)啟動(dòng)
[root@localhost?/]#?chkconfig?docker?on
? ? 基本信息查看
? ? dockerversion:查看docker的版本號(hào),包括客戶端、服務(wù)端、依賴的Go等
[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:查看系統(tǒng)(docker)層面信息,包括管理的images, containers數(shù)等
[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 鏡像的獲取與容器的使用
???鏡像可以看作是包含有某些軟件的容器系統(tǒng),比如ubuntu就是一個(gè)官方的基礎(chǔ)鏡像,很多鏡像都是基于這個(gè)鏡像“衍生”,該鏡像包含基本的ubuntu系統(tǒng)。再比如,hipache是一個(gè)官方的鏡像容器,運(yùn)行后可以支持http和websocket的代理服務(wù),而這個(gè)鏡像本身又基于ubuntu。
? ? 搜索鏡像
? ? docker search?:在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??:從docker registry server中下拉image
[root@localhost?/]#?docker?pull?chug/ubuntu12.10x64
? ? 查看鏡像
? ? docker images: 列出images
? ? docker images -a :列出所有的images(包含歷史)
? ? docker images --tree?:顯示鏡像的所有層(layer)
? ? docker rmi ?:刪除一個(gè)或多個(gè)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
??????????????????????????????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??....
? ? ?使用鏡像創(chuàng)建容器
[root@localhost?/]#?docker?run?chug/ubuntu12.10x64??/bin/echo?hello?world
hello?world
? ? 交互式運(yùn)行
[root@localhost?/]#?docker?run?-i?-t?chug/ubuntu12.10x64??/bin/bash
root@2161509ff65e:/#
? ? 查看容器
? ? docker ps :列出當(dāng)前所有正在運(yùn)行的container
? ? docker ps -l :列出最近一次啟動(dòng)的container
? ? docker ps -a :列出所有的container(包含歷史,即運(yùn)行過的container)
? ? docker ps -q :列出最近一次運(yùn)行的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
? ? 再次啟動(dòng)容器
? ? docker start/stop/restart?:開啟/停止/重啟container
? ? docker start [container_id] :再次運(yùn)行某個(gè)container(包括歷史container)
? ? docker attach [container_id]:連接一個(gè)正在運(yùn)行的container實(shí)例(即實(shí)例必須為start狀態(tài),可以多個(gè)窗口同時(shí)attach一個(gè)container實(shí)例)
? ? docker start -i?:啟動(dòng)一個(gè)container并進(jìn)入交互模式(相當(dāng)于先start,在attach)
? ? docker run -i -t??/bin/bash:使用image創(chuàng)建container并進(jìn)入交互模式, login shell是/bin/bash
? ? docker run -i -t -p?:映射 HOST 端口到容器,方便外部訪問容器內(nèi)服務(wù),host_port 可以省略,省略表示把 container_port映射到一個(gè)動(dòng)態(tài)端口。
? ?注:使用start是啟動(dòng)已經(jīng)創(chuàng)建過得container,使用run則通過image開啟一個(gè)新的container。
? ? 刪除容器
? ? docker rm?:刪除一個(gè)或多個(gè)container
? ? docker rm `docker ps -a -q` :刪除所有的container
? ? docker ps -a -q | xargs docker rm :同上,刪除所有的container
6 持久化容器與鏡像
? ? 6.1 通過容器生成新的鏡像
? ?運(yùn)行中的鏡像稱為容器。你可以修改容器(比如刪除一個(gè)文件),但這些修改不會(huì)影響到鏡像。不過,你使用docker commit?命令可以把一個(gè)正在運(yùn)行的容器變成一個(gè)新的鏡像。
? ??docker commit?[repo:tag]將一個(gè)container固化為一個(gè)新的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?>/tmp/export.tar
? ? 6.3 持久化鏡像
? ??Save命令用于持久化鏡像
? ? docker save 鏡像ID > /tmp/save.tar
? ? 6.4 導(dǎo)入持久化container
? ? 刪除container?2161509ff65e
? ? 導(dǎo)入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 導(dǎo)入持久化image
? ? 刪除image?daa11948e23d
? ? 導(dǎo)入save.tar文件
[root@localhost?/]#?docker?load?<?/tmp/save.tar
? ? 對image打tag
[root@localhost?/]#?docker?tag?daa11948e23d?load:tag
? ? 6.6export-import與save-load的區(qū)別
? ?導(dǎo)出后再導(dǎo)入(export-import)的鏡像會(huì)丟失所有的歷史,而保存后再加載(save-load)的鏡像沒有丟失歷史和層(layer)。這意味著使用導(dǎo)出后再導(dǎo)入的方式,你將無法回滾到之前的層(layer),同時(shí),使用保存后再加載的方式持久化整個(gè)鏡像,就可以做到層回滾。(可以執(zhí)行dockertag?來回滾之前的層)。
? ? 6.7 一些其它命令
? ? docker logs $CONTAINER_ID#查看docker實(shí)例運(yùn)行日志,確保正常運(yùn)行
? ? docker inspect $CONTAINER_ID #docker inspect?查看image或container的底層信息
? ? docker build?尋找path路徑下名為的Dockerfile的配置文件,使用此配置生成新的image
? ? docker build -t repo[:tag] 同上,可以指定repo和可選的tag
? ? docker build - <?使用指定的dockerfile配置文件,docker以stdin方式獲取內(nèi)容,使用此配置生成新的image
? ? docker port?查看本地哪個(gè)端口映射到container的指定端口,其實(shí)用docker ps 也可以看到
7 一些使用技巧
? ? 7.1 docker文件存放目錄
? ? Docker實(shí)際上把所有東西都放到/var/lib/docker路徑下了。
[root@localhost?docker]#?ls?-F
containers/??devicemapper/??execdriver/??graph/??init/??linkgraph.db??repositories-devicemapper??volumes/
? ? containers目錄當(dāng)然就是存放容器(container)了,graph目錄存放鏡像,文件層(filesystemlayer)存放在graph/imageid/layer路徑下,這樣我們就可以看看文件層里到底有哪些東西,利用這種層級結(jié)構(gòu)可以清楚的看到文件層是如何一層一層疊加起來的。
? ? 7.2 ?查看root密碼
? ?docker容器啟動(dòng)時(shí)的root用戶的密碼是隨機(jī)分配的。所以,通過這種方式就可以得到容器的root用戶的密碼了。
docker?logs?5817938c3f6e?2>&1?|?grep?'User:?'?|?tail?-n1
****************************************************************************************
轉(zhuǎn)載請注明原文地址:http://www.server110.com/docker/201411/11105.html
轉(zhuǎn)載于:https://www.cnblogs.com/aiweixiao/p/5944729.html
總結(jié)
以上是生活随笔為你收集整理的【新技术】CentOS系统下docker的安装配置及使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 使用详解(8)-- tag打标签
- 下一篇: 金域医学是国企吗