镜像|Docker容器【三】

admin 2026-03-03 06:07:03 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档系统讲解了Docker镜像的只读分层特性及其在节省空间和加速构建方面的优势,介绍了DockerHub的常用操作。核心部分详细演示了利用DockerCompose搭建私有仓库的全过程,涵盖环境准备、配置文件编写、htpasswd身份验证设置及镜像的推送与拉取操作,为构建安全可控的内部镜像源提供了完整解决方案。文末附带机构招聘广告。 综合评分: 78 文章分类: 云安全,安全建设,实战经验


cover_image

镜像 | Docker容器【三】

原创

北京昊网 北京昊网

北京昊网CTF题解

2026年2月25日 10:56 北京

关注北京昊网公众号,与大家共话网络安全。

三、Docker 镜像

3.1、什么是 Docker 镜像?

Docker 镜像是一个只读的模板,包含运行应用程序所需的所有文件、依赖和配置;镜像是容器的基础,容器是镜像的运行实例;

1、  镜像的本质:只读的分层模板

只读(Read-Only):镜像一旦创建,就不能修改里面的文件(比如不能直接在镜像里改 Nginx 的配置)。如果要改,只能基于原镜像 “新建一层” 来修改,生成新镜像(后面会讲分层存储);

包含所有依赖:比如一个 “Nginx 镜像” 里,已经预装了 Linux 系统最小环境、Nginx 软件、默认配置文件 —— 你不需要再手动装这些,直接用镜像启动容器就能用 Nginx;

容器的基础:容器是镜像的 “运行实例”—— 就像 “安装包” 和 “已安装的 APP” 的关系:1 个镜像可以启动无数个容器(比如用 Nginx 镜像启动 10 个容器,跑 10 个 Web 服务);

2、镜像的组成:分层存储(核心设计)

什么是分层?

镜像的每一层对应一个 “修改操作”;比如构建一个 Nginx 镜像:

第 1 层(基础层):最小的 Linux 系统(比如 Alpine,只有几 MB);

第 2 层:在 Linux 上安装 Nginx 软件;

第 3 层:修改 Nginx 的默认配置文件;

最终镜像 = 这 3 层的叠加(但对外展示为一个整体);

分层存储的 2 个核心好处:

节省空间(复用层):如果多个镜像共用同一层,只需要存一次。比如你有 “Nginx 镜像” 和 “Apache 镜像”,它们都基于 “Alpine 基础层”—— 这个基础层只存 1 份,不用为两个镜像各存 1 份,大大节省硬盘空间;

加速构建和下载:修改镜像时,只需要重新构建 “变化的层”,不用全部重写。比如你在 Nginx 镜像的基础上改了一行配置(第 3 层),重新构建时只需要生成新的第 3 层,第 1、2 层可以复用,速度更快;下载时也只需要下载变化的层;

镜像的元数据:

作者:maintainer=”[email protected]”;

版本:通过 “标签(Tag)” 体现,比如 nginx:1.25(1.25 是版本号)、nginx:latest(latest 表示最新版);

构建时间:镜像创建的时间;

3.2、从 Docker Hub 获取镜像(最常用)

Docker Hub 是 Docker 官方的 “公共镜像仓库”—— 相当于一个 “APP 应用商店”,里面有官方维护的镜像(比如 Nginx、MySQL 官方镜像)和社区分享的镜像,任何人都能免费下载;

1、搜索镜像(找想要的镜像)

docker search nginx

使用魔法

作用:在 Docker Hub 上搜索所有名字包含 “nginx” 的镜像,输出结果会显示镜像名、描述、星级(类似好评度)、是否官方镜像等;

nginx:Docker 官方维护的 Nginx 镜像,星级高达 21016,带有 [OK] 标识,是最常用的 Nginx 基础镜像;

其他组织/个人维护的镜像;NAME:镜像名称、DESCRIPTION:镜像的简要描述、STARS:镜像的星级(反映受欢迎程度)、OFFICIAL:是否为官方认证镜像([OK] 表示官方);

2、拉取镜像(下载到本地)

docker pull nginx:latest

docker pull:“拉取” 命令,从仓库下载镜像到本地;

nginx:镜像名(对应 Docker Hub 上的官方镜像 library/nginx);

latest:镜像的 “标签(Tag)”,指定要下载的版本(如果不写标签,默认下载 latest 版)。比如你想下载 1.25 版本的 Nginx,就用 docker pull nginx:1.25;

3、查看本地镜像

docker images

作用:列出本地所有已下载的镜像,输出结果包含:

REPOSITORY:镜像名(比如 nginx);

TAG:版本标签(比如 latest);

