課件Docker是個偉大_第1頁
課件Docker是個偉大_第2頁
課件Docker是個偉大_第3頁
課件Docker是個偉大_第4頁
課件Docker是個偉大_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Docker 從入門到實踐v0.2.8Docker是個偉大的項目,它徹底和輕松!了虛擬化的,讓應(yīng)用的分發(fā)、部署和管理都變得前所未有的高效本書既適用于具備基礎(chǔ)Linux知識的Docker初學者,也可供希望理解原理和實現(xiàn)的高級用戶參考。同時,書中給出的實踐案例,可供在進行實際部署時借鑒。本書源于WaitFish的Docker學習手冊v1.0內(nèi)容。后來,yeasy 根據(jù)最新Docker版本對內(nèi)容進行了修訂和重寫,并增加了部分內(nèi)容;與WaitFish協(xié)商,將所有內(nèi)容開源,采用互聯(lián)網(wǎng)合作的方式進行創(chuàng)作和維護。前六章為基礎(chǔ)內(nèi)容,供用戶理解Docker的基本概念和操作;79章介紹一些高級操作;第10章給出典

2、型的應(yīng)用場景和實踐案例;1113章介紹關(guān)于Docker實現(xiàn)的相關(guān)技術(shù)。最新版本閱讀:GitBook或DockerPool。另外,歡迎加入DockerPool),Docker,交流Docker技術(shù)。本書源碼在上維護,歡迎參與:感謝所有的貢獻者。主要版本歷史0.3: 2014-10-TODO完成倉庫章節(jié); 重寫安全章節(jié);修正底層實現(xiàn)章節(jié)的架構(gòu)、名字空間、添加對常見倉庫和鏡像的介紹;添加Dockerfile的介紹。組、文件系統(tǒng)、容器格式等內(nèi)容;0.2: 2014-09-18對照文檔重寫介紹、基本概念、安裝、鏡像、容器、倉庫、數(shù)據(jù)管理、網(wǎng)絡(luò)等章節(jié);添加底層實現(xiàn)章節(jié); 添加命令和其它修正。章節(jié);0.1:

3、 2014-09-05添加pdf文件內(nèi)容;修正錯別字和表達不通順的地方。參加步驟在息。上fork到自己的倉庫,如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修改代碼后提交,并推送到自己的倉庫。$ #do some change on the content$ g

4、it commit -am "Fix issue #1: change helo to hello"$ git push上提交pull request。在定期使用項目倉庫內(nèi)容更新自己倉庫內(nèi)容。$ git remote add upstream$ git fetch upstream$ git checkout master$ git rebase upstream/master$ git push -f origin master簡介本章將帶領(lǐng)你進入Docker的世界。什么是Docker?用它會帶來什么樣的好處?好吧,讓我們帶著問題開始這神奇之旅。什么是DockerDock

5、er是一個開源項目,誕生于2013年初,最初是dotCloud公司內(nèi)部的一個業(yè)余項目。它基于公上進行司推出的Go語言實現(xiàn)。 項目后來加入了Linux維護。,遵從了Apache 2.0協(xié)議,項目代碼在Docker自開源后受到廣泛的關(guān)注和討論,以至于dotCloud公司后來都改名為Docker Inc。Redhat已經(jīng)在其RHEL6.5中集中支持Docker;也在其PaaS中廣泛應(yīng)用。Docker項目的目標是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案。 Docker的基礎(chǔ)是Linux的容器(LXC)等技術(shù)。在LXC的基礎(chǔ)上Docker進行了進一步的封裝,讓用戶不需要去關(guān)心容器的管理,使得操作更為簡便。用戶

6、操作Docker的容器就像操作一個快速輕量級的虛擬機一樣簡單。下面的圖片比較了Docker和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復(fù)用本機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)。為什么要使用Docker?作為一種新興的虛擬化方式,Docker跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。首先,Docker容器的啟動可以在秒級實現(xiàn),這相比傳統(tǒng)的虛擬機方式要快得多。 其次,Docker對系統(tǒng)的利用率很高,一臺主機上可以同時運行數(shù)千個Docker容器。容器除了運行其中應(yīng)用外,基本不消耗額外的系統(tǒng),使得應(yīng)用的性能很高,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機方式運行10個不同的應(yīng)用就要

