docker 學習筆記

什么是容器

容器是一種輕量級,可移植坦辟、自包含的軟件的打包技術,使應用程序可以在幾乎任何地方以相同的方式運行章办。
容器由以下兩部分組成

  • 應用程序本身
  • 依賴:應用程序需要的庫或者其他軟件容器在host操作系統(tǒng)的用戶空間中運行與操作系統(tǒng)中的其他進程隔離

虛擬機與docker的比較:


虛擬機與docker的比較

為什么需要容器

容器使軟件具備了超強的可移植能力
采用集裝箱的思想為代碼提供一個基于容器的標準化運輸系統(tǒng)锉走。docker可以將任何應用及其依賴打包成一個輕量級、可移植藕届,自包含的容器挪蹭,容器幾乎可以運行在所有的操作系統(tǒng)上
集裝箱和容器的對比


集裝箱和容器的對比

容器的優(yōu)勢

對開發(fā)人員:build once,runAnywhere
對運維人員:configure once runAnything(只需要配置好標準的runtime環(huán)境休偶,就可以運行任何容器梁厉,容器消除了開發(fā)词顾、測試窍蓝、生產(chǎn)環(huán)境的不一致)

容器的架構

docker 架構

  • docker的核心組件
    Docker 客戶端:client
    Docker 服務端:docker daemon
    Docker鏡像:image
    Registry
    Docker 容器:Container
  • 架構圖:


    Docker 架構圖

    docker采用client/service 架構,客戶端向服務端發(fā)送請求亲茅,服務器負責構建验残、運行氨鹏、分發(fā)容器。客戶的和服務端可以在同一個Host上運行纪挎,也可以通過REST API和socket與遠程的服務器通信。

docker客戶端

最常用的是docker命令虎忌,通過docker命令我們可以很方便的在Host上構建和運行容器

docker服務端

Docker Daemon是服務器組件礁竞,運行在docker host上,負責創(chuàng)建、運行
監(jiān)控容器唾琼、構建芜茵,存儲鏡像肘交。
默認配置只能響應來自本地Host的客戶端請求,允許遠程訪問需要打開tcp監(jiān)聽:
編輯配置文件/etc/systemd/system/multi-user.target.wants/docker.service,環(huán)境變量ExecStart后添加-H tcp://0.0.0.0,允許來自任意ip的客戶端連接
重啟docker容器:
systemctl daemon-reload
systemctl restart docker.service
與遠程服務器通信
docker -H ip [docker命令]

Docker 鏡像

可將docker鏡像看做只讀模板填帽,通過它可以創(chuàng)建Docker容器
鏡像有多種生成方式
重無到有的創(chuàng)建鏡像杨伙、下載別人制作好的鏡像贮庞、在現(xiàn)有的鏡像上創(chuàng)建新的鏡像。將鏡像的創(chuàng)建過程和內容寫在一個描述文件中脯丝,這個文件被稱為Dockerfile实幕,通過執(zhí)行docker build <Dockerfile>來創(chuàng)建鏡像。

docker容器

就是鏡像的運行實例欲诺,鏡像就像是docker的構建打包階段,而容器則是啟動和運行階段

Registry

是存放鏡像的倉庫
docker pull 可以從Registry上下載鏡像
docker run則是先下載鏡像蓬推,然后再啟動容器

Docker 鏡像

鏡像的內部結構

從hello-world說起

  • 從docker hub下載它
    docker pull hello-world
    下載hello-world
  • docker images | grep 容器名 查看它
    Screen Shot 2018-04-26 at 11.31.48 PM.png
  • 通過docker run hello-world來運行他
    docker run

基礎鏡像

基礎鏡像通常是指其他進行可以基于此鏡像進行擴展的鏡像或者從scratch(0)開始構建
比如centos鏡像


centos

該鏡像才199MB妆棒,該鏡像有Linux的用戶空間和內核空間組成,比我們的centos系統(tǒng)小很多
centos鏡像的Dockerfile

FROM scratch
ADD centos-7-docker.tar.xz /
CMD['bin/bash']

第二行的ADD指令是添加centos的tar包,在制作鏡像時會自動將這個tar包解壓到 / 路徑糕珊,生成 /dev,/bin等目錄动分,可以在docker hub查看dockerfile文件描述

docker的分層結構

Docker可以通過擴展現(xiàn)有的鏡像創(chuàng)建新的鏡像
例如:

FROM debian
RUN apt-get emacs
RUN apt-get install tomcat 
CMD['/bin/bash']

過程如下:
直接在debian基礎鏡像進行構建
安裝emacs
安裝tomcat
容器啟動時執(zhí)行bash
構建過程


構建過程

