Docker入門-學(xué)會(huì)部署項(xiàng)目

一、概念

  • 鏡像image:鏡像是靜態(tài)的,可被用戶相互分享的文件魁索,對(duì)外是一個(gè)統(tǒng)一的文件系統(tǒng),你不能對(duì)他操作盼铁,只能pull別人的鏡像或者push自己的鏡像粗蔚,可用來(lái)創(chuàng)建Docker容器。
    鏡像是一種文件結(jié)構(gòu)饶火。Dockerfile中的每條命令都會(huì)在文件系統(tǒng)中創(chuàng)建一個(gè)新的層次結(jié)構(gòu)鹏控,文件系統(tǒng)在這些層次上構(gòu)建起來(lái)致扯,鏡像就構(gòu)建于這些聯(lián)合的文件系統(tǒng)之上。

  • 容器container当辐,是動(dòng)態(tài)的環(huán)境抖僵,是鏡像創(chuàng)建的運(yùn)行實(shí)例,這容器裝的就是我們部署的應(yīng)用在運(yùn)行缘揪,可被啟動(dòng)耍群,停止,刪除找筝,重啟蹈垢,可理解為宿主機(jī)上的一個(gè)運(yùn)行的進(jìn)程,只不過(guò)由于docker幫我們包裝了這個(gè)進(jìn)程袖裕,給這個(gè)進(jìn)程加一個(gè)可運(yùn)行的微linux環(huán)境曹抬。

  • 倉(cāng)庫(kù)(Repository):Docker中的倉(cāng)庫(kù)很像git的代碼倉(cāng)庫(kù),集中存放鏡像文件的場(chǎng)所陆赋,保存我們的images沐祷,可以push 、pull 鏡像攒岛。

  • Dockerfile用來(lái)構(gòu)建鏡像的配置文件赖临,文件使用說(shuō)明:https://yeasy.gitbook.io/docker_practice/image/dockerfile/

研究鏡像與容器的關(guān)系:容器是一個(gè)動(dòng)態(tài)的環(huán)境,每一層鏡像中的文件屬于靜態(tài)內(nèi) 容灾锯,然而 Dockerfile 中的 ENV兢榨、VOLUME、CMD 等內(nèi)容最終都需要落實(shí)到容器的運(yùn)行環(huán)境中顺饮,而這些內(nèi)容均不可能直接坐落到每一層鏡像所包含的文件系統(tǒng)內(nèi)容中吵聪,那此時(shí)每一個(gè)Docker鏡像還會(huì)包含 json文件記錄與容器之間的關(guān)系。

因此兼雄,Docker鏡像的內(nèi)容主要包含兩個(gè)部分:第一吟逝,鏡像層文件內(nèi)容;第二赦肋,鏡像json文件块攒。

二、QA大集合

1佃乘、為啥要用容器囱井?

那么應(yīng)用容器長(zhǎng)什么樣子呢,一個(gè)做好的應(yīng)用容器長(zhǎng)得就好像一個(gè)裝好了一組特定應(yīng)用的虛擬機(jī)一樣趣避。比如我現(xiàn)在想用MySQL那我就找個(gè)裝好MySQL的容器庞呕,運(yùn)行起來(lái),那么我就可以使用 MySQL了。

那么我直接裝個(gè) MySQL不就好了住练,何必還需要這個(gè)容器這么詭異的概念地啰?話是這么說(shuō),可是你要真裝MySQL的話可能要再裝一堆依賴庫(kù)讲逛,根據(jù)你的操作系統(tǒng)平臺(tái)和版本進(jìn)行設(shè)置髓绽,有時(shí)候還要從源代碼編譯報(bào)出一堆莫名其妙的錯(cuò)誤,可不是這么好裝妆绞。而且萬(wàn)一你機(jī)器掛了,所有的東西都要重新來(lái)枫攀,可能還要把配置在重新弄一遍括饶。但是有了容器,你就相當(dāng)于有了一個(gè)可以運(yùn)行起來(lái)的虛擬機(jī)来涨,只要你能運(yùn)行容器图焰,MySQL的配置就全省了。而且一旦你想換臺(tái)機(jī)器蹦掐,直接把這個(gè)容器端起來(lái)技羔,再放到另一個(gè)機(jī)器就好了。硬件卧抗,操作系統(tǒng)藤滥,運(yùn)行環(huán)境什么的都不需要考慮了。

