Docker 鏡像結(jié)構(gòu)詳解
Docker 鏡像結(jié)構(gòu)
一、鏡像與容器之間的關(guān)系
- 鏡像:是靜態(tài)的、只讀的文件系統(tǒng),包含運(yùn)行容器所需的程序、庫、資源、配置等
- 容器:是鏡像的運(yùn)行實(shí)例,是動(dòng)態(tài)的進(jìn)程,擁有自己的文件系統(tǒng)、網(wǎng)絡(luò)、進(jìn)程空間等資源
- 關(guān)系:
- 鏡像是容器的基礎(chǔ),容器依賴于鏡像。
- 容器啟動(dòng)時(shí),會(huì)在鏡像之上添加一個(gè)可寫的“容器層”,所有修改都發(fā)生在這一層。
- 鏡像通過
json文件描述運(yùn)行時(shí)的配置(如啟動(dòng)命令、環(huán)境變量等),Docker 守護(hù)進(jìn)程解析該文件并啟動(dòng)容器
二、鏡像結(jié)構(gòu)
1、基礎(chǔ)鏡像(base 鏡像)
- 不依賴于其他鏡像,從
scratch開始構(gòu)建 - 以此為基礎(chǔ)鏡像,進(jìn)行擴(kuò)展
- 通常是各種 Linux 發(fā)行版(如 CentOS、Ubuntu)的鏡像
- 不同發(fā)行版的區(qū)別在于
rootfs(用戶空間),而內(nèi)核共享宿主機(jī)的 Kernel
2、鏡像分層
- 鏡像由多個(gè)只讀層組成,每層代表一個(gè)修改(如安裝軟件、添加文件)
- 層次結(jié)構(gòu)示例
| touch /galaxy/cy | Image | | mkdir /galaxy | Image | | CentOS:7 | Base Image | | Docker Host | Kernel |
3、容器層
- 容器啟動(dòng)時(shí),在鏡像頂部添加一個(gè)可寫層
- 用戶看到的是聯(lián)合文件系統(tǒng),上層文件覆蓋下層同名文件
- 容器層的寫入操作使用寫時(shí)復(fù)制機(jī)制
三、Docker 鏡像構(gòu)建
1、三種構(gòu)建方式對(duì)比
| 方式 | 說明 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
docker commit | 基于運(yùn)行中的容器創(chuàng)建鏡像 | 簡(jiǎn)單快捷 | 容易出錯(cuò),效率低且可重復(fù)性弱,不安全 |
| 基于本地模板導(dǎo)入 | 從模板文件導(dǎo)入鏡像 | 快速導(dǎo)入已有系統(tǒng) | 不靈活、不易定制 |
dockerfile | 通過腳本定義鏡像層次 | 透明、可重復(fù)、易于維護(hù) | 推薦方式 |
2、docker commit
通過在運(yùn)行的容器內(nèi)安裝軟件、配置環(huán)境,再將容器的“當(dāng)前狀態(tài)”打包為新鏡像,本質(zhì)是“快照式構(gòu)建”
在centos:7中安裝vim-common
先基于centos7運(yùn)行容器,容器名為cy,并使用-it生成終端進(jìn)入容器
[root@docker ~]# docker run --name dc -it centos:7 /bin/bash
在容器中安裝vim-common
[root@8f3a60b20edb /]# yum -y install vim-common
退出容器后,使用docker commit將v1容器打包為鏡像
[root@docker ~]# docker commit dc centosdc:7 [root@docker ~]# docker images | grep centosdc
3、基于本地模板導(dǎo)入
直接從操作系統(tǒng)模板文件(如OpenVZ模板)導(dǎo)入鏡像,模板文件通常為壓縮包(如
tar.gz),包含完整的rootfs和基礎(chǔ)配置
導(dǎo)入ubuntu:12.04模板
下載模板
從OpenVZ官方地址(http://openvz.org/Download/templates/precreated)下載ubuntu-12.04-x86-minimal.tar.gz
導(dǎo)入為鏡像
[root@docker ~]# cat ubuntu-12.04-x86-minimal.tar.gz | docker import - ubuntu:12.04
驗(yàn)證鏡像
[root@docker ~]# docker images
4、Dockerfile構(gòu)建
Dockerfile是一個(gè)文本文件,包含一系列“指令(Instruction)”,每一條指令對(duì)應(yīng)鏡像的一層——指令描述了該層的構(gòu)建操作(如安裝軟件、復(fù)制文件、配置環(huán)境)。通過docker build命令執(zhí)行Dockerfile,可自動(dòng)化、可重復(fù)地構(gòu)建鏡像,解決了docker commit的“不透明、不可追溯”問題
編寫 Dockerfile
[root@docker ~]# vim Dockerfile
Dockerfile 內(nèi)容
# 第一行必須指定,基礎(chǔ)鏡像信息 FROM centos:7 # 維護(hù)者信息 MAINTAINER docker@example.com # 鏡像操作指令 RUN yum install -y httpd EXPOSE 80 # 容器啟動(dòng)執(zhí)行指令 CMD ["/usr/sbin/httpd"]
執(zhí)行構(gòu)建命令
[root@docker ~]# docker build -t httpd:wil /root/
構(gòu)建過程:
- 下載centos7鏡像
- 添加鏡像構(gòu)建者信息
- 基于centos7鏡像啟動(dòng)容器,安裝httpd軟件,安裝完畢后將容器打包為鏡像
- 基于上一步生成的鏡像啟動(dòng)容器,將80端口打開,打開后將容器打包為鏡像
- 基于上一步生成的鏡像啟動(dòng)容器,添加容器啟動(dòng)后需要執(zhí)行的指令,再打包為鏡像
查看構(gòu)建歷史
[root@docker ~]# docker history httpd:wil
使用DockerFile文件構(gòu)建完鏡像以后,Docker會(huì)把構(gòu)建過程中的每一層臨時(shí)鏡像進(jìn)行緩存。在構(gòu)建新鏡像時(shí),可以直接使用之前緩存的鏡像層,這樣能加速鏡像的構(gòu)建
四、Dockerfile 語法詳解
| 指令 | 說明 | 示例 |
|---|---|---|
FROM | 指定基礎(chǔ)鏡像 | FROM centos:7 |
MAINTAINER | 維護(hù)者信息(已逐漸被 LABEL 替代) | MAINTAINER cy@example.com |
LABEL | 元數(shù)據(jù)鍵值對(duì) | LABEL version="1.0" |
RUN | 構(gòu)建過程中執(zhí)行命令 | RUN yum install -y httpd |
COPY | 復(fù)制宿主機(jī)文件到鏡像 | COPY app.py /app/ |
ADD | 類似 COPY,支持 URL 和自動(dòng)解壓 | ADD app.tar.gz /app/ |
WORKDIR | 設(shè)置工作目錄 | WORKDIR /app |
VOLUME | 創(chuàng)建掛載點(diǎn) | VOLUME /data |
EXPOSE | 聲明容器端口 | EXPOSE 80 |
ENV | 設(shè)置環(huán)境變量 | ENV APP_HOME /app |
CMD | 容器啟動(dòng)命令(可被覆蓋) | CMD ["/bin/bash"] |
ENTRYPOINT | 容器啟動(dòng)命令(不可被覆蓋) | ENTRYPOINT ["/app/start.sh"] |
USER | 指定運(yùn)行用戶 | USER nobody |
五、總結(jié)
| 要點(diǎn) | 說明 |
|---|---|
| 鏡像與容器 | 鏡像是靜態(tài)的模板,容器是運(yùn)行實(shí)例 |
| 分層結(jié)構(gòu) | 鏡像由多個(gè)只讀層組成,容器層可寫 |
| 基礎(chǔ)鏡像 | 從 scratch 構(gòu)建,提供 rootfs |
| 構(gòu)建方式 | 推薦使用 Dockerfile,透明、可重復(fù) |
| Dockerfile 指令 | 每條指令對(duì)應(yīng)一層,支持緩存 |
| 緩存機(jī)制 | 加速構(gòu)建,可通過 --no-cache 禁用 |
到此這篇關(guān)于Docker 鏡像結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Docker 鏡像結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker打包一個(gè)包含python3的centos8的新鏡像過程
- Docker中刪除鏡像與容器的完整指南
- docker復(fù)制鏡像到其他主機(jī)實(shí)現(xiàn)方式
- Docker的java鏡像制作及Podfile使用詳解
- docker desktop部署從Linux服務(wù)器保存的鏡像tar包詳解
- docker run本地鏡像tar用法詳解
- centos8安裝docker(containerd.io與podman-manpages問題解決)及鏡像加速詳解
- docker?registry刪除遠(yuǎn)程倉庫鏡像實(shí)現(xiàn)方式
- 8個(gè)步驟徹底清理Docker鏡像
相關(guān)文章
Docker打包一個(gè)Python腳本的實(shí)現(xiàn)方法
本文主要介紹了Docker打包一個(gè)Python腳本的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
docker集群Error response from daemon: rpc&
文章描述了在Docker集群中遇到的錯(cuò)誤信息,并提供了解決辦法,解決辦法包括配置安全組,將Docker Swarm的所有節(jié)點(diǎn)IP添加到安全組中2025-01-01
Docker安裝kafka并創(chuàng)建topic進(jìn)行消息通信過程
本文介紹了如何使用Docker容器化技術(shù)來安裝和配置Apache?Kafka,并詳細(xì)介紹了如何創(chuàng)建topic進(jìn)行消息通信,通過Docker和Docker?Compose兩種方式,可以方便地搭建Kafka集群,并進(jìn)行消息的發(fā)布和訂閱2025-12-12
docker?save與docker?export的區(qū)別
docker?save和docker?export都能導(dǎo)出鏡像包,本文主要介紹了docker?save與docker?export的區(qū)別,試圖搞清楚docker?save和docker?export的功能是什么?適用于什么應(yīng)用場(chǎng)景?感興趣的可以了解一下2022-03-03
Docker中編碼和時(shí)區(qū)設(shè)置不生效問題排查小結(jié)
本文主要介紹了在Docker容器中排查編碼和時(shí)區(qū)設(shè)置不生效的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Docker執(zhí)行(進(jìn)入)鏡像實(shí)踐
本文介紹了如何使用Docker命令查看、安裝、刪除鏡像,以及如何運(yùn)行鏡像并設(shè)置自動(dòng)重啟,還詳細(xì)介紹了如何進(jìn)入Docker容器并進(jìn)行一些常見操作,如設(shè)置MySQL事務(wù)超時(shí)時(shí)間,最后,文章鼓勵(lì)大家參考并支持腳本之家2025-12-12