新的鏡像就這一層層疊加生成,采用這種疊加最大的好處就是共享資源红选,當有多個鏡像從同一個基礎鏡像構建出來時澜公,磁盤上僅保留一份基礎鏡像即可。
當多個容器鏡像修改了同一個基礎鏡像內容時喇肋,基礎鏡像內容并不會被改變坟乾。

容器的copyOnWrite特性

當容器啟動時一個新的容器可寫層被加載到鏡像的頂層,這一層被稱作可寫層蝶防,該層下面的叫做鏡像層甚侣,所有對容器的改動都只發(fā)生在容器層,鏡像層只是可讀的慧脱,在鏡像層中用戶看到的是一個疊加后的文件系統(tǒng)渺绒,上層會覆蓋下層。
添加文件: 在容器中創(chuàng)建文件時菱鸥,新的文件會被添加到容器層宗兼。
讀取文件:在容器中讀取某個文件時 ,Docker會從上往下依次在各個容器層中查找氮采,一旦找到就打開讀入內存殷绍。
修改文件:在容器中修改已經(jīng)存在的文件,會先從上往下依次尋找鹊漠,找到后復制到容器層主到,然后修改。
刪除文件:從上往下查找躯概,找到后在容器中記錄該刪除操作登钥。
只有修改時才會發(fā)生CopyOnWrite。

構建鏡像

通常有很多的鏡像可以直接用別人制作好的娶靡,比如數(shù)據(jù)庫牧牢,web服務器等,只有當我們找不到相關的鏡像姿锭,或者想在某個鏡像基礎上加入特定的功能時才需要我們去制作鏡像塔鳍。通常我們自己開發(fā)的軟件是需要制作鏡像的。
docker提供了兩種方式來制作鏡像呻此,docker commit和Dockerfile轮纫。

docker commit

通過三個步驟創(chuàng)建

  • 運行容器
  • 修改容器
  • 將容器保存為新的鏡像
    例如:
    1、運行容器并進入容器終端
docker run -it ubuntu

如圖焚鲜,先在本地查找鏡像掌唾,沒找到然后再下載


Screen Shot 2018-04-27 at 8.44.07 PM.png

2放前、對容器進行修改

apt-get update 

對apt-get進行更新


Screen Shot 2018-04-27 at 8.49.53 PM.png

3、退出容器

exit

4郑兴、blissful_bassi是系統(tǒng)分配的名字


Screen Shot 2018-04-27 at 9.00.04 PM.png

5犀斋、接下來將運行中的容器保存為新的鏡像

docker commit blissful_bassi new-ubuntu
ubuntu

6、查看new-ubuntu 的history,可以看見是一分鐘我們剛剛創(chuàng)建的

docker history new-ubuntu
new-ubuntu

綜上情连,這是通過手工創(chuàng)建的方式叽粹,僅在學習的時候用,在真實的項目中都是使用Dockerfile來進行創(chuàng)建的却舀,因為手工創(chuàng)建的方式容易出錯虫几。

使用Dockerfile創(chuàng)建

Dockerfile是一個文本文件,用來記錄鏡像的所有構建步驟
自定義如下Dockerfile

FROM ubuntu
RUN apt-get update
RUN apt-get install -y vim

然后運行

docker build -t new-ubuntu2 . 

輸入整個構建過程如下(截取部分)


Screen Shot 2018-04-27 at 10.38.37 PM.png

Screen Shot 2018-04-27 at 10.39.05 PM.png

使用docker history看構建過程


Screen Shot 2018-04-27 at 10.40.47 PM.png

鏡像的緩存特性

Docker會緩存已有的鏡像層挽拔,構建新的鏡像時辆脸,如果某鏡像層已經(jīng)存在則直接使用,無需重新創(chuàng)建(下載鏡像的時候也會使用)

Dockerfile的調試

  • 從基礎鏡像運行一個容器(1)
  • 執(zhí)行一條指令對容器進行修改(2)
  • 執(zhí)行docker commit 生成新的鏡像層(3)
  • docker再基于剛剛提交的鏡像運行一個新的容器(4)
    然后重復2-4步驟就可以找出問題