在公司中的一個(gè)很大的用途就是可以保證線下的開(kāi)發(fā)環(huán)境社裆、測(cè)試環(huán)境和線上的生產(chǎn)環(huán)境一致拙绊。當(dāng)年在 Baidu 經(jīng)常碰到這樣的事情,開(kāi)發(fā)把東西做好了給測(cè)試去測(cè)泳秀,一般會(huì)給一坨代碼和一個(gè)介紹上線步驟的上線單标沪。結(jié)果代碼在測(cè)試機(jī)跑不起來(lái),開(kāi)發(fā)就跑來(lái)跑去看問(wèn)題嗜傅,一會(huì)兒啊這個(gè)配置文件忘了提交了金句,一會(huì)兒啊這個(gè)上線命令寫(xiě)錯(cuò)了。找到了一個(gè) bug 提上去吕嘀,開(kāi)發(fā)一看违寞,啊我怎么又忘了把這個(gè)命令寫(xiě)在上線單上了。類似的事情在上線的時(shí)候還會(huì)發(fā)生币他,變成啊你這個(gè)軟件的版本和我機(jī)器上的不一樣……在 Amazon 的時(shí)候坞靶,由于一個(gè)開(kāi)發(fā)直接擔(dān)任上述三個(gè)職位,而且有一套自動(dòng)化部署的機(jī)制所以問(wèn)題會(huì)少一點(diǎn)蝴悉,但是上線的時(shí)候大家還是膽戰(zhàn)心驚彰阴。

若果利用容器的話,那么開(kāi)發(fā)直接在容器里開(kāi)發(fā)拍冠,提測(cè)的時(shí)候把整個(gè)容器給測(cè)試尿这,測(cè)好了把改動(dòng)改在容器里再上線就好了簇抵。通過(guò)容器,整個(gè)開(kāi)發(fā)射众、測(cè)試和生產(chǎn)環(huán)境可以保持高度的一致碟摆。

此外容器也和VM一樣具有著一定的隔離性,各個(gè)容器之間的數(shù)據(jù)和內(nèi)存空間相互隔離叨橱,可以保證一定的安全性典蜕。

2、那為啥不用VM罗洗?

容器相對(duì)于虛擬機(jī)的優(yōu)勢(shì):

  • 啟動(dòng)速度快愉舔,容器通常在一秒內(nèi)可啟動(dòng),VM通常要更久
  • 資源利用率高伙菜,一臺(tái)普通 PC 可以跑上千個(gè)容器轩缤,你跑上千個(gè) VM 試試
  • 性能開(kāi)銷小, VM 通常需要額外的 CPU 和內(nèi)存來(lái)完成 OS 的功能贩绕,這一部分占據(jù)了額外的資源火的。

設(shè)計(jì)理念的區(qū)別如下:

三、Docker 和虛擬機(jī)的區(qū)別淑倾、設(shè)計(jì)理念

容器馏鹤、虛擬機(jī)

這是docker官網(wǎng)的圖,可以看到:
虛擬化技術(shù)通過(guò)Hypervisor(虛擬機(jī)管理系統(tǒng))為每個(gè)app啟動(dòng)一個(gè)Guest OS(客戶機(jī)操作系統(tǒng))踊淳,也就是為每個(gè)app啟動(dòng)一個(gè)虛擬機(jī)
比較直觀地說(shuō),vm通過(guò)Hypervisor對(duì)硬件資源進(jìn)行虛擬化假瞬,而docker直接使用硬件資源,利用率上來(lái)看docker明顯更具有優(yōu)勢(shì)迂尝。

Docker 的容器利用了 LXC脱茉,管理利用了 namespaces 來(lái)做權(quán)限的控制和隔離, cgroups 來(lái)進(jìn)行資源的配置垄开,并且還通過(guò) aufs 來(lái)進(jìn)一步提高文件系統(tǒng)的資源利用率琴许。

其中的 aufs 是個(gè)很有意思的東西,是 UnionFS 的一種溉躲。他的思想和 git 有些類似榜田,可以把對(duì)文件系統(tǒng)的改動(dòng)當(dāng)成一次 commit 一層層的疊加。這樣的話多個(gè)容器之間就可以共享他們的文件系統(tǒng)層次锻梳,每個(gè)容器下面都是共享的文件系統(tǒng)層次箭券,上面再是各自對(duì)文件系統(tǒng)改動(dòng)的層次,這樣的話極大的節(jié)省了對(duì)存儲(chǔ)的需求疑枯,并且也能加速容器的啟動(dòng)辩块。

物理機(jī)、虛擬機(jī)

容器,多個(gè)容器之間公用一套操作系統(tǒng)資源

