{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-05-10 14:40:55","updateBy":"admin","updateTime":"2025-09-12 12:17:10","remark":null,"id":56,"articleTitle":"Docker（二）镜像及镜像仓库","articleUrl":"docker_image_and_registry","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/713782e83c4e4b9bbf2d588c2789e07d.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"我们使用”docker image pull 镜像名“拉取镜像时都是去dockerhub官方镜像仓库中拉取。 可以在dockerhub上申请一个账号创建一个个人的镜像仓库，将我们自己创建的镜像推送到仓库中。 如果在生产环境中，一般会搭建一个私有仓库，避免项目泄露出去。Docker官方也为我们提供了registry镜像让我们可以创建自己的私有仓库。","articleContent":"## 什么是 Docker 镜像？\n\nDocker 镜像是一个**轻量级、独立、可执行的软件包**，包含运行应用程序所需的一切：代码、运行时环境、系统工具、系统库和设置。镜像是容器的基础，提供了文件系统结构和运行环境的标准格式。\n\n### 核心特性\n\n- **分层存储**：镜像由多个只读层组成，这种设计实现了资源共享和高效存储\n- **内容寻址**：使用加密哈希值唯一标识镜像内容，确保一致性和完整性\n- **不可变性**：镜像一旦创建就不会改变，任何修改都会生成新镜像\n- **可移植性**：可以在任何支持 Docker 的平台上运行，实现\"一次构建，到处运行\"\n\n## 镜像分层架构详解\n\n### 联合文件系统 (UnionFS) 深度解析\n\nUnionFS 是 Docker 镜像的核心技术，它允许将多个文件系统（称为层）透明地叠加在一起，形成统一的视图。\n\n一个典型的 Docker 镜像分层架构（例如一个 Python Web 应用镜像）可以如下表所示：\n\n| 层（Layer）                      | 说明                                                         | 对应 Dockerfile 指令示例（部分）           |\n| :------------------------------- | :----------------------------------------------------------- | :----------------------------------------- |\n| **可写容器层 (Container Layer)** | 容器运行时创建，所有对容器的修改（写入、删除等）都会发生在这一层。 | （运行时层，非 Dockerfile 指令创建）       |\n| **应用代码层**                   | 包含应用程序的代码文件。                                     | `COPY . /app`                              |\n| **依赖安装层**                   | 安装应用程序所需的依赖库（如 Python 包）。                   | `RUN pip install -r requirements.txt`      |\n| **基础镜像层 (Base Image)**      | 提供最低要求的 Linux 发行版根文件系统（rootfs），如 `python:3.9-slim`。 | `FROM python:3.9-slim`                     |\n| **引导文件系统 (bootfs)**        | 包含 bootloader 和 kernel。容器启动初期加载，之后卸载并由宿主机内核接管。 | （通常已包含在基础镜像中，不直接编写指令） |\n\n上表展示了镜像的层次结构。**所有的容器都共享宿主机的内核**，这使得容器非常轻量。\n\n#### 写时复制 (Copy-on-Write) 机制\n\n当容器需要修改文件时，Docker 会：\n\n1. 在容器层创建该文件的副本\n2. 所有修改都在副本上进行\n3. 原始镜像层保持不变\n\n这种机制使得：\n\n- 多个容器可以共享相同的镜像层\n- 镜像层保持只读，确保一致性\n- 节省存储空间和内存\n\n### 镜像层详细组成\n\n每个镜像层包含：\n\n1. **文件系统变更集**：该层添加、修改或删除的文件\n2. **元数据**：\n   - 创建该层的命令\n   - 层的大小和创建时间\n   - 父层的引用\n   - 配置信息（环境变量、入口点等）\n\n## Docker 镜像加载原理深度解析\n\n### 启动过程分析\n\n1. **初始化引导文件系统 (bootfs)**\n\n   ```bash\n   # bootfs 包含：\n   # - bootloader: 引导加载程序\n   # - kernel: Linux 内核\n   # 这些内容在容器启动后立即卸载，释放内存\n   ```\n\n   \n\n2. **加载根文件系统 (rootfs)**\n\n   - 包含典型 Linux 系统的目录结构：/bin, /etc, /home, /var 等\n   - 不同于传统 Linux 发行版，Docker 的 rootfs 极其精简\n   - 只包含必要的应用程序和依赖，没有内核\n\n3. **挂载联合文件系统**\n\n   - 将所有镜像层按顺序挂载\n   - 在最顶层添加可写的容器层\n\n### 容器层特性\n\n容器层是临时层，具有以下特点：\n\n- **生命周期与容器相同**：容器删除时，该层也被删除\n- **数据持久化**：重要数据应通过卷(volumes)或绑定挂载持久化\n- **性能影响**：写时复制机制可能带来轻微性能开销\n\n## Docker镜像操作命令大全\n\n### 1. 镜像搜索与获取\n\n| 命令                | 说明                 | 示例                             |\n| ------------------- | -------------------- | -------------------------------- |\n| `docker search`     | 从Docker Hub搜索镜像 | `docker search nginx`            |\n| `docker pull`       | 拉取镜像到本地       | `docker pull nginx:latest`       |\n| `docker image pull` | 同上                 | `docker image pull ubuntu:20.04` |\n\n### 2. 本地镜像管理\n\n| 命令                   | 说明             | 示例                           |\n| ---------------------- | ---------------- | ------------------------------ |\n| `docker images`        | 列出本地所有镜像 | `docker images`                |\n| `docker image ls`      | 同上             | `docker image ls`              |\n| `docker image inspect` | 查看镜像详细信息 | `docker image inspect nginx`   |\n| `docker image history` | 查看镜像构建历史 | `docker history nginx`         |\n| `docker tag`           | 给镜像打标签     | `docker tag nginx my-nginx:v1` |\n| `docker rmi`           | 删除本地镜像     | `docker rmi nginx:latest`      |\n| `docker image rm`      | 同上             | `docker image rm ubuntu:20.04` |\n| `docker image prune`   | 删除未使用的镜像 | `docker image prune -a`        |\n\n### 3. 镜像构建与导入导出\n\n| 命令            | 说明                   | 示例                                          |\n| --------------- | ---------------------- | --------------------------------------------- |\n| `docker build`  | 通过Dockerfile构建镜像 | `docker build -t my-app:latest .`             |\n| `docker commit` | 从容器创建新镜像       | `docker commit container_id my-image`         |\n| `docker save`   | 将镜像保存为tar文件    | `docker save -o nginx.tar nginx`              |\n| `docker load`   | 从tar文件加载镜像      | `docker load -i nginx.tar`                    |\n| `docker export` | 将容器导出为tar文件    | `docker export -o container.tar container_id` |\n| `docker import` | 从tar文件导入镜像      | `docker import container.tar my-image:latest` |\n\n### 4. 镜像推送与发布\n\n| 命令            | 说明             | 示例                                 |\n| --------------- | ---------------- | ------------------------------------ |\n| `docker push`   | 推送镜像到仓库   | `docker push myrepo/my-image:latest` |\n| `docker login`  | 登录到镜像仓库   | `docker login registry.example.com`  |\n| `docker logout` | 退出镜像仓库登录 | `docker logout registry.example.com` |\n\n## 搭建私有仓库\n\n我们使用\"docker image pull 镜像名\"拉取镜像时都是去Docker Hub官方镜像仓库中拉取。可以在Docker Hub上申请账号创建个人镜像仓库，将自己创建的镜像推送到仓库中。在生产环境中，一般会搭建私有仓库，避免项目泄露。Docker官方提供了registry镜像用于创建私有仓库。\n\n### 拉取registry镜像并启动\n\n```bash\n# 拉取registry镜像\ndocker pull registry\n\n# 启动registry容器\ndocker run -d -p 5000:5000 -v /docker/images:/var/lib/registry --restart=always --name private-registry registry\n\n# 参数说明：\n# -p：端口映射\n# -v：挂载数据卷\n# --restart=always：容器退出时总是重启\n# --name：指定容器名称\n```\n\n### 修改镜像源和仓库配置\n\n```bash\n# 编辑Docker配置文件\nvim /etc/docker/daemon.json\n\n# 添加以下内容\n{\n  \"registry-mirrors\": [\"https://registry.docker-cn.com\",\n  \t\t\t\t\t\"https://docker.m.daocloud.io\",\n                        \"https://noohub.ru\",\n                        \"https://huecker.io\",\n                        \"https://dockerhub.timeweb.cloud\",\n                        \"https://docker.rainbond.cc\"],\n  \"insecure-registries\": [\"192.168.100.100:5000\"]\n}\n\n# 重启Docker服务\nsystemctl restart docker\n```\n\n### 上传镜像到私有仓库\n\n```bash\n# 给镜像打标签（格式：host:port/repository:tag）\ndocker tag busybox:latest 192.168.100.100:5000/busybox:v1\n\n# 推送镜像到私有仓库\ndocker push 192.168.100.100:5000/busybox:v1\n```\n\n### 从私有仓库下载镜像\n\n```bash\n# 从私有仓库拉取镜像\ndocker pull 192.168.100.100:5000/busybox:v1\n\n# 查看拉取的镜像\ndocker images\n```\n\n### 管理私有仓库内容\n\n```bash\n# 列出仓库中的所有镜像\ncurl http://192.168.100.100:5000/v2/_catalog\n\n# 列出特定镜像的所有标签\ncurl http://192.168.100.100:5000/v2/busybox/tags/list\n\n# 删除私有仓库中的镜像（需要启用删除功能）\n# 首先在启动registry时添加环境变量：-e REGISTRY_STORAGE_DELETE_ENABLED=true\n# 然后使用API删除：curl -X DELETE http://192.168.100.100:5000/v2/busybox/manifests/<tag_digest>\n```\n\n## 使用阿里云镜像仓库\n\n镜像仓库申请地址：https://cr.console.aliyun.com/cn-shanghai/instances/repositories\n\n### 创建命名空间和镜像仓库\n\n1. 创建命名空间（例如：daniel-hub）\n2. 创建镜像仓库（例如：nginx-docker）\n\n### 使用阿里云镜像仓库\n\n```bash\n# 登录阿里云Docker Registry\ndocker login --username=your_username registry.cn-shanghai.aliyuncs.com\n\n# 从Registry中拉取镜像\ndocker pull registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]\n\n# 将镜像推送到Registry\ndocker tag [ImageId] registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]\ndocker push registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]\n\n# 根据网络环境选择合适的镜像仓库地址：\n# 经典网络：registry-internal.cn-shanghai.aliyuncs.com\n# VPC网络：registry-vpc.cn-shanghai.aliyuncs.com\n```\n\n","categoryId":9,"viewCount":1479,"categoryName":"Docker","author":"球接子","authorAvatar":null,"tagIds":[9],"tagNames":["Docker"]}}