云安全
云安全概述
阿里云概述
亚马逊AWS概述
云计算导论
云计算概述
云计算的关键技术
虚拟化
分布式文件系统
云存储
数据处理
并行计算
OpenStack
容器
Kubernetes概述
Serverless
Hadoop
云原生
云数据中心
微服务
对象存储OSS
云存储
对象存储
对象文件(Object)
存储桶(存储空间)
通过外网访问OSS
存储桶漏洞
STS访问OSS
权限与访问控制
访问控制
Bucket&RAM Policy
预签名
Docker
01docker概述
02docker安装
03目录结构
04基础操作
05底层原理【理论】
06底层原理【实践】
07DockerFile
08容器反查Dockerfile
09Docker 逃逸
-
+
首页
06底层原理【实践】
## 拉取Ubuntu镜像 ```bash root@ubuntu:/home/test# docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 4b3ffd8ccb52: Pull complete Digest: sha256:66460d557b25769b102175144d538d88219c077c678a49af4afca6fbfc1b5252 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest root@ubuntu:/home/test# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 97bed23a3497 2 weeks ago 78.1MB mysql 8.0 94753e67a0a9 3 weeks ago 780MB ``` ## 创建并操作容器 > 创建容器且创建新用户和新文件。 ```bash root@ubuntu:/home/test# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 97bed23a3497 2 weeks ago 78.1MB mysql 8.0 94753e67a0a9 3 weeks ago 780MB root@ubuntu:/home/test# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@ubuntu:/home/test# docker run -id --name ubuntu ubuntu f75306642024053980414cbb4340cadfff215108129ea1a8a73dccb4c9bfe6c4 root@ubuntu:/home/test# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f75306642024 ubuntu "/bin/bash" 5 seconds ago Up 4 seconds ubuntu root@ubuntu:/home/test# docker exec -it ubuntu bash root@f75306642024:/# whoami root root@f75306642024:/# useradd mathias root@f75306642024:/# passwd mathias New password: Retype new password: passwd: password updated successfully root@f75306642024:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 06:02 ? 00:00:00 /bin/bash root 7 0 0 06:02 pts/0 00:00:00 bash root 24 7 0 06:03 pts/0 00:00:00 ps -ef root@f75306642024:/# touch new_ubuntu_docker_file.exe root@f75306642024:/# ls bin boot dev etc home lib lib64 media mnt new_ubuntu_docker_file.exe opt proc root run sbin srv sys tmp usr var root@f75306642024:/# exit exit ``` > 值得注意的是 ```bash docker run -d ubuntu #ubuntu 镜像默认启动 bash,但 bash 在 “非交互式且无输入” 时会立即退出(因为没有 STDIN 连接),导致容器启动后瞬间停止(状态变为 exited)。 docker run -id Ubuntu #由于 -i 保持 STDIN 打开,bash 会认为 “有输入连接”,因此不会立即退出,容器会在后台持续运行(状态为 up)。 ``` ## 打包镜像 > 将添加后的容器导出 先将当前容器提交为镜像 ```bash root@ubuntu:/home/test# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f75306642024 ubuntu "/bin/bash" 13 minutes ago Exited (137) 3 minutes ago ubuntu root@ubuntu:/home/test# docker commit f75306642024 mathias-ubuntu:v1 sha256:4bc555b8e4c6cf7adb7a8a23f80df8d692603f81ea0a2aed0e2ea68b43d74777 root@ubuntu:/home/test# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE mathias-ubuntu v1 4bc555b8e4c6 6 seconds ago 78.1MB ubuntu latest 97bed23a3497 2 weeks ago 78.1MB mysql 8.0 94753e67a0a9 3 weeks ago 780MB ``` 将镜像保存为tar格式。 ```bash root@ubuntu:/home/test# docker save mathias-ubuntu -o mathiasu.tar root@ubuntu:/home/test# ls Desktop Documents Downloads mathiasu.tar Music Pictures Public snap Templates Videos ``` > 将原始的Ubuntu镜像导出 ```bash root@ubuntu:/home/test# docker save 97bed23a3497 -o ubuntu.tar root@ubuntu:/home/test# ls Desktop Documents Downloads mathiasu.tar Music Pictures Public snap Templates ubuntu.tar Videos ``` ## 解压原始镜像 > 将的Ubuntu镜像进行解压 ```bash root@ubuntu:/home/test# mkdir ubuntu root@ubuntu:/home/test# mv ./ubuntu.tar ubuntu root@ubuntu:/home/test# cd ./ubuntu/ root@ubuntu:/home/test/ubuntu# ls ubuntu.tar root@ubuntu:/home/test/ubuntu# tar -xvf ./ubuntu.tar blobs/ blobs/sha256/ blobs/sha256/073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc blobs/sha256/583aaddadccee9f8dbd3f47661b5a9a78daf4995f535396ff0c1ed0487e4db54 blobs/sha256/97bed23a34971024aa8d254abbe67b7168772340d1f494034773bc464e8dd5b6 blobs/sha256/a80ae87142a0ae1f9e02e3561844d7004a28886aaca46db5392dd556df7326f2 index.json manifest.json oci-layout root@ubuntu:/home/test/ubuntu# ls blobs index.json manifest.json oci-layout ubuntu.tar root@ubuntu:/home/test/ubuntu# ``` 文件内容分别是 | 目录或文件 | 描述 | | ------------- | ------------------------------------------------------------ | | blobs目录 | Binary Large Object的缩写,存放镜像的核心数据,每份文件以sha256哈希值命名(哈希值是内容的唯一标识,确保数据不被篡改)。每份文件其中部分是镜像层数据,部分是镜像配置数据 | | index.json | 镜像索引文件,描述镜像支持的平台信息 | | manifest.json | 镜像清单文件,包含镜像配置文件的blob哈希、所有镜像层blob哈希(按顺序列出,容器引擎会按此顺序叠加层,形成完整的文件系统)、每个blob的媒体类型 | | oci-layout | 局部标识文件,作用是让容器识别这是一个符合OCI标准的镜像目录 | > manifest.json文件格式化输出后 ```json [ { "Config": "blobs/sha256/97bed23a34971024aa8d254abbe67b7168772340d1f494034773bc464e8dd5b6", "RepoTags": null, "Layers": [ "blobs/sha256/073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc" ], "LayerSources": { "sha256:073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc": { "mediaType": "application/vnd.oci.image.layer.v1.tar", "size": 80634368, "digest": "sha256:073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc" } } } ] ``` 字段分析 | 字段 | 描述 | | ------------ | ------------------------------------------------------------ | | config | 指向镜像的配置文件,包含镜像的元数据、创建时间、作者信息、入口文件等等 | | RepoTags | 镜像仓库的标签 | | Layers | 镜像的层列表(按顺序), 每个层都是只读的,使用联合文件系统叠加,按顺序应用(最底层是基础系统) | | LayerSources | 详细描述每个层的源信息 | 这是一个单层的Ubuntu镜像。 意思就是这个文件就是整个容器的基座。 ```bash blobs/sha256/073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc ``` ```bash root@ubuntu:/home/test/ubuntu# cd blobs/sha256/ root@ubuntu:/home/test/ubuntu/blobs/sha256# ls 073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc 97bed23a34971024aa8d254abbe67b7168772340d1f494034773bc464e8dd5b6 583aaddadccee9f8dbd3f47661b5a9a78daf4995f535396ff0c1ed0487e4db54 a80ae87142a0ae1f9e02e3561844d7004a28886aaca46db5392dd556df7326f2 root@ubuntu:/home/test/ubuntu/blobs/sha256# file * 073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc: POSIX tar archive 583aaddadccee9f8dbd3f47661b5a9a78daf4995f535396ff0c1ed0487e4db54: JSON text data 97bed23a34971024aa8d254abbe67b7168772340d1f494034773bc464e8dd5b6: JSON text data a80ae87142a0ae1f9e02e3561844d7004a28886aaca46db5392dd556df7326f2: JSON text data root@ubuntu:/home/test/ubuntu/blobs/sha256# tar -xvf 073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc root@ubuntu:/home/test/ubuntu/blobs/sha256# ls 073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc 97bed23a34971024aa8d254abbe67b7168772340d1f494034773bc464e8dd5b6 bin dev home lib64 mnt proc run srv tmp var 583aaddadccee9f8dbd3f47661b5a9a78daf4995f535396ff0c1ed0487e4db54 a80ae87142a0ae1f9e02e3561844d7004a28886aaca46db5392dd556df7326f2 boot etc lib media opt root sbin sys usr ``` ## 解压操作后的镜像 > 解压 ```bash root@ubuntu:/home/test# mkdir mathias root@ubuntu:/home/test# cd mathias root@ubuntu:/home/test/mathias# mv ../mathiasu.tar ./ root@ubuntu:/home/test/mathias# tar -xvf ./mathiasu.tar blobs/ blobs/sha256/ blobs/sha256/073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc blobs/sha256/0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d blobs/sha256/4bc555b8e4c6cf7adb7a8a23f80df8d692603f81ea0a2aed0e2ea68b43d74777 blobs/sha256/5a10ddd3ee3b416a2e7e8aaf336d89221f4ed0c51d62350b3d97fa5e66b2596a blobs/sha256/789e7916a00411215e37915999e87188b8131977062fc5c72ad219e390b154f4 blobs/sha256/e14b504e3d801edf54f62b57f03c64e26ef0d8c2d1b418f5f650423b40d5b009 index.json manifest.json oci-layout repositories root@ubuntu:/home/test/mathias# ls blobs index.json manifest.json mathiasu.tar oci-layout repositories root@ubuntu:/home/test/mathias# ``` 多了一个repositories,为标签仓库。 > manifest.json格式化后 ```json [ { "Config": "blobs/sha256/4bc555b8e4c6cf7adb7a8a23f80df8d692603f81ea0a2aed0e2ea68b43d74777", "RepoTags": [ "mathias-ubuntu:v1" ], "Layers": [ "blobs/sha256/073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc", "blobs/sha256/0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d" ], "LayerSources": { "sha256:073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc": { "mediaType": "application/vnd.oci.image.layer.v1.tar", "size": 80634368, "digest": "sha256:073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc" }, "sha256:0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d": { "mediaType": "application/vnd.oci.image.layer.v1.tar", "size": 18432, "digest": "sha256:0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d" } } } ] ``` 有两层了,哪一层是底座呢?很明显是第一个,073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc 解压第二层: ```bash root@ubuntu:/home/test/mathias# file blobs/sha256/0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d blobs/sha256/0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d: POSIX tar archive root@ubuntu:/home/test/mathias# tar -xvf blobs/sha256/0d5f2d34a207754e41a8ed7cf1b0adcdcd8538f4e3a4208dd7dd3aa278cf5a0d etc/ etc/.pwd.lock etc/group etc/group- etc/gshadow etc/gshadow- etc/passwd etc/passwd- etc/shadow etc/shadow- etc/subgid etc/subgid- etc/subuid etc/subuid- new_ubuntu_docker_file.exe root/ ``` 为什么会显示这些??? 因为这些发生了变化???为什么发生了变化??? 因为之前创建了用户与文件! ## inspect docker inspect 用于获取容器、镜像、网络、卷、服务等 Docker 对象的详细配置和状态信息,返回结构为JSON格式。 命令格式: ```txt docker inspect [选项] 目标对象(名称/ID) ``` 目标对象:可以是容器(container)、镜像(image)、网络(network)、卷(volume)、服务(service)等(通过名称或 ID 指定,ID 可以简写,只要唯一即可)。 常用选项为--format或者-f,用于过滤JSON输出,提取特定信息。 查看修改前的镜像信息:  查看修改后的镜像信息: 
毛林
2025年10月21日 20:12
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码