舉個(gè)簡(jiǎn)單例子废亭。一個(gè)房子比較大国章,假如租戶一起住,大家一起住難免有束縛感,也不太方便豆村。那么房東把房子改造一下液兽,房子用可拆裝的墻板隔離開(kāi)來(lái),分為許多的小房間掌动,每個(gè)人住在自己的小房間四啰。小房間麻雀雖小,五張俱全,你可以自己布置自己的房間粗恢。每個(gè)租客在自己的"小房間"里面可以做自己的事情拟逮,從而也不會(huì)打擾到其他人。但是他們都是共享這個(gè)房子的水費(fèi)适滓,電費(fèi),網(wǎng)費(fèi)等公共資源(每個(gè)docker容器(也就是進(jìn)程)依賴的是宿主機(jī)的資源)恋追。 聰明的你會(huì)想到凭迹, 可拆裝的墻板隔音效果或安全性不夠(docker容器之間的隔離性比真實(shí)虛擬機(jī)要稍微弱), 會(huì)不會(huì)有壞人打個(gè)洞偷窺苦囱? 會(huì)不會(huì)有人監(jiān)聽(tīng)我在房間的一舉一動(dòng)? 可拆裝的墻板肯定是不比水泥墻(虛擬機(jī)隔離性)牢固.雖說(shuō)隔離性沒(méi)有虛擬機(jī)那么強(qiáng)嗅绸,但是目前為止docker還沒(méi)暴露出關(guān)于這方面的問(wèn)題,廣泛的社區(qū)以及大廠Google等公司都在使用撕彤,所以我們還是可以放心大膽使用的鱼鸠。 假如有一天房東要把房子賣了,只要把可拆裝的墻板移除羹铅,打掃一下蚀狰,回到原樣,不破壞房子原樣职员,就可以出售房子了(在容器中安裝的軟件麻蹋,程序等都不會(huì)污染到宿主機(jī)的環(huán)境,容器被刪除也就被刪除了)。

docker容器可以打包為鏡像文件(類似VM虛擬機(jī)的那些快照文件),遷移的時(shí)候我們只需要在新服務(wù)器上安裝docker,就能把之前打包好的鏡像文件導(dǎo)入到docker里面础米,運(yùn)行容器拇厢,就能實(shí)現(xiàn)訪問(wèn),不需要重新配置環(huán)境苞氮。


VM虛擬機(jī)
docker架構(gòu)圖

四、Docker命令

4.1 基礎(chǔ)命令

attach     進(jìn)入一個(gè)運(yùn)行的容器
build      從一個(gè)DockerFile構(gòu)建鏡像
commit     從容器創(chuàng)建一個(gè)鏡像
cp          從容器和主機(jī)文件系統(tǒng)之間拷貝文件
create      創(chuàng)建一個(gè)容器
diff        檢查容器文件系統(tǒng)上的更改
events      從服務(wù)器獲取實(shí)時(shí)事件
exec        在正在運(yùn)行的容器中運(yùn)行命令
export      將容器的文件系統(tǒng)導(dǎo)出為tar存檔
history     顯示鏡像的歷史記錄
images      查看鏡像列表
import      從歸檔文件中創(chuàng)建鏡像
info        顯示系統(tǒng)范圍的信息
inspect     返回Docker對(duì)象的低級(jí)信息
kill        kill運(yùn)行中的容器
load        從存檔或者STDIN加載鏡像
login       登陸docker鏡像倉(cāng)庫(kù)
logout      退出docker鏡像倉(cāng)庫(kù)
logs        獲取一個(gè)容器的日志
pause       暫停一個(gè)或多個(gè)容器中的所有進(jìn)程
port        查看端口映射或容器的特定映射列表
ps          查看容器列表
pull        從鏡像倉(cāng)庫(kù)拉取鏡像
push        將本地的鏡像上傳到鏡像倉(cāng)庫(kù),要先登陸到鏡像倉(cāng)庫(kù)
rename      重命名容器
restart     重啟容器
rm          刪除容器
rmi         刪除鏡像
run         創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令
save        將指定鏡像保存成 tar 歸檔文件
search      從Docker Hub搜索鏡像
start       啟動(dòng)容器
stats       實(shí)時(shí)顯示容器資源使用情況的統(tǒng)計(jì)信息
docker stats --no-stream  如果不加--no-stream參數(shù),會(huì)實(shí)時(shí)刷新顯示資源使用情況荔仁。加了,不會(huì)實(shí)時(shí)顯示
stop       停止容器
tag         標(biāo)記本地鏡像,將其歸入某一倉(cāng)庫(kù)
top         展示一個(gè)容器中運(yùn)行的進(jìn)程
unpause     恢復(fù)容器中所有的進(jìn)程
update      更新容器配置
version    顯示Docker的版本信息
wait        阻塞直到容器停止咕晋,然后打印退出代碼

4.2例子展示

1雹拄、下載鏡像

docker pull centos 

2、查看已經(jīng)下載的鏡像

[root@bigdatafat030161 ~]# docker images 
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
harbor.ppdaicorp.com/library/chatbotapi   v2                  e1a547ab7ef7        8 days ago          4.3 GB
harbor.ppdaicorp.com/library/chatbotapi   v1                  678de25a4f43        8 days ago          4.3 GB

3掌呜、運(yùn)行一個(gè)鏡像生成容器

docker run -d --name chatbotapi -e SIMPLE_ENV="test" -p 8000:8000 -v /etc/ppd:/etc/ppd harbor.ppdaicorp.com/library/chatbotapi:v2 
解析

