什么是容器
容器是一種輕量級,可移植坦辟、自包含的軟件的打包技術,使應用程序可以在幾乎任何地方以相同的方式運行章办。
容器由以下兩部分組成
- 應用程序本身
- 依賴:應用程序需要的庫或者其他軟件容器在host操作系統(tǒng)的用戶空間中運行與操作系統(tǒng)中的其他進程隔離
虛擬機與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鏡像
該鏡像才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
如圖焚鲜,先在本地查找鏡像掌唾,沒找到然后再下載
2放前、對容器進行修改
apt-get update
對apt-get進行更新
3、退出容器
exit
4郑兴、blissful_bassi是系統(tǒng)分配的名字
5犀斋、接下來將運行中的容器保存為新的鏡像
docker commit blissful_bassi new-ubuntu
6、查看new-ubuntu 的history,可以看見是一分鐘我們剛剛創(chuàng)建的
docker history 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 .
輸入整個構建過程如下(截取部分)
使用docker history看構建過程
鏡像的緩存特性
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
查看鏡像
docker ps
或者docker container ls
顯示正在運行的容器刪除鏡像
docker rmi imageId
持續(xù)更新中-----------------------------
筆記摘自《5分鐘玩轉docker容器技術》