IMAGE ID:镜像的唯一 ID(类似身份证号);

SIZE:镜像大小;

3.3、私有仓库搭建

前面讲的 Docker Hub 是 “公共仓库”—— 所有人都能下载,也能上传(但公开的镜像别人能看到)。但在公司里,很多镜像包含业务代码或敏感配置,不能公开到 Docker Hub,这时候就需要 私有仓库(只能公司内部访问的 “专属镜像仓库”);

1、私有仓库的核心作用:

安全:内部镜像不对外暴露,避免敏感信息泄露;

可控:可以管理谁能上传 / 下载镜像(比如只有开发人员能上传,测试人员能下载);

加速:私有仓库部署在公司内网,下载 / 上传镜像比从外网的 Docker Hub 快得多;

2、私有仓库搭建:

Docker Compose 部署:

它是一个管理 “多容器应用” 的工具 —— 比如私有仓库需要 “仓库服务容器”,如果用传统命令启动,需要敲很多参数;用 Compose 可以把所有配置(容器名、端口、存储、环境变量)写在一个 docker-compose.yml 文件里,然后用一条命令启动所有容器,非常方便;

3、安装必要工具

安装 htpasswd 工具

yum install -y httpd-tools

作用:htpasswd 是用来生成 “用户密码文件” 的工具 —— 私有仓库需要身份验证(不是谁都能访问),这个工具用来创建 “用户名 + 加密密码” 的配置文件(比如让 admin 用户用密码 123456 登录);

安装 Docker Compose,核心是把 docker-compose 程序放到 /usr/local/bin/ 目录(系统能找到的命令路径),并赋予执行权限

下载指定版本(以v2.24.6为例,可替换为最新版本)

curl -L "https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

或者传这个 docker-compose;

暂时无法在飞书文档外展示此内容

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

赋予执行权限

chmod +x /usr/local/bin/docker-compose

验证

docker-compose --version

4、编写 Compose 配置文件(关键)

创建目录(规范文件存放)

mkdir docker-registry && cd docker-registry

作用:创建一个专门的目录 docker-registry,把私有仓库的配置文件放在这里,避免文件混乱;

编写 docker-compose.yml 文件

vim docker-compose.yml

version: ‘3.8’

Compose 文件的版本(对应 Docker 版本,不用纠结,用给的即可)

services:

定义要启动的服务(这里只有“registry”一个服务,即私有仓库服务)

registry:

服务名(自定义,比如叫 registry)

image: registry:latest

用官方的“registry 镜像”来启动私有仓库(这个镜像专门用来搭建私有仓库)

ports:

端口映射:把“宿主机的 5000 端口”映射到“容器的 5000 端口”

  • “5000:5000”

registry 服务默认监听容器的 5000 端口,映射后通过宿主机的 5000 端口访问私有仓库

environment:

环境变量:配置私有仓库的身份验证

REGISTRY_AUTH: htpasswd

启用 htpasswd 方式的身份验证(就是用之前装的 htpasswd 工具生成的密码文件)

REGISTRY_AUTH_HTPASSWD_PATH: auth/htpasswd

密码文件的路径(容器内的路径,后面会通过卷映射到本地)

REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm

登录时的提示信息(自定义,比如“请输入私有仓库账号密码”)

volumes:

卷映射:把容器内的目录“挂载”到宿主机,避免容器删除后数据丢失

  • /var/lib/registry:/var/lib/registry

私有仓库存储镜像数据的目录(挂载到宿主机的 /var/lib/registry,镜像数据存在宿主机,容器删了数据还在)

  • ./auth:/auth

密码文件所在的目录(挂载到宿主机当前目录的 auth 文件夹,方便本地修改密码)

restart: always

容器重启策略:无论什么原因容器停止,都自动重启(保证私有仓库一直运行)

version: '3.8'services:registry:image: registry:latestports:- "5000:5000"environment:REGISTRY_AUTH: htpasswdREGISTRY_AUTH_HTPASSWD_PATH: auth/htpasswdREGISTRY_AUTH_HTPASSWD_REALM: Registry Realmvolumes:- /var/lib/registry:/var/lib/registry- ./auth:/authrestart: always

启动私有仓库

docker-compose up -d

up:启动配置文件中定义的所有服务;

-d:后台运行(守护态),不会占用当前终端;

验证容器是否启动

docker ps

查看输出列表,如果有一个名为 docker-registry_registry_1(服务名 + 目录名组合)的容器,状态是 Up,说明私有仓库启动成功;

CONTAINER ID:容器唯一标识符;

IMAGE:创建容器所使用的镜像,这里是 registry:latest(Docker 官方的镜像仓库服务镜像);