4滓玖、查看運(yùn)行中的容器,查看所有容器质蕉,并顯示狀態(tài)

[root@bigdatafat030161 ~]# docker ps
CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
132743c12d5d        harbor.ppdaicorp.com/library/chatbotapi:v2   "/var/simple/entry..."   2 days ago          Up 2 days           0.0.0.0:8000->8000/tcp   chatbotapi
[root@bigdatafat030161 ~]# docker ps -a
CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS                  PORTS                    NAMES
132743c12d5d        harbor.ppdaicorp.com/library/chatbotapi:v2   "/var/simple/entry..."   2 days ago          Up 2 days               0.0.0.0:8000->8000/tcp   chatbotapi
c4a394b9aac3        harbor.ppdaicorp.com/library/chatbotapi:v2   "/var/simple/entry..."   8 days ago          Exited (2) 8 days ago                            condescending_albattani
0bb1a017e805        harbor.ppdaicorp.com/library/chatbotapi:v1   "/var/simple/entry..."   8 days ago          Exited (0) 8 days ago                            hungry_aryabhata

5势篡、從DockerFile創(chuàng)建鏡像

docker build -t myimage:v1 .

-t :指定鏡像名稱和標(biāo)簽,格式為'name:tag' .: 最后一個(gè)點(diǎn)代表當(dāng)前目錄模暗,也可以換成其它的路徑

五禁悠、構(gòu)建鏡像

構(gòu)建Docker鏡像有以下兩種方法:

  • 使用docker commit命令。不推薦
  • 使用docker build命令和 Dockerfile 文件兑宇。推薦

5.1創(chuàng)建Dockerfile文件

dockerfile文件詳解
https://www.cnblogs.com/jpfss/p/10947810.html
https://yeasy.gitbook.io/docker_practice/image/build

從剛才的 docker commit 的學(xué)習(xí)中碍侦,我們可以了解到,鏡像的定制實(shí)際上就是定制每一層所添加的配置隶糕、文件瓷产。如果我們可以把每一層修改、安裝枚驻、構(gòu)建濒旦、操作的命令都寫(xiě)入一個(gè)腳本,用這個(gè)腳本來(lái)構(gòu)建再登、定制鏡像尔邓,那么之前提及的無(wú)法重復(fù)的問(wèn)題、鏡像構(gòu)建透明性的問(wèn)題锉矢、體積的問(wèn)題就都會(huì)解決梯嗽。這個(gè)腳本就是 Dockerfile。
Dockerfile 是一個(gè)文本文件沽损,其內(nèi)包含了一條條的 指令(Instruction)慷荔,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容缠俺,就是描述該層應(yīng)當(dāng)如何構(gòu)建显晶。

下面將介紹如何通過(guò)Dockerfile的定義文件和docker build命令來(lái)構(gòu)建鏡像。

Dockerfile使用基本的基于DSL語(yǔ)法的指令來(lái)構(gòu)建一個(gè)Docker鏡像壹士,之后使用docker build命令基于該Dockerfile中的指令構(gòu)建一個(gè)新的鏡像磷雇。


image.png
# Version: 0.0.1
FROM ubuntu:latest
MAINTAINER Bourbon Tian "bourbon@1mcloud.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

Dockerfile由一系列指令和參數(shù)組成。每條指令都必須為大寫(xiě)字母躏救,切后面要跟隨一個(gè)參數(shù)唯笙。Dockerfile中的指令會(huì)按照順序從上到下執(zhí)行螟蒸,所以應(yīng)該根據(jù)需要合理安排指令的順序。每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層并對(duì)鏡像進(jìn)行提交崩掘。Docker大體上按照如下流程執(zhí)行Dockerfile中的指令七嫌。

  • Docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器。
  • 執(zhí)行第一條指令苞慢,對(duì)容器進(jìn)行修改诵原。
  • 執(zhí)行類似docker commit的操作,提交一個(gè)新的鏡像層挽放。
  • Docker再基于剛提交的鏡像運(yùn)行一個(gè)新的容器绍赛。
  • 執(zhí)行Dockerfile中的下一條命令,直到所有指令都執(zhí)行完畢辑畦。

FROM:

每個(gè)Dockerfile的第一條指令都應(yīng)該是FROM吗蚌。FROM指令指定一個(gè)已經(jīng)存在的鏡像,后續(xù)指令都是將基于該鏡像進(jìn)行纯出,這個(gè)鏡像被稱為基礎(chǔ)鏡像(base iamge)蚯妇。在這里ubuntu:latest就是作為新鏡像的基礎(chǔ)鏡像。也就是說(shuō)Dockerfile構(gòu)建的新鏡像將以u(píng)buntu:latest操作系統(tǒng)為基礎(chǔ)暂筝。在運(yùn)行一個(gè)容器時(shí)侮措,必須要指明是基于哪個(gè)基礎(chǔ)鏡像在進(jìn)行構(gòu)建。