Dockerfile常用指令

  • FROM
    指定基礎鏡像
  • MAINTAINER
    設置鏡像的作者
  • COPY
    將文件從build context中復制到鏡像 COPY src dest
  • ADD
    從build context 復制文件到鏡像螃诅,不同的是啡氢,如果src是歸檔文件(tar,zip,tgz,xz等)术裸,那么文件會被自動解壓到dest
  • ENV
    環(huán)境變量 比如 ENV HE="HELLO WORLD"
    echo $HE 就會輸出HELLO WORLD
  • EXPOSE
    指定容器中的進程會監(jiān)聽某個端口倘是,docker可以將該端口暴露出來
  • VOLUME
    將文件或者目錄申明為VOLUME
  • WORKDIR
    為后面的RUN,CMD袭艺,ENTRYPOINT搀崭,ADD或COPY指令設置鏡像中的當前
    工作目錄
  • RUN
    在容器中運行指令的指令
  • CMD
    容器啟動時運行指定的命令,Dockerfile中可以有多個CMD命令但是只有最后一個生效猾编,CMD可以被docker run 之后的參數(shù)替換
  • ENTRYPOINT
    設置容器啟動時運行的命令瘤睹,Dockerfile 中可以有多個ENTRYPOINT 指令,CMD的參數(shù)或者docker run 之后的參數(shù)就會交給ENTRYPOINT
    RUN & CMD & ENTRYPOINT 區(qū)別
    RUN:執(zhí)行命令并創(chuàng)建新的容器層答倡。經(jīng)常用于安裝軟件包
    CMD:設置容器啟動后默認執(zhí)行的命令及其參數(shù)轰传,但CMD能被docker run后面的參數(shù)替換
    ENTRYPOINT 配置容器啟動時的命令

shell 和exec交互模式

shell <instruction><commond>
exec <instruction>["executable","param1","param2"],當指令執(zhí)行時會直接使用[] 里面的內容不會被shell解析,當使用CMD和ENTRYPOINT時推薦使用此種方式
使用RUN apt-get && apt-get install (避免分開使用瘪撇,保證apt-get是最新的)

常用命令

docker images 查看鏡像

Screen Shot 2018-04-26 at 11.22.50 PM.png

docker ps或者docker container ls 顯示正在運行的容器
Screen Shot 2018-04-26 at 11.24.00 PM.png

刪除鏡像

docker rmi imageId

持續(xù)更新中-----------------------------

筆記摘自《5分鐘玩轉docker容器技術》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末获茬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子设江,更是在濱河造成了極大的恐慌,老刑警劉巖攘轩,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叉存,死亡現(xiàn)場離奇詭異,居然都是意外死亡度帮,警方通過查閱死者的電腦和手機歼捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門稿存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞳秽,你說我怎么就攤上這事瓣履。” “怎么了练俐?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵袖迎,是天一觀的道長。 經(jīng)常有香客問我腺晾,道長燕锥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任悯蝉,我火速辦了婚禮归形,結果婚禮上,老公的妹妹穿的比我還像新娘鼻由。我一直安慰自己暇榴,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布蕉世。 她就那樣靜靜地躺著蔼紧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讨彼。 梳的紋絲不亂的頭發(fā)上歉井,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音哈误,去河邊找鬼哩至。 笑死,一個胖子當著我的面吹牛蜜自,可吹牛的內容都是我干的菩貌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼重荠,長吁一口氣:“原來是場噩夢啊……” “哼箭阶!你這毒婦竟也來了?” 一聲冷哼從身側響起戈鲁,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仇参,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后婆殿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诈乒,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年婆芦,在試婚紗的時候發(fā)現(xiàn)自己被綠了怕磨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂饥。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肠鲫,靈堂內的尸體忽然破棺而出员帮,到底是詐尸還是另有隱情,我是刑警寧澤导饲,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布捞高,位于F島的核電站,受9級特大地震影響帜消,放射性物質發(fā)生泄漏棠枉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一泡挺、第九天 我趴在偏房一處隱蔽的房頂上張望辈讶。 院中可真熱鬧,春花似錦娄猫、人聲如沸贱除。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月幌。三九已至,卻和暖如春悬蔽,著一層夾襖步出監(jiān)牢的瞬間扯躺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工蝎困, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留录语,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓禾乘,卻偏偏與公主長得像澎埠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子始藕,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容

  • 轉載自 http://blog.opskumu.com/docker.html 一蒲稳、Docker 簡介 Docke...
    極客圈閱讀 10,501評論 0 120
  • Docker學習筆記(一)Docker初體驗 什么是Docker Docker是一個虛擬環(huán)境容器,可以將開發(fā)環(huán)境、...
    陳豐堯閱讀 1,035評論 0 1
  • 簡介 容器與管理程序虛擬化有所不同伍派,管理程序虛擬化通過中間層將一臺或多臺獨立的機器虛擬運行于物理硬件之上江耀,而容器則...
    Gundy_閱讀 355評論 0 4
  • 微信紅包,支付寶紅包诉植,紅包太常見了祥国,太多人現(xiàn)了!人那么多做個廣告免費拿紅包怎么樣倍踪? 領個紅包按屏幕給的文字念一遍錄...
    yaokui閱讀 165評論 0 0
  • 配方:低粉系宫,雜糧粉,黃油建车,雞蛋扩借,糖粉。 上下火180度缤至,烤18分鐘潮罪。 感悟:加入雜糧粉后,口感明顯不如以前领斥,以后為...
    真崢閱讀 247評論 0 0