Docker容器基礎(chǔ)

Docker 對(duì)象

  • 鏡像
    鏡像可以看做是一個(gè)根文件系統(tǒng),包含了操作系統(tǒng),應(yīng)用程序所需要的庫(kù)資源等
  • 容器,
    在鏡像的基礎(chǔ)上,加入可讀可寫(xiě)層。在容器的所有操作都會(huì)寫(xiě)入到最上層的可讀可寫(xiě)層,每次刪除容器最上層的讀寫(xiě)層就會(huì)被刪掉,所以這期間寫(xiě)入得數(shù)據(jù)也一并刪掉了。如果想深入了解容器的分層原理可以學(xué)習(xí)下聯(lián)合文件系統(tǒng)。

docker event state

1_vca4e-SjpzSL5H401p4LCg.png

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ì)保留。比如讀、寫(xiě)、執(zhí)行權(quán)限、文件變更時(shí)間等。

ADD 復(fù)制
  • ADD相比于COPY支持tar文件和url路徑。
  • tar 是本地文件,將自動(dòng)展開(kāi)為目錄,類似于解壓,如果是url的tar文件則不自動(dòng)解壓
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
  • ADD 將文件從路徑 <src> 復(fù)制添加到容器內(nèi)部路徑 <dest>,dest必須寫(xiě)成dest/。
小結(jié)

COPY和ADD 復(fù)制目錄時(shí)有些特殊,對(duì)于目錄而言:只復(fù)制目錄中的內(nèi)容而不包含目錄自身

ADD go /usr/local/      僅僅復(fù)制了go目錄里的內(nèi)容沒(mé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ì)增加中間層鏡像,考慮到鏡像的大小盡量把所以有命令寫(xiě)入到一個(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 常見(jiàn)命令

  • 從當(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),并在只讀的鏡像層外面掛載一層可讀寫(xiě)層從宿主主機(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)建容器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容