RUN:

在這些命令之后乖杠,我們指定了三條RUN指令。RUN指令會(huì)在當(dāng)前鏡像中運(yùn)行指定的命令澄成。這里我們通過(guò)RUN指令更新了APT倉(cāng)庫(kù)胧洒,安裝nginx包,并創(chuàng)建了一個(gè)index.html文件墨状。像前面說(shuō)的那樣卫漫,每條RUN指令都會(huì)創(chuàng)建一個(gè)新的鏡像層,如果該指令執(zhí)行成功肾砂,就會(huì)將此鏡像層提交列赎,之后繼續(xù)執(zhí)行Dockerfile中的下一個(gè)指令。

默認(rèn)情況下镐确,RUN指令會(huì)在shell里使用命令包裝器/bin/sh -c 來(lái)執(zhí)行包吝。如果是在一個(gè)不支持shell的平臺(tái)上運(yùn)行或者不希望在shell中運(yùn)行(比如避免shell字符串篡改),也可以使用exec格式的RUN指令源葫,通過(guò)一個(gè)數(shù)組的方式指定要運(yùn)行的命令和傳遞給該命令的每個(gè)參數(shù):

EXPOSE:

EXPOSE指令是告訴Docker該容器內(nèi)的應(yīng)用程序?qū)?huì)使用容器的指定端口诗越。這并不意味著可以自動(dòng)訪問(wèn)任意容器運(yùn)行中服務(wù)的端口。出于安全的原因息堂,Docker并不會(huì)自動(dòng)打開(kāi)該端口嚷狞,而是需要你在使用docker run運(yùn)行容器時(shí)來(lái)指定需要打開(kāi)哪些端口块促。

要將 EXPOSE 和在運(yùn)行時(shí)使用 -p <宿主端口>:<容器端口> 區(qū)分開(kāi)來(lái)。-p床未,是映射宿主端口和容器端口竭翠,換句話說(shuō),就是將容器的對(duì)應(yīng)端口服務(wù)公開(kāi)給外界訪問(wèn)薇搁,而 EXPOSE 僅僅是聲明容器打算使用什么端口而已斋扰,并不會(huì)自動(dòng)在宿主進(jìn)行端口映射

5.2基于Dockerfile構(gòu)建新鏡像

執(zhí)行docker build命令時(shí),Dockerfile中的所有指令都會(huì)被執(zhí)行并且提交只酥,并且在該命令成功結(jié)束后返回一個(gè)新鏡像褥实。

# cd static_web
# docker build -t="test/static_web" .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
...
Successfully built 94728651ce15
  • -t選項(xiàng)為新鏡像設(shè)置了倉(cāng)庫(kù)和名稱,這里倉(cāng)庫(kù)為test裂允,鏡像名為static_web损离。建議為自己的鏡像設(shè)置合適的名字方便以后追蹤和管理
    也可以在構(gòu)建鏡像的過(guò)程當(dāng)中為鏡像設(shè)置一個(gè)標(biāo)簽:
# docker build -t="test/static_web:v1" .

上面命令中最后的“.”告訴Docker到當(dāng)前目錄中去找Dockerfile文件。也可以指定一個(gè)Git倉(cāng)庫(kù)地址來(lái)指定Dockerfile的位置绝编,這里Docker假設(shè)在Git倉(cāng)庫(kù)的根目錄下存在

docker build -t="test/static_web:v1" git@github.com:test/static_web

再回到docker build過(guò)程僻澎。可以看到構(gòu)建上下文已經(jīng)上傳到Docker守護(hù)進(jìn)程:

Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon

之后十饥,可以看到Dockerfile中的每條指令會(huì)被順序執(zhí)行窟勃,而作為構(gòu)建過(guò)程中最終結(jié)果,返回了新鏡像的ID逗堵,即94728651ce15秉氧。構(gòu)建的每一步及其對(duì)應(yīng)指令都會(huì)獨(dú)立運(yùn)行,并且在輸出最終鏡像ID之前蜒秤,Docker會(huì)提交每步的構(gòu)建結(jié)果汁咏。

5.2.1指令失敗時(shí)會(huì)怎樣?

假設(shè)我們將安裝的軟件包名字弄錯(cuò)作媚,比如寫(xiě)成ngin攘滩,再次運(yùn)行docker build:

# docker build -t="test/static_web" .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:latest
 ---> f5bb94a8fac4
Step 1 : MAINTAINER Bourbon Tian "bourbon@1mcloud.com"
 ---> Using cache
 ---> ce64f2e75a74
Step 2 : RUN apt-get update
 ---> Using cache
 ---> e98d2c152d1d
Step 3 : RUN apt-get install -y ngin
 ---> Running in 2f16c5f11250
Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package ngin
The command '/bin/sh -c apt-get install -y ngin' returned a non-zero code: 100

