CNB 云原生开发环境中已经预装了 Docker,无需手动安装,直接体验即可。
docker version # 查看版本信息 docker info # 查看运行时信息
docker run hello-world
学习一门新语言,第一个程序是输出 hello world!
学习 Docker,第一个容器运行输出 hello from Docker!
扩展知识:
Alpine 镜像在企业生产环境中被广泛应用:
- 极简的 Linux 发行版
- 只包含基本命令和工具
- 镜像体积小(约 8MB)
- 内置包管理系统
apk- 常用作其他镜像的基础
# 拉取 alpine 镜像,默认以 latest 标签拉取
docker pull alpine
docker image ls
镜像格式:[REGISTRY_HOST[:PORT]/]PATH[:TAG]
docker.io[NAMESPACE/]REPOSITORY。其中NAMESPACE值得是用户或者组织名,若未指定则默认为 library完整镜像示例:
alpine等同于docker.io/library/alpine:latest
docker.cnb.cool/docker-666/campus-academy-template/dev-env:latesteg:
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker.cnb.cool/docker-666/campus-academy-template/dev-env latest 890755180ee4 7 hours ago 722MB mongo 6 bdc4e039b30b 8 weeks ago 764MB
镜像分为两种类型:
# 公开镜像(正常拉取)
docker pull docker.cnb.cool/coldenn/docker-open-camp/docker-exercises/my-alpine:latest
# 私有镜像(拉取失败)
docker pull docker.cnb.cool/docker-open-camp/private-repo/my-alpine
docker login [-u ${username}] [-p ${password}] ${repository}
docker image rm ${image_id}
docker history ${image_id}
docker run alpine
docker ps
问题:为什么看不到刚启动的容器?
原因:容器没有前台进程会立即退出
查看所有容器(包括已停止的):
docker ps -a
docker run -it alpine # 等效于 docker run -it alpine /bin/sh
# 查看镜像默认命令 docker inspect alpine | grep -A 5 "Cmd"
参数说明:
-it:分配交互式终端(interactive + TTY)-d:后台运行容器(detached mode)run -it 命令会启动一个交互式终端,退出终端后容器也会停止,如果希望容器在后台运行,可以使用 -d 参数
进入容器:
# 以交互模式进入容器(推荐)
docker exec -it <container_id> /bin/bash
# 如果容器没有 bash,可以尝试 sh. 那scratch ?
docker exec -it <container_id> /bin/sh
# 执行单条命令(不进入交互模式)
docker exec <container_id> ls -la /app
docker run -d alpine
docker exec -it <container_id> /bin/sh
进程查看示例:
/ # ps -ef PID USER TIME COMMAND 1 root 0:00 /bin/sh 13 root 0:00 /bin/sh 19 root 0:00 ps -ef
PID=1 的进程为 /bin/sh, 而另一个 /bin/sh 进程则是我们通过 exec 命令启动的,这个进程退出不会影响 PID=1 的进程,也就不会导致容器的退出
docker attach <container_id>
注意:
attach 会接管 PID=1 的进程,如果该进程退出,容器也会退出
docker inspect <container_id>
docker logs <container_id>
| 序号 | 使用场景 | 核心价值 | 解决的问题 | Docker方案 |
|---|---|---|---|---|
| 1 | 单体应用微服务化 | 渐进式拆分 | 大系统难维护、难扩展 | 逐步拆分为微服务容器 |
| 2 | 加速应用开发 | 环境一致性 | 新人上手慢、并行开发难 | 提供标准化开发容器 |
| 3 | 基础设施即代码 | 可重复配置 | 配置漂移、环境不一致 | Dockerfile定义即代码 |
| 4 | 多环境标准化部署 | 消除差异 | "我机器上能跑"问题 | 同一镜像多环境部署 |
| 5 | 松耦合架构 | 故障隔离 | 单点故障影响全局 | 服务容器化隔离 |
| 6 | 多租户隔离 | 安全隔离 | 租户间相互影响 | 容器级租户隔离 |
| 7 | 加速CI/CD流水线 | 并行构建 | 构建部署太慢 | 容器化CI/CD并行执行 |
| 8 | 隔离应用环境 | 依赖隔离 | 多项目依赖冲突 | 每项目独立容器 |
| 9 | 应用跨平台分发 | 可移植性 | 跨平台部署复杂 | 镜像打包一次到处跑 |
| 10 | 混合云/多云部署 | 云平台无关 | 厂商锁定风险 | 容器化实现云无关 |
| 11 | 降低IT成本 | 资源高效 | 服务器资源浪费 | 容器高密度部署 |
| 12 | 灾难恢复 | 快速恢复 | 故障停机时间长 | 预构建镜像快速启动 |
| 13 | 简化弹性扩展 | 按需扩缩 | 扩容流程复杂耗时 | K8s自动扩缩容 |
| 14 | 依赖管理 | 依赖打包 | 依赖地狱版本混乱 | 依赖打包进镜像 |
| 15 | 提升安全性 | 容器隔离 | 攻击面大隔离不足 | 容器隔离+权限控制 |
OCI 定义的镜像包括4个部分:镜像索引(Image Index)、清单(Manifest)、配置(Configuration)和层文件(Layers)。镜像索引是镜像中可选择的部分,一个镜像可以不包括镜像索引。如果镜像包含了镜像索引,则其作用主要指向镜像不同平台的版本,代表一组同名且相关的镜像,差别只在支持的体系架构上。


OverlayFS 是一种 联合文件系统(Union Filesystem),它通过 堆叠多层目录 实现文件系统的叠加,主要分为:
• Lower Dir(镜像层):只读的基础层(可以是多个,对应 Docker 镜像的每一层)。
• Upper Dir(容器层):可写层,容器运行时新增或修改的文件会存储在这里。
• Merged Dir(合并视图):用户看到的最终统一文件系统,是上下层叠加后的结果同名文件覆盖 访问文件时,优先从 upperdir 读取
假设镜像层(lowerdir)有一个文件 /galaxy,而容器层(upperdir)也创建了同名文件:
# 镜像层(只读) lowerdir/ └── galaxy # 内容:"Hello from image" # 容器层(可写) upperdir/ └── galaxy # 内容:"Hello from container" # 用户看到的合并视图 merged/ └── galaxy # 实际显示 "Hello from container"(上层覆盖下层)
当删除容器层的 galaxy 文件时: 容器层会创建 whiteout 文件
upperdir/ └── galaxy # 特殊字符文件表示删除 合并视图 mergeddir/ └── galaxy # 文件消失(实际被隐藏)
• 镜像层:Docker 镜像的每一层(如 FROM alpine, RUN apk add)都是 lowerdir。
• 容器层:启动容器时创建的 upperdir 是可写层,存储所有运行时修改。
• 性能优化:OverlayFS 通过 写时复制(Copy-on-Write) 避免直接修改镜像层,提升效率。

运行以下命令查看 Docker 是否使用 OverlayFS:
docker info | grep "Storage Driver"
输出示例:
Storage Driver: overlay2
Namespace 和 cgroups 是 Linux 内核提供的两种资源隔离技术,用于实现容器的资源隔离和限制。