7、起10個虛擬機,而Docker只需要啟動10個的應(yīng)用即可。具體說來,Docker在如下幾個方面具有較大的優(yōu)勢。更快速的交付和部署對開發(fā)和運維(devop)來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行。開發(fā)者可以使用一個標準的鏡像來構(gòu)建一套開發(fā)容器,開發(fā)完成之后,運維可以直接使用這個容器來部署代碼。 Docker可以快速創(chuàng)建容器,快速迭代應(yīng)用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的。 Docker容器很輕很快!容器的啟動時間是秒級的,大量地節(jié)約開發(fā)、測試、部署的時間。更高效的虛擬化Docker容器的運行不需要額外的hypervisor支持,它

8、是內(nèi)核級的虛擬化,因此可以實現(xiàn)更高的性能和效率。更輕松的遷移和擴展Docker容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務(wù)器等。 這種兼容性可以讓用戶把一個應(yīng)用程序從一個平臺直接遷移到另外一個。更簡單的管理使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實現(xiàn)自動化并且高效的管理。對比傳統(tǒng)虛擬機總結(jié)特性容器虛擬機啟動秒級分鐘級硬盤使用一般為MB一般為GB性能接近原生弱于系統(tǒng)支持量單機支持上千個容器一般幾十個基本概念Docker包括三個基本概念鏡像(Image)容器(Container)倉庫(Repo

9、sitory)理解了這三個概念,就理解了Docker的整個生命周期。Docker 鏡像Docker 鏡像就是一個只讀的模板。例如:一個鏡像可以包含一個完整的ubuntu的操作系統(tǒng)環(huán)境,里面僅安裝了Apache或用戶需要的其它應(yīng)用程序。鏡像可以用來創(chuàng)建Docker容器。Docker提供了一個很簡單的機制來創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里個已經(jīng)做好的鏡像來直接使用。一Docker容器Docker利用容器來運行應(yīng)用。容器是從鏡像創(chuàng)建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互的平臺。的、保證安全可以把容器看做是一個簡易版的Linux環(huán)境(包括root用戶權(quán)限、

10、進程空間、用戶空間和網(wǎng)絡(luò)空間等)和運行在其中的應(yīng)用程序。*注:鏡像是只讀的,容器在啟動的時候創(chuàng)建一層可寫層作為最上層。Docker倉庫倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫服務(wù)器(Registry)混為一談,并不嚴格區(qū)分。實際上,倉庫(tag)。服務(wù)器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是Docker Hub,存放了數(shù)量龐大的鏡像供用戶。 國內(nèi)的公開倉庫包括DockerPool等,可以提供大陸用戶更穩(wěn)定快速的。當然,用戶也可以在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個私有倉庫。當用戶創(chuàng)建了自

11、己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。*注:Docker倉庫的概念跟Git的類似,服務(wù)器可以理解為這樣的托管服務(wù)。安裝上有各種環(huán)境下的安裝指南,這里主要介紹下Ubuntu和CentOS系列的安裝。Ubuntu系列安裝Docker通過系統(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。 要安裝更新的版本,可以通過使用Docker源的方式。通過Docker源安裝最新版本要安裝最新的Docker版本,首先需要安裝apt-get的https支持,之后通過添加源來安裝。$ 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ù)上面的步驟即可。安裝之后啟動Docker服務(wù)。$ sudo service docker startCentOS系列安裝dockerDocker支持CentOS6及以后的版本。CentOS6對于CentOS6,可以使用EPEL庫安裝Docker,命令如下$ sudo yum install$ sudo yum install docker-ioCentOS7CentOS7系統(tǒng)CentOS-Extras庫中已帶Docker,可以直接安裝:$ sudo yum install docker安裝之后啟動Dock

15、er服務(wù),并讓它隨系統(tǒng)啟動自動加載。$ sudo service docker start$ sudo chkconfig docker onDocker鏡像在之前的介紹中,我們知道鏡像是Docker的三大組件之一。Docker運行容器前需要本地存在對應(yīng)的鏡像,如果鏡像不存在本地,Docker會從鏡像倉庫(默認是Docker Hub公共服務(wù)器中的倉庫)。本章將介紹關(guān)于鏡像的內(nèi)容,包括:從倉庫獲取鏡像;管理本機上的鏡像;介紹鏡像實現(xiàn)的基本原理。獲取鏡像可以使用 docker pull 命令來從倉庫獲取所需要的鏡像。下面的例子將從Docker Hub倉庫一個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過程中,會輸出獲取鏡像的每