這時(shí)我們需要調(diào)試一下這次失敗,我們可以通過(guò)docker run命令來(lái)基于這次構(gòu)建到目前為止已經(jīng)成功的最后一步創(chuàng)建一個(gè)容器纸泡,這里它的ID是e98d2c152d1d(上面step2的結(jié)果):

# docker run -t -i e98d2c152d1d /bin/bash
root@55aee4322f77:/# apt-get install -y ngin
Reading package lists... Done
Building dependency tree      
Reading state information... Done
E: Unable to locate package ngin

再次運(yùn)行出錯(cuò)的指令apt-get install -y ngin漂问,發(fā)現(xiàn)這里沒(méi)有找到ngin包,我們執(zhí)行安裝nginx包時(shí)女揭,包命輸錯(cuò)了蚤假。這時(shí)退出容器使用正確的包名修改Dockerfile文件,之后再嘗試進(jìn)行構(gòu)建吧兔。

5.2.2查看新鏡像:

現(xiàn)在來(lái)看一下新構(gòu)建的鏡像勤哗,使用docker image命令,如果想深入探求鏡像如何構(gòu)建出來(lái)的掩驱,可以使用docker history命令看到新構(gòu)建的test/static_web鏡像的每一層芒划,以及創(chuàng)建這些層的Dockerfile指令冬竟。

# docker images test/static_web
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test/static_web     latest              94728651ce15        20 hours ago        212.1 MB
 
# docker history 94728651ce15
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
94728651ce15        20 hours ago        /bin/sh -c #(nop) EXPOSE 80/tcp                 0 B                
09e999b131f4        20 hours ago        /bin/sh -c echo 'Hi, I am in your container'    27 B               
4af2ef04fb91        20 hours ago        /bin/sh -c apt-get install -y nginx             56.52 MB           
e98d2c152d1d        20 hours ago        /bin/sh -c apt-get update                       38.29 MB     
...

5.3 從新鏡像啟動(dòng)容器

下面基于新構(gòu)建的鏡像啟動(dòng)一個(gè)新容器,來(lái)檢查之前的構(gòu)建工作是否一切正常:

docker run -d -p 80 --name static_web test/static_web nginx -g "daemon off;"
  • -p : 容器端口
    這將在Docker宿主機(jī)上隨機(jī)打開(kāi)一個(gè)端口民逼,這個(gè)端口會(huì)連接到容器中的80端口上泵殴。可以使用docker ps命令查看容器的端口分配情況
  • 這里也指定了需要在容器中運(yùn)行的命令:nginx -g "daemon off;"拼苍。這將以前臺(tái)運(yùn)行的方式啟動(dòng)Nginx笑诅,來(lái)作為我們的Web服務(wù)器。
# docker ps -l
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES
0b422bbcce10        test/static_web     "nginx -g 'daemon of   5 seconds ago       Up 5 seconds        0.0.0.0:32772->80/tcp   static_web

可看到疮鲫,宿主機(jī)中映射的端口吆你,即32772。當(dāng)然也可指定宿主機(jī)的端口 - p 9000:8000

項(xiàng)目實(shí)際的例子:


image.png
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# docker build -t="chatbot" .
Sending build context to Docker daemon 265.5 MB
Step 1/4 : ARG BASE
Please provide a source image with `from` prior to commit
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# vim 
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# vim Dockerfile 
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# docker build -t="chatbot" .
Sending build context to Docker daemon 265.5 MB
Step 1/3 : FROM harbor.ppdaicorp.com/library/chatbotapi:v2
 ---> e1a547ab7ef7
Step 2/3 : EXPOSE 8000
 ---> Running in 0349269dd51d
 ---> d4f5f001450b
Removing intermediate container 0349269dd51d
Step 3/3 : CMD uwsgi --http :8000 --chdir $PWD --module wsgi -p 2 --master --max-request=50000 --harakiri=20 --listen=100  --disable-logging --enable-threads
 ---> Running in e0c9d5e21b5a
 ---> db0336818336
