




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Docker 從入門(mén)到實(shí)踐v0.2.8Docker是個(gè)偉大的項(xiàng)目,它徹底和輕松!了虛擬化的,讓?xiě)?yīng)用的分發(fā)、部署和管理都變得前所未有的高效本書(shū)既適用于具備基礎(chǔ)Linux知識(shí)的Docker初學(xué)者,也可供希望理解原理和實(shí)現(xiàn)的高級(jí)用戶參考。同時(shí),書(shū)中給出的實(shí)踐案例,可供在進(jìn)行實(shí)際部署時(shí)借鑒。本書(shū)源于WaitFish的Docker學(xué)習(xí)手冊(cè)v1.0內(nèi)容。后來(lái),yeasy 根據(jù)最新Docker版本對(duì)內(nèi)容進(jìn)行了修訂和重寫(xiě),并增加了部分內(nèi)容;與WaitFish協(xié)商,將所有內(nèi)容開(kāi)源,采用互聯(lián)網(wǎng)合作的方式進(jìn)行創(chuàng)作和維護(hù)。前六章為基礎(chǔ)內(nèi)容,供用戶理解Docker的基本概念和操作;79章介紹一些高級(jí)操作;第10章給出典
2、型的應(yīng)用場(chǎng)景和實(shí)踐案例;1113章介紹關(guān)于Docker實(shí)現(xiàn)的相關(guān)技術(shù)。最新版本閱讀:GitBook或DockerPool。另外,歡迎加入DockerPool),Docker,交流Docker技術(shù)。本書(shū)源碼在上維護(hù),歡迎參與:感謝所有的貢獻(xiàn)者。主要版本歷史0.3: 2014-10-TODO完成倉(cāng)庫(kù)章節(jié); 重寫(xiě)安全章節(jié);修正底層實(shí)現(xiàn)章節(jié)的架構(gòu)、名字空間、添加對(duì)常見(jiàn)倉(cāng)庫(kù)和鏡像的介紹;添加Dockerfile的介紹。組、文件系統(tǒng)、容器格式等內(nèi)容;0.2: 2014-09-18對(duì)照文檔重寫(xiě)介紹、基本概念、安裝、鏡像、容器、倉(cāng)庫(kù)、數(shù)據(jù)管理、網(wǎng)絡(luò)等章節(jié);添加底層實(shí)現(xiàn)章節(jié); 添加命令和其它修正。章節(jié);0.1:
3、 2014-09-05添加pdf文件內(nèi)容;修正錯(cuò)別字和表達(dá)不通順的地方。參加步驟在息。上fork到自己的倉(cāng)庫(kù),如docker_user/docker_practice,然后clone到本地,并設(shè)置用戶信$ git clone git$ cd docker_:docker_user/docker_practice.git$ git config "Docker User"$ git config user.docker_user修改代碼后提交,并推送到自己的倉(cāng)庫(kù)。$ #do some change on the content$ g
4、it commit -am "Fix issue #1: change helo to hello"$ git push上提交pull request。在定期使用項(xiàng)目倉(cāng)庫(kù)內(nèi)容更新自己倉(cāng)庫(kù)內(nèi)容。$ git remote add upstream$ git fetch upstream$ git checkout master$ git rebase upstream/master$ git push -f origin master簡(jiǎn)介本章將帶領(lǐng)你進(jìn)入Docker的世界。什么是Docker?用它會(huì)帶來(lái)什么樣的好處?好吧,讓我們帶著問(wèn)題開(kāi)始這神奇之旅。什么是DockerDock
5、er是一個(gè)開(kāi)源項(xiàng)目,誕生于2013年初,最初是dotCloud公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目。它基于公上進(jìn)行司推出的Go語(yǔ)言實(shí)現(xiàn)。 項(xiàng)目后來(lái)加入了Linux維護(hù)。,遵從了Apache 2.0協(xié)議,項(xiàng)目代碼在Docker自開(kāi)源后受到廣泛的關(guān)注和討論,以至于dotCloud公司后來(lái)都改名為Docker Inc。Redhat已經(jīng)在其RHEL6.5中集中支持Docker;也在其PaaS中廣泛應(yīng)用。Docker項(xiàng)目的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案。 Docker的基礎(chǔ)是Linux的容器(LXC)等技術(shù)。在LXC的基礎(chǔ)上Docker進(jìn)行了進(jìn)一步的封裝,讓用戶不需要去關(guān)心容器的管理,使得操作更為簡(jiǎn)便。用戶
6、操作Docker的容器就像操作一個(gè)快速輕量級(jí)的虛擬機(jī)一樣簡(jiǎn)單。下面的圖片比較了Docker和傳統(tǒng)虛擬化方式的不同之處,可見(jiàn)容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)。為什么要使用Docker?作為一種新興的虛擬化方式,Docker跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢(shì)。首先,Docker容器的啟動(dòng)可以在秒級(jí)實(shí)現(xiàn),這相比傳統(tǒng)的虛擬機(jī)方式要快得多。 其次,Docker對(duì)系統(tǒng)的利用率很高,一臺(tái)主機(jī)上可以同時(shí)運(yùn)行數(shù)千個(gè)Docker容器。容器除了運(yùn)行其中應(yīng)用外,基本不消耗額外的系統(tǒng),使得應(yīng)用的性能很高,同時(shí)系統(tǒng)的開(kāi)銷盡量小。傳統(tǒng)虛擬機(jī)方式運(yùn)行10個(gè)不同的應(yīng)用就要
7、起10個(gè)虛擬機(jī),而Docker只需要啟動(dòng)10個(gè)的應(yīng)用即可。具體說(shuō)來(lái),Docker在如下幾個(gè)方面具有較大的優(yōu)勢(shì)。更快速的交付和部署對(duì)開(kāi)發(fā)和運(yùn)維(devop)來(lái)說(shuō),最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運(yùn)行。開(kāi)發(fā)者可以使用一個(gè)標(biāo)準(zhǔn)的鏡像來(lái)構(gòu)建一套開(kāi)發(fā)容器,開(kāi)發(fā)完成之后,運(yùn)維可以直接使用這個(gè)容器來(lái)部署代碼。 Docker可以快速創(chuàng)建容器,快速迭代應(yīng)用程序,并讓整個(gè)過(guò)程全程可見(jiàn),使團(tuán)隊(duì)中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的。 Docker容器很輕很快!容器的啟動(dòng)時(shí)間是秒級(jí)的,大量地節(jié)約開(kāi)發(fā)、測(cè)試、部署的時(shí)間。更高效的虛擬化Docker容器的運(yùn)行不需要額外的hypervisor支持,它
8、是內(nèi)核級(jí)的虛擬化,因此可以實(shí)現(xiàn)更高的性能和效率。更輕松的遷移和擴(kuò)展Docker容器幾乎可以在任意的平臺(tái)上運(yùn)行,包括物理機(jī)、虛擬機(jī)、公有云、私有云、個(gè)人電腦、服務(wù)器等。 這種兼容性可以讓用戶把一個(gè)應(yīng)用程序從一個(gè)平臺(tái)直接遷移到另外一個(gè)。更簡(jiǎn)單的管理使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實(shí)現(xiàn)自動(dòng)化并且高效的管理。對(duì)比傳統(tǒng)虛擬機(jī)總結(jié)特性容器虛擬機(jī)啟動(dòng)秒級(jí)分鐘級(jí)硬盤(pán)使用一般為MB一般為GB性能接近原生弱于系統(tǒng)支持量單機(jī)支持上千個(gè)容器一般幾十個(gè)基本概念Docker包括三個(gè)基本概念鏡像(Image)容器(Container)倉(cāng)庫(kù)(Repo
9、sitory)理解了這三個(gè)概念,就理解了Docker的整個(gè)生命周期。Docker 鏡像Docker 鏡像就是一個(gè)只讀的模板。例如:一個(gè)鏡像可以包含一個(gè)完整的ubuntu的操作系統(tǒng)環(huán)境,里面僅安裝了Apache或用戶需要的其它應(yīng)用程序。鏡像可以用來(lái)創(chuàng)建Docker容器。Docker提供了一個(gè)很簡(jiǎn)單的機(jī)制來(lái)創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里個(gè)已經(jīng)做好的鏡像來(lái)直接使用。一Docker容器Docker利用容器來(lái)運(yùn)行應(yīng)用。容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例。它可以被啟動(dòng)、開(kāi)始、停止、刪除。每個(gè)容器都是相互的平臺(tái)。的、保證安全可以把容器看做是一個(gè)簡(jiǎn)易版的Linux環(huán)境(包括root用戶權(quán)限、
10、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。*注:鏡像是只讀的,容器在啟動(dòng)的時(shí)候創(chuàng)建一層可寫(xiě)層作為最上層。Docker倉(cāng)庫(kù)倉(cāng)庫(kù)是集中存放鏡像文件的場(chǎng)所。有時(shí)候會(huì)把倉(cāng)庫(kù)和倉(cāng)庫(kù)服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。實(shí)際上,倉(cāng)庫(kù)(tag)。服務(wù)器上往往存放著多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)中又包含了多個(gè)鏡像,每個(gè)鏡像有不同的倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)(Public)和私有倉(cāng)庫(kù)(Private)兩種形式。最大的公開(kāi)倉(cāng)庫(kù)是Docker Hub,存放了數(shù)量龐大的鏡像供用戶。 國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)包括DockerPool等,可以提供大陸用戶更穩(wěn)定快速的。當(dāng)然,用戶也可以在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個(gè)私有倉(cāng)庫(kù)。當(dāng)用戶創(chuàng)建了自
11、己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉(cāng)庫(kù),這樣下次在另外一臺(tái)機(jī)器上使用這個(gè)鏡像時(shí)候,只需要從倉(cāng)庫(kù)上 pull 下來(lái)就可以了。*注:Docker倉(cāng)庫(kù)的概念跟Git的類似,服務(wù)器可以理解為這樣的托管服務(wù)。安裝上有各種環(huán)境下的安裝指南,這里主要介紹下Ubuntu和CentOS系列的安裝。Ubuntu系列安裝Docker通過(guò)系統(tǒng)自帶包安裝Ubuntu 14.04版本系統(tǒng)中已經(jīng)自帶了Docker包,可以直接安裝。$ sudo apt-get update$ sudo apt-get install -y docker.io$ sudo ln -sf /usr/bin/docker
12、.io /usr/local/bin/docker$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io如果使用操作系統(tǒng)自帶包安裝Docker,目前安裝的版本是比較舊的0.9.1。 要安裝更新的版本,可以通過(guò)使用Docker源的方式。通過(guò)Docker源安裝最新版本要安裝最新的Docker版本,首先需要安裝apt-get的https支持,之后通過(guò)添加源來(lái)安裝。$ sudo apt-get install apt-transport-https$ sudo apt-key adv -
13、keyserver hkp:/:80 -recv-keys 36A1D7869245C8950F966E9$ sudo bash -c "echo deb$ sudo apt-get update$ sudo apt-get install lxc-dockerdocker main > /etc/apt/sources.list.d/docker.list"低版本如果是低版本的Ubuntu系統(tǒng),需要先更新內(nèi)核。$ sudo apt-get update$ sudo apt-get install linux-image-generic-lts-raring linu
14、x-headers-generic-lts-raring$ sudo reboot然后重復(fù)上面的步驟即可。安裝之后啟動(dòng)Docker服務(wù)。$ sudo service docker startCentOS系列安裝dockerDocker支持CentOS6及以后的版本。CentOS6對(duì)于CentOS6,可以使用EPEL庫(kù)安裝Docker,命令如下$ sudo yum install$ sudo yum install docker-ioCentOS7CentOS7系統(tǒng)CentOS-Extras庫(kù)中已帶Docker,可以直接安裝:$ sudo yum install docker安裝之后啟動(dòng)Dock
15、er服務(wù),并讓它隨系統(tǒng)啟動(dòng)自動(dòng)加載。$ sudo service docker start$ sudo chkconfig docker onDocker鏡像在之前的介紹中,我們知道鏡像是Docker的三大組件之一。Docker運(yùn)行容器前需要本地存在對(duì)應(yīng)的鏡像,如果鏡像不存在本地,Docker會(huì)從鏡像倉(cāng)庫(kù)(默認(rèn)是Docker Hub公共服務(wù)器中的倉(cāng)庫(kù))。本章將介紹關(guān)于鏡像的內(nèi)容,包括:從倉(cāng)庫(kù)獲取鏡像;管理本機(jī)上的鏡像;介紹鏡像實(shí)現(xiàn)的基本原理。獲取鏡像可以使用 docker pull 命令來(lái)從倉(cāng)庫(kù)獲取所需要的鏡像。下面的例子將從Docker Hub倉(cāng)庫(kù)一個(gè)Ubuntu 12.04操作系統(tǒng)的鏡像。
16、$ sudo docker pull ubuntu:12.04 Pulling repository ubuntuab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete過(guò)程中,會(huì)輸出獲取鏡像的每
17、一層信息。 該命令實(shí)際上相當(dāng)于 $ sudo docker pull 命令,即從服務(wù)器 中的 ubuntu 倉(cāng)庫(kù)來(lái)標(biāo)記為 12.04 的鏡像。有時(shí)候倉(cāng)庫(kù)服務(wù)器較慢,可以從其他倉(cāng)庫(kù)。 從其它倉(cāng)庫(kù)時(shí)需要指定完整的倉(cāng)庫(kù)服務(wù)器地址。例如$ sudo docker pull :5000/ubuntu:12.04 Pulling :5000/ubuntuab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download co
18、mplete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete完成后,即可隨時(shí)使用該鏡像了,例如創(chuàng)建一個(gè)容器,讓其中運(yùn)行bash應(yīng)用。$ sudo docker run -t -i ubuntu:12.04 /bin/bash rootfe7fc4bd8fc9:/#列出本地鏡像使用 docker images 顯示本地已有的鏡像。$ sudo docker imagesREPOSITORYubuntu ubuntu ubuntu ubuntu ubunt
19、u.TAG 12.04precise 14.04latest trustyIMAGE IDCREATEDVIRTUAL SIZE74fe38d11401 4 weeks ago 209.6 MB74fe38d11401 4 weeks ago 209.6 MB99ec81b80c55 4 weeks ago 266 MB99ec81b80c55 4 weeks ago 266 MB99ec81b80c55 4 weeks ago 266 MB在列出信息中,可以看到幾個(gè)字段信息來(lái)自于哪個(gè)倉(cāng)庫(kù),比如ubuntu鏡像的標(biāo)記,比如 14.04它的 ID 號(hào)(唯一)創(chuàng)建時(shí)間鏡像大小其中鏡像的 ID 唯一
20、標(biāo)識(shí)了鏡像,注意到 ubuntu:14.04 和 ubuntu:trusty 具有相同的鏡像 ID ,說(shuō)明它們實(shí)際上是同一鏡像。TAG 信息用來(lái)標(biāo)記來(lái)自同一個(gè)倉(cāng)庫(kù)的不同鏡像。例如 ubuntu 倉(cāng)庫(kù)中有多個(gè)鏡像,通過(guò) TAG 信息來(lái)區(qū)分發(fā)行版本,例如10.04、12.04、12.10、13.04、14.04等。例如下面動(dòng)一個(gè)容器。令指定使用鏡像 ubuntu:14.04 來(lái)啟$ sudo docker run -t -i ubuntu:14.04 /bin/bash如果不指定具體的標(biāo)記,則默認(rèn)使用 latest 標(biāo)記信息。創(chuàng)建鏡像創(chuàng)建鏡像有很多方法,用戶可以從Docker Hub獲取已有鏡像并
21、更新,也可以利用本地文件系統(tǒng)創(chuàng)建一個(gè)。修改已有鏡像先使用的鏡像啟動(dòng)容器。$ sudo docker run -t -i training/sinatra /bin/bash root0b2616b0e5a8:/#注意:記住容器的ID ,稍后還會(huì)用到。在容器中添加json和gem兩個(gè)應(yīng)用。root0b2616b0e5a8:/# gem install json當(dāng)結(jié)束后,我們使用exit來(lái)后的副本。,現(xiàn)在我們的容器已經(jīng)被我們改變了,使用docker commit命令來(lái)提交更新$ sudo docker commit -m "Added json gem" -a "Do
22、cker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c其中,-m 來(lái)指定提交的說(shuō)明信息,跟我們使用的版本工具一樣;-a 可以指定更新的用戶信息;之后是用來(lái)創(chuàng)建鏡像的容器的ID;最后指定目標(biāo)鏡像的倉(cāng)庫(kù)名和tag信息。創(chuàng)建后會(huì)返回這個(gè)鏡像的id信息。使用docker images來(lái)查看新創(chuàng)建的鏡像。$ sudo docker imagesREPOSITORYtraining/sinatra ouruser/sinatra ou
23、ruser/sinatraTAGlatest v2 latestIMAGE ID5bc342fa0b91CREATEDVIRTUAL SIZE10 hours ago 446.7 MB10 hours ago 446.7 MB10 hours ago 446.7 MB3c59e02ddd1a 5db5f8471261之后,可以使用新的鏡像來(lái)啟動(dòng)容器$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root78e82f680994:/#利用dockerfile 來(lái)創(chuàng)建鏡像使用 docker commit 來(lái)擴(kuò)展一個(gè)鏡像比較簡(jiǎn)單,但它不容易在
24、一個(gè)團(tuán)隊(duì)中它。我們可以使用 dockerbuild 來(lái)創(chuàng)建一個(gè)新的鏡像。為此,首先需要?jiǎng)?chuàng)建一個(gè)dockerfile,包含一些如何創(chuàng)建鏡像的指令。新建一個(gè)目錄和一個(gè)dockerfile$ mkdir sinatra$ cd sinatra$ touch DockerfileDockerfile中每一條指令都創(chuàng)建鏡像的一層,例如:# This is a comment FROM ubuntu:14.04MAINTAINER Docker Newbee <newbee> RUN apt-get -updateRUN apt-get -y install ruby ruby-dev RUN
25、 gem install sinatraDockerfile基本的語(yǔ)法是使用#來(lái)注釋FROM指令告訴docker 使用哪個(gè)鏡像作為基礎(chǔ)接著是維護(hù)者的信息RUN開(kāi)頭的指令會(huì)在創(chuàng)建中運(yùn)行,比如安裝一個(gè)軟件包,在這里使用apt 來(lái)安裝了一些軟件編寫(xiě)完成Dockerfile后可以使用docker build來(lái)生成鏡像。$ sudo docker build -t="ouruser/sinatra:v2" . Uploading context 2.56 kBUploading contextStep 0 : FROM ubuntu:14.04-> 99ec81b80c55St
26、ep 1 : MAINTAINER Kate Smith <ksmith>-> Running in 7c5664a8a0c1-> 2fa8ca4e2a13Removing intermediate container 7c5664a8a0c1Step 2 : RUN apt-get -update-> Running in b07cc3fb4256-> 50d21070ec0cRemoving intermediate container b07cc3fb4256 Step 3 : RUN apt-get -y install ruby ruby-dev-
27、> Running in a5b038dd127eSelecting previously unselected package libasan0:amd64.(Reading database . 11518 files and directories currently installed.) Preparing to unpack ./libasan0_4.8.2-19ubuntu1_amd64.deb .Setting up ruby (1:) .Setting up ruby1.9.1 (84-2ubuntu1) . Processing trigg
28、ers for libc-bin (2.19-0ubuntu6) .-> 2acb20f17878Removing intermediate container a5b038dd127e Step 4 : RUN gem install sinatra-> Running in 5e9d0065c1f7. . .Successfully installed rack-protection-1.5.3 Successfully installed sinatra-1.4.54 gems installed-> 324104cde6adRemoving intermediate
29、container 5e9d0065c1f7 Successfully built 324104cde6ad其中-t標(biāo)記來(lái)添加tag,指定新的鏡像的用戶信息。 “.”是Dockerfile所在的路徑(當(dāng)前目錄),也可以替換為一個(gè)具體的Dockerfile的路徑。我們可以看到build進(jìn)程在執(zhí)行操作。它要做的第一件事情就是上傳這個(gè)Dockerfile內(nèi)容,因?yàn)樗械牟僮鞫家罁?jù)Dockerfile來(lái)進(jìn)行。 然后,dockfile中的指令被一條一條的執(zhí)行。每一步都創(chuàng)建了一個(gè)新的容器,在容器中執(zhí)行指令并提交修改(就跟之前介紹過(guò)的 docker commit 一樣)。當(dāng)所有的指令都執(zhí)行完畢之后,返回了
30、最終的鏡像 id。所有的中間步驟所產(chǎn)生的容器都被刪除和了。*注意一個(gè)鏡像不能超過(guò)127層此外,還可以利用ADD命令容器啟動(dòng)后運(yùn)行的程序等。例如本地文件到鏡像;用EXPOSE命令來(lái)向外部開(kāi)放端口;用CMD命令來(lái)描述# put my local web site in myApp folder to /var/www ADD myApp /var/www# expose httpd port EXPOSE 80# the command to runCMD "/usr/sbin/apachectl", "-D", "FOREGROUND"
31、現(xiàn)在可以利用新創(chuàng)建的鏡像來(lái)啟動(dòng)一個(gè)容器。$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root8196968dac35:/#還可以用 docker tag 命令來(lái)修改鏡像的。$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel$ sudo docker images ouruser/sinatraREPOSITORYouruser/sinatra ouruser/sinatra ouruser/sinatraTAGlatest devel v2IMAGE IDCREATEDVIRTU
32、AL SIZE5db5f8471261 11 hours ago 446.7 MB5db5f8471261 11 hours ago 446.7 MB5db5f8471261 11 hours ago 446.7 MB*注:用法,請(qǐng)參考dockerfile章節(jié)。從本地文件系統(tǒng)導(dǎo)入要從本地文件系統(tǒng)導(dǎo)入一個(gè)鏡像,可以使用openvz(容器虛擬化的先鋒技術(shù))的模板來(lái)創(chuàng)建: openvz的模板地址為。比如:先了一個(gè)ubuntu14.04的鏡像,之后使用以下命令導(dǎo)入:sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:1
33、4.04然后查看新導(dǎo)入的鏡像。docker images REPOSITORYubuntuTAG 14.04IMAGE ID05ac7c0b9383CREATED17 seconds agoVIRTUAL SIZE215.5 MB上傳鏡像用戶可以通過(guò) docker push 命令,把自己創(chuàng)建的鏡像上傳到倉(cāng)庫(kù)中來(lái)共享。例如,用戶在Docker Hub上完成后,可以推送自己的鏡像到倉(cāng)庫(kù)中。$ sudo docker push ouruser/sinatraThe push refers to a repository ouruser/sinatra (len: 1) Sending image l
34、istPushing repository ouruser/sinatra (3 tags)存出和載入鏡像存出鏡像如果要導(dǎo)出鏡像到本地文件,可以使用 docker save 命令。$ sudo docker imagesREPOSITORYubuntu.TAG 14.04IMAGE IDc4ff7513909dCREATED5 weeks agoVIRTUAL SIZE225.4 MB$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04載入鏡像可以使用 docker load 從導(dǎo)出的本地文件中再導(dǎo)入到本地鏡像庫(kù),例如$ sudo docker
35、load -input ubuntu_14.04.tar或$ sudo docker load < ubuntu_14.04.tar這將導(dǎo)入鏡像以及其相關(guān)的元數(shù)據(jù)信息(包括等)。移除本地鏡像如果要移除本地的鏡像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。$ sudo docker rmi training/sinatra Untagged: training/sinatra:latestDeleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d Deleted:
36、ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0*注意:在刪除鏡像之前要先用 docker rm 刪掉依賴于這個(gè)鏡像的所有容器。鏡像的實(shí)現(xiàn)原理Docker鏡像是怎么實(shí)現(xiàn)增量的修改和維護(hù)的? 每個(gè)鏡像都由很多層次不同的層結(jié)合到一個(gè)鏡像中去。,Docker使用 Union FS 將這些通常Union FS有兩個(gè)用途, 一方面可以實(shí)現(xiàn)不借助 LVM、RAID 將多個(gè)disk掛
37、到同一個(gè)目錄下,另一個(gè)更常用的就是將一個(gè)只讀的分支和一個(gè)可寫(xiě)的分支在一起,Live CD正是基于此方法可以在鏡像不變的基礎(chǔ)上用戶在其上進(jìn)行一些寫(xiě)操作。 Docker在AUFS上構(gòu)建的容器也是利用了類似的原理。Docker容器容器是Docker又一概念。簡(jiǎn)單的說(shuō),容器是運(yùn)行的一個(gè)或一組應(yīng)用,以及它們的運(yùn)行態(tài)環(huán)境。對(duì)應(yīng)的,虛擬機(jī)可以理解為模擬運(yùn)行的一整套操作系統(tǒng)(提供了運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用。本章將具體介紹如何來(lái)管理一個(gè)容器,包括創(chuàng)建、啟動(dòng)和停止等。啟動(dòng)容器啟動(dòng)容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動(dòng),另外一個(gè)是將在終止?fàn)顟B(tài)(stopped)的容器重新啟動(dòng)。因?yàn)镈ock
38、er的容器實(shí)在太輕量級(jí)了,很多時(shí)候用戶都是隨時(shí)刪除和新創(chuàng)建容器。新建并啟動(dòng)所需要令主要為 docker run 。例如,下面令輸出一個(gè)"Hello World",之后終止容器。$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world這跟在本地直接執(zhí)行 /bin/echo 'hello world' 幾乎感覺(jué)不出任何區(qū)別。下面令則啟動(dòng)一個(gè)bash終端,可以讓用戶進(jìn)行交互。$ sudo docker run -t -i ubuntu:14.04 /bin/bash roo
39、taf8bae53bdd3:/#其中, -t 選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上,入保持打開(kāi)。-i 則讓容器的標(biāo)準(zhǔn)輸在交互模式下,用戶可以通過(guò)所創(chuàng)建的終端來(lái)輸入命令,例如rootaf8bae53bdd3:/# pwd/rootaf8bae53bdd3:/# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var當(dāng)利用 docker run 來(lái)創(chuàng)建容器時(shí),Docker在運(yùn)行的標(biāo)準(zhǔn)操作包括:檢查本地是否存在指定的鏡像,不存在就從公有倉(cāng)庫(kù)
40、利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫(xiě)層從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去 從地址池配置一個(gè)ip地址給容器執(zhí)行用戶指定的應(yīng)用程序執(zhí)行完畢后容器被終止啟動(dòng)已終止容器可以利用 docker start 命令,直接將一個(gè)已經(jīng)終止的容器啟動(dòng)運(yùn)行。容器的為所執(zhí)行的應(yīng)用程序,所需要的都是應(yīng)用程序運(yùn)行所必需的。除此之外,并沒(méi)有其它的資源??梢栽趥谓K端中利用 ps 或 top 來(lái)查看進(jìn)程信息。rootba267838cc1b:/# psPID TTY 1 ?11 ?TIME CMD00:00:00 bash00:00:00 ps可見(jiàn),容器中僅運(yùn)行了指定
41、的bash應(yīng)用。這種特點(diǎn)使得Docker對(duì)虛擬化。的利用率極高,是貨真價(jià)實(shí)的輕量級(jí)守護(hù)態(tài)運(yùn)行的時(shí)候,需要讓Docker容器在來(lái)實(shí)現(xiàn)。以守護(hù)態(tài)(Daemonized)形式運(yùn)行。此時(shí),可以通過(guò)添加 -d 參數(shù)例如下面令會(huì)在運(yùn)行容器。$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147容器啟動(dòng)后會(huì)返回一個(gè)唯一的id,也可
42、以通過(guò) docker ps 命令來(lái)查看容器信息。$ sudo docker ps CONTAINER ID IMAGECOMMANDCREATEDSTATUSPORTS NAMES1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minuteinsane_babbage要獲取容器的輸出信息,可以通過(guò) docker logs 命令。$ sudo docker logs insane_babbage hello worldhello world hello world. . .終止容器可以使用 docker
43、stop 來(lái)終止一個(gè)運(yùn)行中的容器。此外,當(dāng)Docker容器中指定的應(yīng)用終結(jié)時(shí),容器也自動(dòng)終止。 例如對(duì)于上一章節(jié)中只啟動(dòng)了一個(gè)終端的容器,用戶通過(guò) exit 命令或 Ctrl+d 來(lái)終端時(shí),所創(chuàng)建的容器立刻終止。終止?fàn)顟B(tài)的容器可以用 docker ps -a 命令看到。例如sudo docker ps -a CONTAINER IDba267838cc1b 98e5efa7d997IMAGEubuntu:14.04COMMAND"/bin/bash"CREATEDSTATUSPO30 minutes agoExited (0) About a minutraining/we
44、bapp:latest "python app.py"About an hour ago Exited (0) 34 minu處于終止?fàn)顟B(tài)的容器,可以通過(guò) docker start 命令來(lái)重新啟動(dòng)。此外, docker restart 命令會(huì)將一個(gè)運(yùn)行態(tài)的容器終止,然后再重新啟動(dòng)它。進(jìn)入容器在使用 -d 參數(shù)時(shí),容器啟動(dòng)后會(huì)進(jìn)入。 某些時(shí)候需要進(jìn)入容器進(jìn)行操作,有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。attach命令docker attach 是Docker自帶令。下面示例如何使用該命令。$ sudo docker run -id
45、t ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550$ sudo docker psCONTAINER ID 243c32535da7IMAGEubuntu:latestCOMMAND"/bin/bash"CREATED18 seconds agoSTATUSPORTSUp 17 seconds$sudo docker attach nostalgic_hypatia root243c32535da7:/#但是使用 attach 命令有時(shí)候并不方多個(gè)窗口同時(shí)attach到同一個(gè)容器
46、的時(shí)候,所有窗口都會(huì)同步顯示。當(dāng)某個(gè)窗口因命令阻塞時(shí),其他窗口也無(wú)法執(zhí)行操作了。nsenter命令安裝nsenter 工具在util-linux包2.23版本后包含。 如果系統(tǒng)中util-linux包沒(méi)有該命令,可以按照下面的方法從源碼安裝。$ cd /tmp; curl$ ./configure -without-ncurses$ make nsenter && sudo cp nsenter /usr/local/bin| tar -zxf-; cd u使用nsenter 可以另一個(gè)進(jìn)程的名字空間。nsenter要正常工作需要有root權(quán)限。 很不幸,Ubuntu 14.4
47、仍然使用的是util-linux版本2.20。安裝最新版本的util-linux(2.24)版,請(qǐng)按照以下步驟:$ wget$ cd util-linux-2.24$ ./configure -without-ncurses && make nsenter$ sudo cp nsenter /usr/local/bin; tar xzvf util-linux-2.24為了連接到容器,你還需要找到容器的第一個(gè)進(jìn)程的PID,可以通過(guò)下面令獲取。PID=$(docker inspect -format " .State.Pid " <container&g
48、t;)通過(guò)這個(gè)PID,就可以連接到這個(gè)容器:$ nsenter -target $PID -mount -uts -ipc -net -pid下面給出一個(gè)完整的例子。$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550$ sudo docker psCONTAINER ID 243c32535da7IMAGECOMMANDCREATED18 seconds agoSTATUSPORTSubuntu:latest"/bin/bash"Up 1
49、7 seconds$ PID=$(docker-pid 243c32535da7) 10981$ sudo nsenter -target 10981 -mount -uts -ipc -net -pid root243c32535da7:/#.bashrc_docker,并將內(nèi)容放到.bashrc中。更簡(jiǎn)單的,建議大家$ wget -P $ echo " -f /.bashrc_docker && . /.bashrc_docker" >> /.bashrc; source /.bashrc;這個(gè)文件中定義了很多方便使用Docker令,例如 d
50、ocker-pid 可以獲取某個(gè)容器的PID;而 docker-enter 可以進(jìn)入容器或直接在容器內(nèi)執(zhí)行命令。$ echo $(docker-pid <container>)$ docker-enter <container> ls導(dǎo)出和導(dǎo)入容器導(dǎo)出容器如果要導(dǎo)出本地某個(gè)容器,可以使用 docker export 命令。$ sudo docker ps -aCONTAINER ID 7691a814370eIMAGEubuntu:14.04COMMAND"/bin/bash"CREATED36 hours agoSTATUSPORTSExited
51、(0) 21 hours ago$ sudo docker export 7691a814370e > ubuntu.tar這樣將導(dǎo)出容器快照到本地文件。導(dǎo)入容器快照可以使用 docker import 從容器快照文件中再導(dǎo)入為鏡像,例如$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0$ sudo docker imagesREPOSITORYtest/ubuntuTAG v1.0IMAGE ID 9d37a6082e97CREATEDVIRTUAL SIZEAbout a minute ago 171.3 MB此外,也可以通
52、過(guò)指定URL或者某個(gè)目錄來(lái)導(dǎo)入,例如$sudo docker importexample/imagerepo*注:用戶既可以使用 docker load 來(lái)導(dǎo)入鏡像文件到本地鏡像庫(kù),也可以使用 docker import 來(lái)導(dǎo)入一個(gè)容器快照到本地鏡像庫(kù)。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像文件將保存完整,體積也要大。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定等元數(shù)據(jù)信息。刪除容器可以使用 docker rm 來(lái)刪除一個(gè)處于終止?fàn)顟B(tài)的容器。 例如$sudo docker rm trusting_newton trusting_newton如果
53、要?jiǎng)h除一個(gè)運(yùn)行中的容器,可以添加 -f 參數(shù)。Docker會(huì)SIGKILL信號(hào)給容器。倉(cāng)庫(kù)倉(cāng)庫(kù)(Repository)是集中存放鏡像的地方。一個(gè)容易的概念是服務(wù)器(Registry)。實(shí)際上服務(wù)器是管理倉(cāng)庫(kù)的具體服務(wù)器,每個(gè)服務(wù)器上可以有多個(gè)倉(cāng)庫(kù),而每個(gè)倉(cāng)庫(kù)下面有多個(gè)鏡像。從這方面來(lái)說(shuō),倉(cāng)庫(kù)可以被認(rèn)為是一個(gè)具體的項(xiàng)目或目錄。例如對(duì)于倉(cāng)庫(kù)地址 來(lái)說(shuō), 是址, ubuntu 是倉(cāng)庫(kù)名。服務(wù)器地大部分時(shí)候,并不嚴(yán)格區(qū)分這兩者的概念。Docker Hub目前Docker維護(hù)了一個(gè)公共倉(cāng)庫(kù)-Docker Hub,其中已經(jīng)包括了超過(guò)15,000的鏡像。大部分用戶的需求,都可以通過(guò)在Docker Hub中直
54、接鏡像來(lái)實(shí)現(xiàn)。登錄可以通過(guò)執(zhí)行 docker login 命令來(lái)輸入用戶名、錄的 .dockercfg 中將保存用戶的認(rèn)證信息。和郵箱來(lái)完成和登錄。后,本地用戶目基本操作用戶無(wú)需登錄即可通過(guò) docker search 命令來(lái)查找到本地。倉(cāng)庫(kù)中的鏡像,并利用 docker pull 命令來(lái)將它例如以centos為進(jìn)行搜索:$ sudo docker search centos NAMEcentos tianon/centos blalor/centossaltstack/centos-6-minimal tutum/centos-6.4.DESCRIPTIONThe official build of CentOS.STARS 465OFFICIAL OKAUTOMATEDCentOS 5 and 6, created using rinse instea. 28Bare-bones base CentOS 6.5 image6OK6DEPRECATED. Use tutum/centos:6.4 instead. .OK 5O可以看到返回了很多包含關(guān)鍵字的鏡像
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河北省邢臺(tái)市本年度(2025)小學(xué)一年級(jí)數(shù)學(xué)部編版摸底考試((上下)學(xué)期)試卷及答案
- 給排水預(yù)埋施工要求
- 什么是閱讀教學(xué)設(shè)計(jì)
- 公共營(yíng)養(yǎng)師測(cè)試題+答案
- 云南省文山州馬關(guān)縣一中2025年高三下學(xué)期第六次檢測(cè)英語(yǔ)試卷含解析
- 職業(yè)技術(shù)學(xué)校數(shù)控技術(shù)應(yīng)用專業(yè)人才培養(yǎng)方案(2024年)
- 化工總控工模擬題與參考答案
- 職業(yè)技術(shù)學(xué)院2024級(jí)國(guó)際經(jīng)濟(jì)與貿(mào)易專業(yè)中德合作項(xiàng)目人才培養(yǎng)方案
- 河湖治理工程水環(huán)境監(jiān)測(cè)與評(píng)價(jià)考核試卷
- 農(nóng)產(chǎn)品加工設(shè)備能耗評(píng)價(jià)與節(jié)能考核試卷
- 2024年江蘇省南京市中考物理試卷真題(含答案)
- 監(jiān)理工程師通知回復(fù)單11
- 禁毒學(xué)校青少年預(yù)防遠(yuǎn)離毒品教育模板課件
- 合同交底范本課件
- 阿瑪松氣吸式精量播種機(jī)課件
- 汽車4S店售后回訪流程
- 試卷講評(píng)課市公開(kāi)課一等獎(jiǎng)市公開(kāi)課一等獎(jiǎng)省名師優(yōu)質(zhì)課賽課一等獎(jiǎng)?wù)n件
- 新人教版八年級(jí)下冊(cè)《生物》期中試卷及答案
- DB32-T 3897-2020地方政府規(guī)章立法規(guī)范-(高清現(xiàn)行)
- 質(zhì)量管理手冊(cè)-非發(fā)酵性豆制品
- 新建焦化廠工藝、設(shè)備選型經(jīng)驗(yàn)總結(jié)
評(píng)論
0/150
提交評(píng)論