17、一層信息。 該命令實際上相當于 $ sudo docker pull 命令,即從服務(wù)器 中的 ubuntu 倉庫來標記為 12.04 的鏡像。有時候倉庫服務(wù)器較慢,可以從其他倉庫。 從其它倉庫時需要指定完整的倉庫服務(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完成后,即可隨時使用該鏡像了,例如創(chuàng)建一個容器,讓其中運行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在列出信息中,可以看到幾個字段信息來自于哪個倉庫,比如ubuntu鏡像的標記,比如 14.04它的 ID 號(唯一)創(chuàng)建時間鏡像大小其中鏡像的 ID 唯一

20、標識了鏡像,注意到 ubuntu:14.04 和 ubuntu:trusty 具有相同的鏡像 ID ,說明它們實際上是同一鏡像。TAG 信息用來標記來自同一個倉庫的不同鏡像。例如 ubuntu 倉庫中有多個鏡像,通過 TAG 信息來區(qū)分發(fā)行版本,例如10.04、12.04、12.10、13.04、14.04等。例如下面動一個容器。令指定使用鏡像 ubuntu:14.04 來啟$ sudo docker run -t -i ubuntu:14.04 /bin/bash如果不指定具體的標記,則默認使用 latest 標記信息。創(chuàng)建鏡像創(chuàng)建鏡像有很多方法,用戶可以從Docker Hub獲取已有鏡像并

21、更新,也可以利用本地文件系統(tǒng)創(chuàng)建一個。修改已有鏡像先使用的鏡像啟動容器。$ sudo docker run -t -i training/sinatra /bin/bash root0b2616b0e5a8:/#注意:記住容器的ID ,稍后還會用到。在容器中添加json和gem兩個應(yīng)用。root0b2616b0e5a8:/# gem install json當結(jié)束后,我們使用exit來后的副本。,現(xiàn)在我們的容器已經(jīng)被我們改變了,使用docker commit命令來提交更新$ sudo docker commit -m "Added json gem" -a "Do

22、cker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c其中,-m 來指定提交的說明信息,跟我們使用的版本工具一樣;-a 可以指定更新的用戶信息;之后是用來創(chuàng)建鏡像的容器的ID;最后指定目標鏡像的倉庫名和tag信息。創(chuàng)建后會返回這個鏡像的id信息。使用docker images來查看新創(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之后,可以使用新的鏡像來啟動容器$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root78e82f680994:/#利用dockerfile 來創(chuàng)建鏡像使用 docker commit 來擴展一個鏡像比較簡單,但它不容易在

24、一個團隊中它。我們可以使用 dockerbuild 來創(chuàng)建一個新的鏡像。為此,首先需要創(chuàng)建一個dockerfile,包含一些如何創(chuàng)建鏡像的指令。新建一個目錄和一個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基本的語法是使用#來注釋FROM指令告訴docker 使用哪個鏡像作為基礎(chǔ)接著是維護者的信息RUN開頭的指令會在創(chuàng)建中運行,比如安裝一個軟件包,在這里使用apt 來安裝了一些軟件編寫完成Dockerfile后可以使用docker build來生成鏡像。$ 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標記來添加tag,指定新的鏡像的用戶信息。 “.”是Dockerfile所在的路徑(當前目錄),也可以替換為一個具體的Dockerfile的路徑。我們可以看到build進程在執(zhí)行操作。它要做的第一件事情就是上傳這個Dockerfile內(nèi)容,因為所有的操作都要依據(jù)Dockerfile來進行。 然后,dockfile中的指令被一條一條的執(zhí)行。每一步都創(chuàng)建了一個新的容器,在容器中執(zhí)行指令并提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執(zhí)行完畢之后,返回了

30、最終的鏡像 id。所有的中間步驟所產(chǎn)生的容器都被刪除和了。*注意一個鏡像不能超過127層此外,還可以利用ADD命令容器啟動后運行的程序等。例如本地文件到鏡像;用EXPOSE命令來向外部開放端口;用CMD命令來描述# 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)建的鏡像來啟動一個容器。$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root8196968dac35:/#還可以用 docker tag 命令來修改鏡像的。$ 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*注:用法,請參考dockerfile章節(jié)。從本地文件系統(tǒng)導入要從本地文件系統(tǒng)導入一個鏡像,可以使用openvz(容器虛擬化的先鋒技術(shù))的模板來創(chuàng)建: openvz的模板地址為。比如:先了一個ubuntu14.04的鏡像,之后使用以下命令導入:sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:1

33、4.04然后查看新導入的鏡像。docker images REPOSITORYubuntuTAG 14.04IMAGE ID05ac7c0b9383CREATED17 seconds agoVIRTUAL SIZE215.5 MB上傳鏡像用戶可以通過 docker push 命令,把自己創(chuàng)建的鏡像上傳到倉庫中來共享。例如,用戶在Docker Hub上完成后,可以推送自己的鏡像到倉庫中。$ sudo docker push ouruser/sinatraThe push refers to a repository ouruser/sinatra (len: 1) Sending image l

34、istPushing repository ouruser/sinatra (3 tags)存出和載入鏡像存出鏡像如果要導出鏡像到本地文件,可以使用 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 從導出的本地文件中再導入到本地鏡像庫,例如$ sudo docker

35、load -input ubuntu_14.04.tar或$ sudo docker load < ubuntu_14.04.tar這將導入鏡像以及其相關(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 刪掉依賴于這個鏡像的所有容器。鏡像的實現(xiàn)原理Docker鏡像是怎么實現(xiàn)增量的修改和維護的? 每個鏡像都由很多層次不同的層結(jié)合到一個鏡像中去。,Docker使用 Union FS 將這些通常Union FS有兩個用途, 一方面可以實現(xiàn)不借助 LVM、RAID 將多個disk掛

37、到同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支在一起,Live CD正是基于此方法可以在鏡像不變的基礎(chǔ)上用戶在其上進行一些寫操作。 Docker在AUFS上構(gòu)建的容器也是利用了類似的原理。Docker容器容器是Docker又一概念。簡單的說,容器是運行的一個或一組應(yīng)用,以及它們的運行態(tài)環(huán)境。對應(yīng)的,虛擬機可以理解為模擬運行的一整套操作系統(tǒng)(提供了運行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用。本章將具體介紹如何來管理一個容器,包括創(chuàng)建、啟動和停止等。啟動容器啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止狀態(tài)(stopped)的容器重新啟動。因為Dock

38、er的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創(chuàng)建容器。新建并啟動所需要令主要為 docker run 。例如,下面令輸出一個"Hello World",之后終止容器。$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world這跟在本地直接執(zhí)行 /bin/echo 'hello world' 幾乎感覺不出任何區(qū)別。下面令則啟動一個bash終端,可以讓用戶進行交互。$ sudo docker run -t -i ubuntu:14.04 /bin/bash roo

39、taf8bae53bdd3:/#其中, -t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上,入保持打開。-i 則讓容器的標準輸在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令,例如rootaf8bae53bdd3:/# pwd/rootaf8bae53bdd3:/# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var當利用 docker run 來創(chuàng)建容器時,Docker在運行的標準操作包括:檢查本地是否存在指定的鏡像,不存在就從公有倉庫

40、利用鏡像創(chuàng)建并啟動一個容器分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去 從地址池配置一個ip地址給容器執(zhí)行用戶指定的應(yīng)用程序執(zhí)行完畢后容器被終止啟動已終止容器可以利用 docker start 命令,直接將一個已經(jīng)終止的容器啟動運行。容器的為所執(zhí)行的應(yīng)用程序,所需要的都是應(yīng)用程序運行所必需的。除此之外,并沒有其它的資源??梢栽趥谓K端中利用 ps 或 top 來查看進程信息。rootba267838cc1b:/# psPID TTY 1 ?11 ?TIME CMD00:00:00 bash00:00:00 ps可見,容器中僅運行了指定

41、的bash應(yīng)用。這種特點使得Docker對虛擬化。的利用率極高,是貨真價實的輕量級守護態(tài)運行的時候,需要讓Docker容器在來實現(xiàn)。以守護態(tài)(Daemonized)形式運行。此時,可以通過添加 -d 參數(shù)例如下面令會在運行容器。$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147容器啟動后會返回一個唯一的id,也可

42、以通過 docker ps 命令來查看容器信息。$ sudo docker ps CONTAINER ID IMAGECOMMANDCREATEDSTATUSPORTS NAMES1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minuteinsane_babbage要獲取容器的輸出信息,可以通過 docker logs 命令。$ sudo docker logs insane_babbage hello worldhello world hello world. . .終止容器可以使用 docker

43、stop 來終止一個運行中的容器。此外,當Docker容器中指定的應(yīng)用終結(jié)時,容器也自動終止。 例如對于上一章節(jié)中只啟動了一個終端的容器,用戶通過 exit 命令或 Ctrl+d 來終端時,所創(chuàng)建的容器立刻終止。終止狀態(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處于終止狀態(tài)的容器,可以通過 docker start 命令來重新啟動。此外, docker restart 命令會將一個運行態(tài)的容器終止,然后再重新啟動它。進入容器在使用 -d 參數(shù)時,容器啟動后會進入。 某些時候需要進入容器進行操作,有很多種方法,包括使用 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 命令有時候并不方多個窗口同時attach到同一個容器

46、的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執(zhí)行操作了。nsenter命令安裝nsenter 工具在util-linux包2.23版本后包含。 如果系統(tǒng)中util-linux包沒有該命令,可以按照下面的方法從源碼安裝。$ cd /tmp; curl$ ./configure -without-ncurses$ make nsenter && sudo cp nsenter /usr/local/bin| tar -zxf-; cd u使用nsenter 可以另一個進程的名字空間。nsenter要正常工作需要有root權(quán)限。 很不幸,Ubuntu 14.4

47、仍然使用的是util-linux版本2.20。安裝最新版本的util-linux(2.24)版,請按照以下步驟:$ wget$ cd util-linux-2.24$ ./configure -without-ncurses && make nsenter$ sudo cp nsenter /usr/local/bin; tar xzvf util-linux-2.24為了連接到容器,你還需要找到容器的第一個進程的PID,可以通過下面令獲取。PID=$(docker inspect -format " .State.Pid " <container&g

48、t;)通過這個PID,就可以連接到這個容器:$ nsenter -target $PID -mount -uts -ipc -net -pid下面給出一個完整的例子。$ 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中。更簡單的,建議大家$ wget -P $ echo " -f /.bashrc_docker && . /.bashrc_docker" >> /.bashrc; source /.bashrc;這個文件中定義了很多方便使用Docker令,例如 d

50、ocker-pid 可以獲取某個容器的PID;而 docker-enter 可以進入容器或直接在容器內(nèi)執(zhí)行命令。$ echo $(docker-pid <container>)$ docker-enter <container> ls導出和導入容器導出容器如果要導出本地某個容器,可以使用 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這樣將導出容器快照到本地文件。導入容器快照可以使用 docker import 從容器快照文件中再導入為鏡像,例如$ 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、過指定URL或者某個目錄來導入,例如$sudo docker importexample/imagerepo*注:用戶既可以使用 docker load 來導入鏡像文件到本地鏡像庫,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史和元數(shù)據(jù)信息(即僅保存容器當時的快照狀態(tài)),而鏡像文件將保存完整,體積也要大。此外,從容器快照文件導入時可以重新指定等元數(shù)據(jù)信息。刪除容器可以使用 docker rm 來刪除一個處于終止狀態(tài)的容器。 例如$sudo docker rm trusting_newton trusting_newton如果

53、要刪除一個運行中的容器,可以添加 -f 參數(shù)。Docker會SIGKILL信號給容器。倉庫倉庫(Repository)是集中存放鏡像的地方。一個容易的概念是服務(wù)器(Registry)。實際上服務(wù)器是管理倉庫的具體服務(wù)器,每個服務(wù)器上可以有多個倉庫,而每個倉庫下面有多個鏡像。從這方面來說,倉庫可以被認為是一個具體的項目或目錄。例如對于倉庫地址 來說, 是址, ubuntu 是倉庫名。服務(wù)器地大部分時候,并不嚴格區(qū)分這兩者的概念。Docker Hub目前Docker維護了一個公共倉庫-Docker Hub,其中已經(jīng)包括了超過15,000的鏡像。大部分用戶的需求,都可以通過在Docker Hub中直

54、接鏡像來實現(xiàn)。登錄可以通過執(zhí)行 docker login 命令來輸入用戶名、錄的 .dockercfg 中將保存用戶的認證信息。和郵箱來完成和登錄。后,本地用戶目基本操作用戶無需登錄即可通過 docker search 命令來查找到本地。倉庫中的鏡像,并利用 docker pull 命令來將它例如以centos為進行搜索:$ 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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論