Removing intermediate container e0c9d5e21b5a
Successfully built db0336818336
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
chatbot                                   latest              db0336818336        17 seconds ago      4.3 GB
harbor.ppdaicorp.com/library/chatbotapi   v2                  e1a547ab7ef7        8 days ago          4.3 GB
harbor.ppdaicorp.com/library/chatbotapi   v1                  678de25a4f43        8 days ago          4.3 GB
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# 
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# 
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# 
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# 
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# docker run -d --name chatbotapi4 -e SIMPLE_ENV="test" -p 8001:8000 -v /etc/ppd:/etc/ppd chatbot 122af44829cdeb2fdeade5c2fe21f102403a29c02a69cd743c2fae924e7f1d15
[root@bigdatafat030161 chatbotapi-master-f94211c0795c6828e06a3e7fbb751fa624b89633]# docker ps
CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
122af44829cd        chatbot                                      "/var/simple/entry..."   5 seconds ago       Up 3 seconds        0.0.0.0:8001->8000/tcp   chatbotapi4
73e61ad876e3        harbor.ppdaicorp.com/library/chatbotapi:v2   "/var/simple/entry..."   35 minutes ago      Up 35 minutes       0.0.0.0:1025->8000/tcp   chatbotapi3
a341f06d6d42        harbor.ppdaicorp.com/library/chatbotapi:v2   "/var/simple/entry..."   36 minutes ago      Up 36 minutes       0.0.0.0:9000->8000/tcp   chatbotapi2
132743c12d5d        harbor.ppdaicorp.com/library/chatbotapi:v2   "/var/simple/entry..."   2 days ago          Up 2 days           0.0.0.0:8000->8000/tcp   chatbotapi

六俊犯、Dockerfile妇多、Docker鏡像和Docker容器的關(guān)系

Dockerfile 是軟件的原材料,Docker 鏡像是軟件的交付品燕侠,而 Docker 容器則可以認(rèn)為是軟件的運(yùn)行態(tài)者祖。從應(yīng)用軟件的角度來(lái)看,Dockerfile绢彤、Docker 鏡像與 Docker 容器分別代表軟件的三個(gè)不同階段七问,Dockerfile 面向開(kāi)發(fā),Docker 鏡像成為交付標(biāo)準(zhǔn)茫舶,Docker 容器則涉及部署與運(yùn)維械巡,三者缺一不可,合力充當(dāng) Docker 體系的基石饶氏。

簡(jiǎn)單來(lái)講讥耗,Dockerfile構(gòu)建出Docker鏡像,通過(guò)Docker鏡像運(yùn)行Docker容器嚷往。

我們假設(shè)這個(gè)容器的鏡像通過(guò)以下Dockerfile構(gòu)建而得:

FROM ubuntu:14.04  
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]  

6.1 Dockerfile與Docker鏡像

FROM ubuntu:14.04:設(shè)置基礎(chǔ)鏡像,此時(shí)會(huì)使用基礎(chǔ)鏡像 ubuntu:14.04 的所有鏡像層柠衅,為簡(jiǎn)單起見(jiàn)皮仁,圖中將其作為一個(gè)整體展示。

ADD run.sh /:將 Dockerfile 所在目錄的文件 run.sh 加至鏡像的根目錄菲宴,此時(shí)新一層的鏡像只有一項(xiàng)內(nèi)容贷祈,即根目錄下的 run.sh。

VOLUME /data:設(shè)定鏡像的 VOLUME喝峦,此 VOLUME 在容器內(nèi)部的路徑為 /data势誊。需要注意的是,此時(shí)并未在新一層的鏡像中添加任何文件谣蠢,即構(gòu)建出的磁層鏡像中文件為空粟耻,但更新了鏡像的 json 文件查近,以便通過(guò)此鏡像啟動(dòng)容器時(shí)獲取這方面的信息。

CMD ["./run.sh"]:設(shè)置鏡像的默認(rèn)執(zhí)行入口挤忙,此命令同樣不會(huì)在新建鏡像中添加任何文件霜威,僅僅在上一層鏡像 json 文件的基礎(chǔ)上更新新建鏡像的 json 文件。

因此册烈,通過(guò)以上分析戈泼,以上的Dockerfile可以構(gòu)建出一個(gè)新的鏡像,包含4個(gè)鏡像層赏僧,每一條命令會(huì)和一個(gè)鏡像層對(duì)應(yīng)大猛,鏡像之間會(huì)存在父子關(guān)系

6.2 Docker鏡像與Docker容器的關(guān)系

Docker鏡像是Docker容器運(yùn)行的基礎(chǔ),沒(méi)有Docker鏡像淀零,就不可能有Docker容器
可以理解的是:Docker鏡像畢竟是鏡像挽绩,屬于靜態(tài)的內(nèi)容;而Docker容器就不一樣了窑滞,容器屬于動(dòng)態(tài)的內(nèi)容琼牧。動(dòng)態(tài)的內(nèi)容,大家很容易聯(lián)想到進(jìn)程哀卫,內(nèi)存巨坊,CPU等之類的東西。的確此改,Docker容器作為動(dòng)態(tài)的內(nèi)容趾撵,都會(huì)包含這些。

