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

