文章目录
- 前言
- 理论部分
- 8_镜像的创建
- 8.1_Docker 镜像结构
- 8.2_Dockerfile 指令详解
- 8.3_镜像三种创建方式
- 9_Compose编排
- 9.1_Compose 核心概念
- 9.2_YAML 语法规范
- 10_Harbor私有仓库
- 10.1_Harbor 核心组件
- 10.2_Harbor 安全机制
- 实验部分
- 8_镜像的创建
- 8.1_构建 Apache 镜像
- 9_Compose编排
- 9.1_安装 Docker Compose
- 10_Harbor私有仓库
- 10.1_部署 Harbor
- 10.2_客户端配置与镜像推送
- 结语
前言
本文系统梳理 Docker 镜像创建、Docker Compose 编排及 Harbor 私有仓库三大核心内容,涵盖理论原理、操作命令、配置文件路径、端口设置、构建流程与部署细节。所有知识点严格依据原始教案整理,确保无遗漏、可复现、易查阅。
- 镜像的创建(含 Dockerfile 详解、分层机制、构建命令)
- Docker Compose 编排(含 YAML 语法、Nginx+Tomcat 示例、安装命令)
- Harbor 私有仓库(含组件说明、部署步骤、客户端配置、推送流程)
理论部分
8_镜像的创建
Docker镜像通过分层方式构建并复用缓存,运行时在镜像之上独立建立容器读写层,并通过写时复制机制实现高效隔离和复用。
- Docker 镜像是一个特殊的只读文件系统,包含容器运行所需的程序、库、资源、配置及运行时参数(如环境变量、用户、匿名卷等),但不包含动态数据。
- 镜像采用分层结构,底层共享宿主机 kernel,仅需提供 rootfs(根文件系统),因此如 CentOS 镜像可精简至约 200MB。
- 镜像定制的核心方式是编写Dockerfile,通过脚本化指令实现透明、可复用、自动化的镜像构建。
8.1_Docker 镜像结构
镜像分层机制:
- 镜像由多层 read-only 的 rootfs 构成,每层对应 Dockerfile 中的一条指令。
- 容器启动时,在镜像最上层叠加一个 read-write 层,所有文件修改均写入此层。
- 删除容器时,仅删除该 read-write 层,底层镜像不变。
镜像缓存规则:
- 每条 Dockerfile 指令生成一个镜像层,并被缓存复用。
- 若某层指令、复制文件或构建变量发生变化,则该层及之后所有层缓存失效。
- 镜像层不可变:若某层添加文件,下一层删除,该文件仍存在于镜像中,仅在容器中不可见。
8.2_Dockerfile 指令详解
Dockerfile 结构四部分:
- 基础镜像信息(FROM)
- 维护者信息(MAINTAINER)
- 镜像操作指令(RUN、ADD、COPY 等)
- 容器启动指令(CMD、ENTRYPOINT)
常用指令列表:
FROM:指定基础镜像,必须为第一行MAINTAINER:指定维护者信息RUN:执行命令并提交到镜像层CMD:容器启动默认命令,可被docker run覆盖ENTRYPOINT:容器启动主命令,参数由CMD提供,优先级:docker run>ENTRYPOINT>CMDEXPOSE:声明容器监听端口ENV:设置环境变量,Linux的PATH=也可以设置环境变量。ADD:复制文件/目录,支持 URL 下载和自动解压COPY:仅复制本地文件/目录VOLUME:创建挂载点USER:设置运行用户WORKDIR:设置工作目录ONBUILD:作为基础镜像时触发的指令HEALTHCHECK:设置健康检查命令
Dockerfile 编写规范:
- 第一行必须为
FROM - 推荐第二行为
MAINTAINER - 中间为镜像操作指令(每条新增一层)
- 最后使用
CMD或ENTRYPOINT指定启动命令
8.3_镜像三种创建方式
- 基于现有镜像创建:修改容器后
docker commit - 基于本地模板创建:
docker import导入 tar 包 - 基于 Dockerfile 创建:
docker build(推荐)
9_Compose编排
- Docker Compose 是 Docker 官方开源项目,用于通过单个 YAML 文件定义和管理多容器应用,简化部署与联动。
- Compose 项目由 Python 编写,调用 Docker API,适用于任何支持 Docker API 的平台。
- Compose 将容器管理分为三层:工程(project)、服务(service)、容器(container)。
9.1_Compose 核心概念
工程(Project):由docker-compose.yml及相关文件组成,默认以目录名为工程名。
服务(Service):定义容器镜像、参数、依赖,一个服务可含多个容器实例。
容器(Container):服务的具体运行实例。
注意:Compose 本身不提供负载均衡,需借助 Consul 等工具实现服务发现。
9.2_YAML 语法规范
YAML 基本规则:
- 大小写敏感
- 使用空格缩进(禁用 Tab),推荐 2 空格
- 列表项以
-开头 - 字典键值对格式:
key: value(冒号后需空格) - 注释以
#开头 - 特殊字符串可用
'或"包裹
10_Harbor私有仓库
- Harbor 是企业级 Docker 镜像仓库,基于官方 Registry 增强,提供 Web UI、RBAC、LDAP 集成、镜像复制、漏洞扫描、审计日志等功能。
- Harbor 通过
docker-compose.yml启动一组容器协同工作。
10.1_Harbor 核心组件
| 组件 | 功能 |
|---|---|
| nginx | 反向代理,统一入口 |
| registry | 存储镜像,处理 push/pull 请求 |
| harbor-core / harbor-ui | Web 界面与 API 服务 |
| harbor-db | 存储用户、项目、权限等元数据 |
| harbor-jobservice | 处理异步任务(如跨实例复制) |
| harbor-log | 日志收集服务 |
| harbor-portal | 前端页面(新版本) |
10.2_Harbor 安全机制
- 默认使用 HTTP,但 Docker 客户端默认只信任 HTTPS 仓库。
- 开发/测试环境可通过配置
--insecure-registry允许 HTTP 访问。 - 生产环境应配置有效 HTTPS 证书。
实验部分
8_镜像的创建
8.1_构建 Apache 镜像
① 准备网站页面
mkdir/opt/apache&&cd/opt/apacheecho"this is test web">index.html② 编写启动脚本 run.sh
vimrun.sh#!/bin/bashrm-rf /run/httpd/* /usr/sbin/apachectl -D FOREGROUND
rm -rf /run/httpd/*:清理 httpd 运行时缓存apachectl -D FOREGROUND:前台运行,确保 PID 1 进程持续,容器不退出
③ 编写 Dockerfile
vimDockerfile# 基于的基础镜像 FROM centos:7 # 维护镜像的用户信息 MAINTAINER this is apache image <dockerfile@topen.top> # 清空yum源配置文件及缓存 RUN rm -f /etc/yum.repos.d/* # 添加yum镜像源 ADD https://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/ ADD https://mirrors.aliyun.com/repo/epel-7.repo /etc/yum.repos.d/ # 刷新yum缓存 RUN yum clean all && yum makecache # 镜像操作指令安装apache软件 RUN yum -y install httpd # 开启 80端口 EXPOSE 80 # 复制网站首页文件 ADD index.html /var/www/html/index.html # 将执行脚本复制到镜像中 ADD run.sh /run.sh RUN chmod 755 /run.sh # 启动容器时执行脚本 CMD ["/run.sh"]④ 构建镜像
dockerbuild -t httpd:centos.
-t:指定镜像名称和标签.:表示 Dockerfile 所在当前目录
⑤ 运行容器
dockerrun -d -p8083:80 httpd:centos
-d:后台运行-p 8083:80:将宿主机 1216 端口映射到容器 80 端口
⑥ 测试访问
curlhttp://192.168.10.23:1216/9_Compose编排
9.1_安装 Docker Compose
① 下载并安装
curl-L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname-s`-`uname-m`-o /usr/local/bin/docker-composechmod+x /usr/local/bin/docker-compose
curl -L:跟随重定向下载`uname -s`-`uname -m`:自动适配操作系统和架构
② 验证版本
docker-compose--version10_Harbor私有仓库
10.1_部署 Harbor
① 下载离线安装包(略,假设已解压至/usr/local/harbor)
② 编辑配置文件
vim/usr/local/harbor/harbor.ymlhostname:192.168.10.23http:port:80data_volume:/data
hostname:Harbor 访问地址(IP 或域名)http.port:Web UI 监听端口data_volume:镜像与数据库存储路径
③ 执行安装
cd/usr/local/harbor ./prepare ./install.sh④ 查看服务状态
docker-composeps10.2_客户端配置与镜像推送
① 配置 Docker 信任 HTTP 仓库
vim/usr/lib/systemd/system/docker.service在ExecStart行末尾添加:
--insecure-registry 192.168.10.23② 重启 Docker 服务
systemctl daemon-reload systemctl restartdocker③ 登录 Harbor
dockerlogin -u admin -p Harbor12345 http://192.168.10.23④ 打标签并推送镜像
dockertag nginx:latest192.168.10.23/myproject-yjs/nginx:v1dockerpush192.168.10.23/myproject-yjs/nginx:v1
myproject-yjs:Harbor 中已创建的项目名(需提前在 Web UI 创建)
结语
镜像分层:每条 Dockerfile 指令生成一层,缓存机制提升构建效率
前台运行:容器内主进程必须前台运行(PID 1),否则容器退出
Compose 编排:YAML 文件定义多服务,depends_on控制启动顺序
Harbor 安全:HTTP 仓库需显式配置--insecure-registry才能推送
[!question] 为什么 Docker 中的 CentOS 镜像只有 200MB?
因为镜像只需提供 rootfs(基本命令、工具、库),底层直接复用宿主机 kernel,无需包含 bootfs。
[!question] Dockerfile 中 ADD 和 COPY 有什么区别?
ADD 支持 URL 下载和自动解压 tar.gz 等归档文件;COPY 仅复制本地文件,更透明安全。
[!question] 容器运行后修改了文件,删除容器后文件还在吗?
不在。所有修改写入顶层 read-write 层,删除容器即删除该层,修改丢失。
[!question] Harbor 默认使用什么端口提供 Web 服务?
默认 HTTP 端口为 80,可在 harbor.yml 中通过http.port修改。
[!question] Docker Compose 的配置文件默认叫什么?
默认为docker-compose.yml,可通过-f参数或COMPOSE_FILE环境变量指定其他文件。