COMMAND:容器启动时执行的命令,即启动 registry 服务的入口命令;

CREATED:容器创建时间;

STATUS:容器运行状态;

PORTS:端口映射情况,宿主机的 5000 端口(TCP 协议)映射到容器的 5000 端口,实现外部访问容器内的 registry 服务;

NAMES:容器名称;

这个结果表明当前有一个基于 registry:latest 镜像运行的容器,主要提供 Docker 镜像仓库服务,通过宿主机的 5000 端口可访问该服务;

5、私有仓库的身份验证配置(谁能访问)

私有仓库需要 “账号密码” 才能登录,避免陌生人访问,这一步用 htpasswd 工具配置:

生成账号密码文件

htpasswd -Bbn admin 123456 > auth/htpasswd

htpasswd:生成密码文件的工具;

-B:用 bcrypt 算法加密密码(更安全);

-b:在命令行直接输入密码(不用交互式输入);

-n:只输出密码到终端,不写入文件(后面用 > 重定向到文件);

admin:用户名(自定义,比如叫 dev);

123456:密码(自定义,实际环境要设复杂密码);

auth/htpasswd:把生成的 “用户名:加密密码” 写入 auth/htpasswd 文件(auth 目录会自动创建);

查看密码文件,加密后的密码(不是明文,安全)

cat auth/htpasswd

验证私有仓库是否能正常访问

curl http://10.4.7.23:5000/v2/_catalog -u "admin:123456"

curl:发送 HTTP 请求的工具;

http://localhost:5000/v2/_catalog:私有仓库的 API 接口,用来查看仓库里的所有镜像(空仓库时返回空列表);

-u “admin:123456″:带上账号密码进行身份验证;

6、私有仓库的登录

搭建好私有仓库后,需要知道 “怎么把本地镜像传到仓库(推送)、怎么从仓库下载镜像(拉取)”;

登录私有仓库:

docker login localhost:5000

注意:如果私有仓库部署在另一台服务器,把 localhost 换成服务器 IP;

7、私有仓库的推送镜像:

不能直接把 nginx:latest 推到私有仓库,需要先给镜像 “打标签”(告诉 Docker 这个镜像要推到哪个私有仓库);

给镜像打标签

docker tag nginx:latest localhost:5000/my-nginx:latest

docker tag:给镜像打标签的命令;

nginx:latest:本地已有的镜像(源镜像);

localhost:5000/my-nginx:latest:新标签,格式是 [私有仓库地址]/[镜像名]:[标签]:

打标签后,用 docker images 会看到两个 “看似不同但实际相同” 的镜像:nginx:latest 和 localhost:5000/my-nginx:latest—— 它们的 IMAGE ID 相同,只是标签不同,本质是同一个镜像

docker images

推送镜像,把打了私有仓库标签的镜像推到仓库中

docker push localhost:5000/my-nginx:latest

8、私有仓库的拉取镜像

在另一台机器上(比如测试机),要使用私有仓库的 my-nginx 镜像,需要先登录,再拉取:

vim /etc/docker/daemon.json

配置镜像加速源

{"insecure-registries": ["10.4.7.23:5000"]}systemctl daemon-reloadsystemctl restart dockerdocker --versiondocker login 10.4.7.23:5000

输入仓库的用户名和密码进行认证

docker pull 10.4.7.23:5000/my-nginx:latestdocker images

拉取成功后,用 docker images 就能看到这个镜像,然后可以用 docker run 启动容器;

查看私有仓库中的镜像

curl -u "admin:123456" http://localhost:5000/v2/_catalog

| | | | | | — | — | — | — | | | | | |

学网安,就业有保障,带你冲刺10-40万年薪!

招生要求:

| | | | — | — | | 学历与年龄 | 30岁以下大学本科毕业生(条件优秀可放宽到专科) | | 能力 | 具备基本逻辑思维能力,可耐心排查问题,接受“终身学习“的行业属性 | | 目标 | 明确想从事网络安全相关岗位(如安全运维、渗透测试、安全服 务等 | | 健康 | 身心健康 |

适合人群:

| | | — | | 零基础,转行一族 | | 高校应往届与在校生 | | IT职场转型者 |

北京昊网科技网络安全工程师培训,前沿技能教学 + 项目实训 + 就业全流程服务,从技能打磨到岗位对接一站式赋能。

咨询对接:黎歌|18500324210(同微信)

签约《就业保障服务协议》,未达成协议内就业标准,全额退费。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:北京昊网CTF题解 北京昊网 北京昊网《镜像 | Docker容器【三】》

评论:0   参与:  0