Docker 對(duì)象
- 鏡像
鏡像可以看做是一個(gè)根文件系統(tǒng)员凝,包含了操作系統(tǒng)迈嘹,應(yīng)用程序所需要的庫(kù)資源等 - 容器,
在鏡像的基礎(chǔ)上,加入可讀可寫層。在容器的所有操作都會(huì)寫入到最上層的可讀可寫層宴抚,每次刪除容器最上層的讀寫層就會(huì)被刪掉,所以這期間寫入得數(shù)據(jù)也一并刪掉了甫煞。如果想深入了解容器的分層原理可以學(xué)習(xí)下聯(lián)合文件系統(tǒng)菇曲。
docker event state
Dockerfile 用法
Dockerfile 是構(gòu)建鏡像的源代碼
docker可以自動(dòng)化的生成鏡像通過(guò)dockerfile,dockerfile是一個(gè)文本文件包含了用戶創(chuàng)建鏡像需要的所有指令。
常用指令
FROM
- FROM指定一個(gè)基礎(chǔ)鏡像抚吠, 一般情況下一個(gè)可用的 Dockerfile一定是 FROM 為第一個(gè)指令常潮。至于image則可以是任何合理存在的image鏡像。
COPY 復(fù)制
格式:
- COPY [--chown=<user>:<group>] <源路徑>... <目標(biāo)路徑>
- COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標(biāo)路徑>"]
COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置楷力。比如:
COPY a* /mydir/
COPY a?.txt /mydir/
目標(biāo)路徑不需要事先創(chuàng)建喊式,如果目錄不存在會(huì)在復(fù)制文件前先行創(chuàng)建缺失目錄。
使用 COPY 指令萧朝,源文件的各種元數(shù)據(jù)都會(huì)保留岔留。比如讀、寫检柬、執(zhí)行權(quán)限献联、文件變更時(shí)間等。
ADD 復(fù)制
- ADD相比于COPY支持tar文件和url路徑。
- tar 是本地文件里逆,將自動(dòng)展開為目錄进胯,類似于解壓,如果是url的tar文件則不自動(dòng)解壓
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
- ADD 將文件從路徑 <src> 復(fù)制添加到容器內(nèi)部路徑 <dest>运悲,dest必須寫成dest/龄减。
小結(jié)
COPY和ADD 復(fù)制目錄時(shí)有些特殊,對(duì)于目錄而言:只復(fù)制目錄中的內(nèi)容而不包含目錄自身
ADD go /usr/local/ 僅僅復(fù)制了go目錄里的內(nèi)容沒有復(fù)制目錄
ADD go /usr/local/go/ 復(fù)制go目錄
官方建議:如果需要解壓則用ADD,否則用COPY
WORKDIR
可以來(lái)指定工作目錄(或者稱為當(dāng)前目錄)班眯,以后各層的當(dāng)前目錄就被改為指定的目錄希停,如該目錄不存在,WORKDIR 會(huì)幫你建立目錄署隘。
ENV
定義容器的環(huán)境變量
格式有兩種:
- ENV <key> <value>
- ENV <key1>=<value1> <key2>=<value2>...
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
在dockerfile 可以通過(guò)$變量 調(diào)用
RUN
docker build創(chuàng)建鏡像時(shí)執(zhí)行一些指令
RUN <command> 由shell啟動(dòng)宠能,Linux默認(rèn)為/bin/sh -c
, id為1的進(jìn)程為bin shell磁餐,子進(jìn)程為command
RUN yum install -y wget &&\
mkdir /app
RUN 會(huì)增加中間層鏡像违崇,考慮到鏡像的大小盡量把所以有命令寫入到一個(gè)RUN命令下
CMD
- shell 格式:CMD <命令>
- exec 格式:CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
Docker 不是虛擬機(jī),容器就是進(jìn)程诊霹。既然是進(jìn)程羞延,那么在啟動(dòng)容器的時(shí)候,需要指定所運(yùn)行的程序及參數(shù)脾还。CMD 指令就是用于指定默認(rèn)的容器主進(jìn)程的啟動(dòng)命令的伴箩。
CMD /tools/start.sh
命令會(huì)自動(dòng)解釋成
CMD [ "sh", "-c", "/tools/start.sh" ]
ENTRYPOINT
- ENTRYPOINT的目的和 CMD 一樣,都是在指定容器啟動(dòng)程序及參數(shù)鄙漏。ENTRYPOINT 在運(yùn)行時(shí)也可以替代嗤谚,不過(guò)比 CMD 要略顯繁瑣,需要通過(guò) docker run 的參數(shù) --entrypoint 來(lái)指定怔蚌。
- 當(dāng)指定了 ENTRYPOINT 后巩步,CMD 的含義就發(fā)生了改變,不再是直接的運(yùn)行其命令桦踊,而是將 CMD 的內(nèi)容作為參數(shù)傳給 ENTRYPOINT 指令椅野,換句話說(shuō)實(shí)際執(zhí)行時(shí),將變?yōu)椋?/li>
<ENTRYPOINT> "<CMD>"
ENTRYPOINT指令和CMD指令雖然是在Dockerfile中定義籍胯,但是在構(gòu)建鏡像的時(shí)候并不會(huì)被執(zhí)行鳄橘,只有在執(zhí)行docker run命令啟動(dòng)容器時(shí)才會(huì)起作用。
ENTRYPOINT 使用場(chǎng)景:
docker run 啟動(dòng)容器時(shí)可以指定參數(shù)芒炼,指定的參數(shù)會(huì)作為entrypoint命令的參數(shù),而不會(huì)覆蓋啟動(dòng)命令术徊。
docker 常見命令
從當(dāng)前目錄的dockerfile創(chuàng)建容器
docker build -t tagName .指定dockerfile 創(chuàng)建容器
docker build -f path .刪除全部容器
docker rm $(docker ps -aq)刪除所有鏡像
docker rmi $(docker images -q)停止運(yùn)行中的容器
docker stop $(docker ps -q)啟動(dòng)一個(gè)bash終端,退出自動(dòng)刪除容器
docker run --rm -it imageID /bin/bash當(dāng)利用 docker run 來(lái)創(chuàng)建容器時(shí)本刽,Docker 在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉(cāng)庫(kù)下載
利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器,分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去
從地址池配置一個(gè) ip 地址給容器,執(zhí)行用戶指定的應(yīng)用程序
執(zhí)行完畢后容器被終止更多的時(shí)候子寓,需要讓 Docker 在后臺(tái)運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下暗挑。此時(shí),可以通過(guò)添加 -d 參數(shù)來(lái)實(shí)現(xiàn)
啟動(dòng)已終止的容器
docker container start進(jìn)入容器
docker exec -it containerID bash
如果從這個(gè) stdin 中 exit斜友,不會(huì)導(dǎo)致容器的停止炸裆。這就是為什么推薦大家使用 docker exec 的原因. 而不是attach
docker-compose 編排容器
docker compose 用于在單機(jī)上編排容器,便于管理多個(gè)容器鲜屏。
version: '3'
services:
web:
image: "ubuntu"
debian:
image: "debian"
上面例子是一個(gè)簡(jiǎn)單的compose.yml文件烹看,web和debian代表了連個(gè)容器,image代表鏡像洛史。
-docker-compose up -d 會(huì)在后臺(tái)創(chuàng)建容器