docker構(gòu)建的鏡像的三種方式小結(jié)
1. 通過容器創(chuàng)建
容器提交 是一種快速創(chuàng)建鏡像的方法,它將一個(gè)正在運(yùn)行的容器的當(dāng)前狀態(tài)保存為一個(gè)新的鏡像。
提交容器:使用 docker commit
命令,指定要提交的容器ID、新鏡像的名稱和可選標(biāo)簽。
docker commit container_id my_image:tag ? ~ docker commit -m "create image" nginx demo:test sha256:4f00c504f06115b9230c21afab2709b8cff1c5d4e8f2799f3472964c4b1c9d8c ? ~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE demo test 4f00c504f061 2 seconds ago 141MB
通過 docker commit
命令,可以將容器(如示例中的 nginx
,也可以使用容器ID)的當(dāng)前狀態(tài)提交為新鏡像,同時(shí)指定新鏡像的名稱(如 my_image
)和標(biāo)簽(如 tag
)。這里使用 -m
參數(shù)添加提交說明。
這種方式簡單快捷,適用于臨時(shí)或?qū)嶒?yàn)性的鏡像創(chuàng)建。然而,不建議頻繁使用容器提交方式創(chuàng)建鏡像,因?yàn)橥ㄟ^提交容器的方式,我們無法追溯詳細(xì)的變更操作,這會(huì)導(dǎo)致鏡像構(gòu)建過程缺乏透明度和可重復(fù)性。
2. 通過Dockerfile構(gòu)建鏡像
在Docker構(gòu)建自定義鏡像時(shí),Dockerfile是一個(gè)至關(guān)重要的工具。Dockerfile 是一個(gè)文本文件,它包含了一系列指令,用于自動(dòng)化構(gòu)建Docker鏡像。通過編寫Dockerfile,你可以精確地定義構(gòu)建鏡像所需的步驟、依賴關(guān)系和配置項(xiàng)。整個(gè)過程通常稱為“構(gòu)建”(build)。Dockerfile確保了鏡像構(gòu)建的可重復(fù)性和一致性。
下面是一個(gè)Dockerfile示例:
FROM python:3.11.9-alpine3.19 LABEL authors="ff755" EXPOSE 8000 WORKDIR /app COPY . /app RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txt CMD [ "python", "./main.py" ]
示例代碼:gitee.com/ft/hello-py (一個(gè)FastAPI的Hello World項(xiàng)目)
指令詳解:
- FROM:指定基于哪個(gè)鏡像來構(gòu)建。示例中使用了
python:3.11.9-alpine3.19
鏡像。我們可以根據(jù)實(shí)際需求選擇合適的基鏡像來構(gòu)建我們自己的鏡像。 - LABEL:為鏡像添加元數(shù)據(jù),如作者、版本等,便于管理和搜索鏡像。
- EXPOSE:聲明鏡像內(nèi)服務(wù)對外提供的端口號。如果不指定,運(yùn)行容器時(shí)使用
-P
將不會(huì)自動(dòng)映射端口。 - WORKDIR:設(shè)定鏡像的工作目錄,即容器內(nèi)的當(dāng)前目錄(等同于命令
pwd
)。 - COPY:從宿主機(jī)指定目錄復(fù)制文件到容器內(nèi)的指定目錄。如
COPY . .
表示將宿主機(jī)當(dāng)前目錄下的所有文件復(fù)制到容器內(nèi)的工作目錄。 - RUN:在新構(gòu)建的鏡像中執(zhí)行命令并提交結(jié)果。每次
RUN
指令都會(huì)在當(dāng)前鏡像層上執(zhí)行命令,然后生成一個(gè)新的鏡像層。例如,上面通過pip
根據(jù)requirements.txt
安裝 Python 依賴,并指定使用清華大學(xué)的鏡像源。 - CMD:設(shè)置容器啟動(dòng)后默認(rèn)執(zhí)行的命令。只有最后一個(gè)
CMD
指令會(huì)被執(zhí)行,如果用戶在運(yùn)行容器時(shí)指定了命令,則會(huì)覆蓋CMD
指定的命令。如CMD [ "python", "./main.py" ]
表示容器啟動(dòng)時(shí)運(yùn)行python ./main.py
。
此外,還有其他常用指令:
- ENV:設(shè)置環(huán)境變量。
- ARG: 設(shè)置構(gòu)建變量。與
ENV
不通,ARG
是定義構(gòu)建過程中的變量。 - ADD:類似于
COPY
,功能更豐富,可以支持URL下載并添加文件,自動(dòng)解壓tar.gz
等。一般情況下推薦使用COPY
。 - ENTRYPOINT:類似于
CMD
,常用于定義始終執(zhí)行的可執(zhí)行程序。 - VOLUME:創(chuàng)建一個(gè)數(shù)據(jù)卷掛載點(diǎn),用于持久化數(shù)據(jù)或與其他容器共享數(shù)據(jù)。數(shù)據(jù)卷獨(dú)立于容器生命周期,即使容器被刪除,數(shù)據(jù)也會(huì)被保留。
基于Dockerfile構(gòu)建鏡像:
docker build -t hello:py .
使用docker build
通過Dockerfile構(gòu)建鏡像。當(dāng)Docker不在當(dāng)前目錄時(shí),可以添加-f [你的目錄]/Dockerfile
指定。
Docker Hub官方倉庫提供了大量的優(yōu)秀鏡像和Dockerfile,可以通過閱讀,來學(xué)習(xí)如何編寫Dockerfile,高效編寫Dockerfile,構(gòu)建我們自己的鏡像。
3. 使用BuildKit構(gòu)建鏡像
Docker還提供了一個(gè)實(shí)驗(yàn)性的構(gòu)建工具,稱為BuildKit,它可以提供更快的構(gòu)建速度和更高效的鏡像緩存。使用BuildKit構(gòu)建鏡像的方式與使用Dockerfile類似,只需設(shè)置一個(gè)環(huán)境變量即可啟用BuildKit。
# 設(shè)置環(huán)境變量啟用BuildKit export DOCKER_BUILDKIT=1
使用常規(guī)的 docker build
命令構(gòu)建鏡像,即可享受到 BuildKit 帶來的性能提升和新特性。BuildKit 作為新一代的 Docker 構(gòu)建工具,通過一系列創(chuàng)新設(shè)計(jì)和優(yōu)化措施,極大地改善了 Docker 鏡像構(gòu)建的效率、安全性和靈活性。
以下為使用默認(rèn)構(gòu)建方式和BuildKit的效果:
默認(rèn)構(gòu)建:
? hello-py git:(master) docker build -t hello-py:0.0.1 . [+] Building 119.3s (9/9) FINISHED docker:default => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 254B 0.0s => [internal] load metadata for docker.io/library/python:3. 68.8s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/python:3.11.9-alpine3.19@sh 35.2s => => resolve docker.io/library/python:3.11.9-alpine3.19@sha 0.0s => => sha256:3912f7fe31112ee0f747848328e1a2b 1.37kB / 1.37kB 0.0s => => sha256:10333afc009e90c9e91c1f1d7deca49 6.26kB / 6.26kB 0.0s => => sha256:c3cdf40b8bda8e4ca4be0f5fa7 619.60kB / 619.60kB 17.6s => => sha256:ac499ccf2147611bc4388058b362 12.67MB / 12.67MB 22.2s => => sha256:0b5ed25d3cc27cd35c7b0352bac8ef2 1.65kB / 1.65kB 0.0s => => sha256:416bfceb623eb12bf1c373489e0dba32f0 240B / 240B 19.8s => => extracting sha256:c3cdf40b8bda8e4ca4be0f5fa7f1d1289072 0.2s => => sha256:76351c33299b900aa86b33176eac19 3.13MB / 3.13MB 34.3s => => extracting sha256:ac499ccf2147611bc4388058b362c0bcc1ca 0.5s => => extracting sha256:416bfceb623eb12bf1c373489e0dba32f00f 0.0s => => extracting sha256:76351c33299b900aa86b33176eac198fc861 0.3s => [internal] load build context 0.2s => => transferring context: 31.28kB 0.0s => [2/4] WORKDIR /app 2.1s => [3/4] COPY . /app 0.6s => [4/4] RUN pip install -i https://pypi.tuna.tsinghua.edu. 11.6s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:a90573dc2e0981ef136518fc7c244af6c 0.0s => => naming to docker.io/library/hello-py:0.0.1 0.0s
啟用BuildKit進(jìn)行構(gòu)建
? hello-py git:(master) docker build -t hello-py:buildkit . [+] Building 16.8s (9/9) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 254B 0.0s => [internal] load metadata for docker.io/library/python:3. 16.6s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/python:3.11.9-alpine3.19@sha 0.0s => [internal] load build context 0.0s => => transferring context: 2.84kB 0.0s => CACHED [2/4] WORKDIR /app 0.0s => CACHED [3/4] COPY . /app 0.0s => CACHED [4/4] RUN pip install -i https://pypi.tuna.tsinghu 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:a90573dc2e0981ef136518fc7c244af6c 0.0s => => naming to docker.io/library/hello-py:buildkit 0.0s
默認(rèn)構(gòu)建耗時(shí)119.3s,啟用BuildKit后16.8s,速度快了7倍,快來試試吧。
雖然,通過容器可以創(chuàng)建鏡像,但Dockerfile構(gòu)建鏡像的應(yīng)當(dāng)成為我們創(chuàng)建鏡像的首選。通過合理編寫Dockerfile,可以實(shí)現(xiàn)自動(dòng)化、可重復(fù)和可維護(hù)的鏡像構(gòu)建過程。開啟BuildKit可以更快速的構(gòu)建我們的鏡像。
到此這篇關(guān)于docker構(gòu)建的鏡像的三種方式小結(jié)的文章就介紹到這了,更多相關(guān)docker構(gòu)建鏡像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker環(huán)境搭建JMeter+Grafana+influxdb可視化性能監(jiān)控平臺的教程
這篇文章主要介紹了docker下搭建JMeter+Grafana+influxdb可視化性能監(jiān)控平臺,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫的實(shí)現(xiàn)
本文主要介紹了Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09docker?Desktop安裝WSL?--update報(bào)錯(cuò)問題成功解決辦法
這篇文章主要介紹了如何在Windows?11上設(shè)置WSL2為默認(rèn)版本,解決WSL2安裝和卸載過程中遇到的問題,包括強(qiáng)制中斷命令、wsl--uninstall命令無效以及手動(dòng)刪除Linux發(fā)行版的方法,需要的朋友可以參考下2025-02-02docker內(nèi)的容器如何與宿主機(jī)共享IP的方法
本文主要介紹了docker內(nèi)的容器如何與宿主機(jī)共享IP的方法,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Docker容器下運(yùn)行Nginx并實(shí)現(xiàn)反向代理
這篇文章介紹了Docker容器下運(yùn)行Nginx并實(shí)現(xiàn)反向代理的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03docker安裝tomcat并部署Springboot項(xiàng)目war包的方法
這篇文章主要介紹了docker安裝tomcat并部署Springboot項(xiàng)目war包的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11