為了便于理解共啃,大家可以把Docker容器占调,理解為一個(gè)或多個(gè)運(yùn)行進(jìn)程,而這些運(yùn)行進(jìn)程將占有相應(yīng)的內(nèi)存移剪,相應(yīng)的CPU計(jì)算資源究珊,相應(yīng)的虛擬網(wǎng)絡(luò)設(shè)備以及相應(yīng)的文件系統(tǒng)資源。而Docker容器所占用的文件系統(tǒng)資源纵苛,則通過(guò)Docker鏡像的鏡像層文件來(lái)提供剿涮。
那么作為靜態(tài)的鏡像,如何才有能力轉(zhuǎn)化為一個(gè)動(dòng)態(tài)的Docker容器呢攻人?此時(shí)取试,我們可以想象:第一,轉(zhuǎn)化的依據(jù)是什么怀吻;第二瞬浓,由誰(shuí)來(lái)執(zhí)行這個(gè)轉(zhuǎn)化操作。

其實(shí)蓬坡,轉(zhuǎn)化的依據(jù)是每個(gè)鏡像的json文件猿棉,Docker可以通過(guò)解析Docker鏡像的json的文件磅叛,獲知應(yīng)該在這個(gè)鏡像之上運(yùn)行什么樣的進(jìn)程,應(yīng)該為進(jìn)程配置怎么樣的環(huán)境變量铺根,此時(shí)也就實(shí)現(xiàn)了靜態(tài)向動(dòng)態(tài)的轉(zhuǎn)變宪躯。

誰(shuí)來(lái)執(zhí)行這個(gè)轉(zhuǎn)化工作?答案是Docker守護(hù)進(jìn)程位迂。也許大家早就理解這樣一句 話:Docker容器實(shí)質(zhì)上就是一個(gè)或者多個(gè)進(jìn)程访雪,而容器的父進(jìn)程就是Docker守護(hù)進(jìn)程。這樣的掂林,轉(zhuǎn)化工作的執(zhí)行就不難理解了:Docker守護(hù)進(jìn)程 手握Docker鏡像的json文件臣缀,為容器配置相應(yīng)的環(huán)境,并真正運(yùn)行Docker鏡像所指定的進(jìn)程泻帮,完成Docker容器的真正創(chuàng)建精置。

Docker容器運(yùn)行起來(lái)之后,Docker鏡像json文件就失去作用了锣杂。此時(shí)Docker鏡像的絕大部分作用就是:為Docker容器提供一個(gè)文件系統(tǒng)的視角脂倦,供容器內(nèi)部的進(jìn)程訪問(wèn)文件資源。

七元莫、安裝docker

7.1赖阻、準(zhǔn)備工作

7.1.1 系統(tǒng)要求

Docker 支持 64 位版本 CentOS 7/8,并且要求內(nèi)核版本不低于 3.10踱蠢。 CentOS 7 滿足最低內(nèi)核的要求火欧,但由于內(nèi)核版本比較低,部分功能(如 overlay2 存儲(chǔ)層驅(qū)動(dòng))無(wú)法使用茎截,并且部分功能可能不太穩(wěn)定苇侵。

7.1.2 卸載舊版本

舊版本的 Docker 稱為 docker 或者 docker-engine,使用以下命令卸載舊版本:
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine

7.2 使用yum安裝

yum install docker
service docker start 
docker ps 
service stop docker
systemctl restart docker
docker version

查看是否安裝成功

[root@bigdatafat030178 ~]# docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
2db29710123e: Pull complete 
Digest: sha256:97a379f4f88575512824f3b352bc03cd75e239179eea0fecc38e597b2209f49a
Status: Downloaded newer image for docker.io/hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

服務(wù)器之間移動(dòng)文件

scp -r -p 23245 dingshuai@10.114.26.81:/etc/ppd /etc/ppd
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末企锌,一起剝皮案震驚了整個(gè)濱河市榆浓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撕攒,老刑警劉巖陡鹃,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異打却,居然都是意外死亡杉适,警方通過(guò)查閱死者的電腦和手機(jī)谎倔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門柳击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人片习,你說(shuō)我怎么就攤上這事捌肴〉虐龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵状知,是天一觀的道長(zhǎng)秽五。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饥悴,這世上最難降的妖魔是什么坦喘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮西设,結(jié)果婚禮上瓣铣,老公的妹妹穿的比我還像新娘。我一直安慰自己贷揽,他們只是感情好棠笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著禽绪,像睡著了一般蓖救。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上印屁,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天循捺,我揣著相機(jī)與錄音,去河邊找鬼库车。 笑死巨柒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柠衍。 我是一名探鬼主播洋满,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼珍坊!你這毒婦竟也來(lái)了牺勾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阵漏,失蹤者是張志新(化名)和其女友劉穎驻民,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體履怯,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡回还,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叹洲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柠硕。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝗柔,到底是詐尸還是另有隱情闻葵,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布癣丧,位于F島的核電站槽畔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胁编。R本人自食惡果不足惜厢钧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嬉橙。 院中可真熱鬧坏快,春花似錦、人聲如沸憎夷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拾给。三九已至祥得,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒋得,已是汗流浹背级及。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留额衙,地道東北人饮焦。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窍侧,于是被迫代替她去往敵國(guó)和親县踢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351