本页面提供了关于容器化概念、工具和实践的全面概述,以及它们与 DevOps 工作流程的关系。它涵盖了容器基础知识、镜像管理、容器创建和运行、网络、存储以及安全最佳实践。有关容器编排的特定信息,请参阅Kubernetes 管理。
容器是轻量级、可移植且隔离的环境,用于打包应用程序及其依赖项。它们能够实现从开发到生产环境中一致的部署。
来源: topics/containers/README.md91-100
容器是一个隔离的执行环境,具有可配置的隔离和资源限制。根据开放容器倡议(OCI),容器将软件组件及其所有依赖项封装在一个自描述和可移植的格式中,允许任何兼容的运行时在没有额外依赖项的情况下运行它。
容器的关键特征
来源: topics/containers/README.md65-73 topics/containers/README.md78-80
| 功能 | 容器 | 虚拟机 |
|---|---|---|
| 隔离性 | 操作系统级虚拟化 | 硬件虚拟化 |
| 内核 | 与宿主共享 | 每个虚拟机单独 |
| 启动时间 | 秒 | 分钟 |
| 资源开销 | 低 | 高 |
| 安全 | 良好 | 更好 |
| 可移植性 | 优秀 | 有限 |
容器在以下情况下是理想的选择
虚拟机在以下情况下更适合
来源: topics/containers/README.md91-113
容器利用多种 Linux 内核功能来提供隔离
来源: topics/containers/README.md805-827
容器镜像是一个轻量级、独立、可执行的包,包含运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件。
容器镜像由多个只读层组成。关键特性
来源: topics/containers/README.md304-310 topics/containers/README.md1017-1023
镜像是一个只读模板,包含应用程序代码和依赖项。容器是镜像的一个运行实例,带有一个额外的可写层。
| 图片 | 容器 |
|---|---|
| 只读 | 镜像之上的读写层 |
| 模板/蓝图 | 运行实例 |
| 存储在注册表中 | 运行在宿主上 |
| 不可变。 | 可变状态 |
| 可与其他容器共享 | 拥有自己的文件系统状态 |
来源: topics/containers/README.md83-88 topics/containers/README.md1017-1023
来源: topics/containers/README.md518-522 topics/containers/README.md525-528
容器实现通常包含多个组件
来源: topics/containers/README.md886-899 topics/containers/README.md902-909 topics/containers/README.md912-923
开放容器倡议(OCI)是一个开放的治理结构,旨在标准化容器格式和运行时。OCI 维护以下规范:
符合 OCI 的容器必须支持基本操作:创建、启动、停止、删除和查询状态。
来源: topics/containers/README.md1240-1248 topics/containers/README.md1251-1254
容器生命周期中的基本操作包括
来源: topics/containers/README.md147-156 topics/containers/README.md177-185
| 操作 | 命令示例 |
|---|---|
| 运行容器 | podman run ubuntu |
| 列出正在运行的容器 | podman container ls |
| 列出所有容器 | podman container ls -a |
| 在容器中执行命令 | podman container exec -it [容器] bash |
| 停止容器 | podman container stop [容器] |
| 移除容器 | podman container rm [容器] |
| 在后台运行 | podman container run -d [镜像] |
| 映射端口 | podman run -p 8080:80 [镜像] |
来源: topics/containers/README.md138-219
Containerfile(或 Docker 的 Dockerfile)是一个文本文件,其中包含构建容器镜像的说明。每条指令都会在镜像中创建一个新层。
常用指令包括
来源: topics/containers/README.md615-618 topics/containers/README.md628-635
使用 podman build 或 docker build 构建镜像时
构建缓存
来源: topics/containers/README.md418-425 topics/containers/README.md428-439
多阶段构建允许你在 Containerfile 中使用多个 FROM 语句,每个 FROM 语句都开启一个新的构建阶段。这使你能够
来源: topics/containers/README.md1060-1073
来源: topics/containers/README.md452-458 topics/containers/README.md638-645
容器网络支持通信
关键网络概念
来源: topics/containers/README.md1090-1098 topics/containers/README.md1104-1120
| 网络类型 | 描述 | 用例 |
|---|---|---|
| 桥接 | 将容器桥接到主机的默认网络 | 大多数独立容器 |
| 主机 | 容器共享主机的网络命名空间 | 最大性能,无隔离 |
| 无 | 容器没有网络访问权限 | 最大安全隔离 |
| Overlay | 多主机网络 | 容器编排 |
| Macvlan | 容器在物理网络上获得 MAC 地址 | 遗留应用程序 |
使容器服务可以从主机或外部网络访问
podman run -d --name apache1 -p 8080:80 httpd
这会将容器中的端口 80 映射到主机上的端口 8080。
来源: topics/containers/README.md212-218
容器提供不同的存储选项
临时存储:可写容器层中的默认存储
持久化存储:
来源: topics/containers/README.md754-767 topics/containers/README.md771-796
创建和使用卷
podman volume create my_volume
podman run -v my_volume:/path/in/container image_name
挂载主机目录
podman run -v /host/path:/container/path image_name
来源: topics/containers/README.md771-796
关键安全建议
--privileged 标志运行容器来源: topics/containers/README.md1140-1147 topics/containers/README.md1151-1155
无根容器在主机上无需 root 权限即可运行,从而提供额外的安全优势
使用无根容器时的注意事项
来源: topics/containers/README.md1198-1203 topics/containers/README.md1206-1217 topics/containers/README.md1219-1234
生产容器的最佳实践
latest)来源: topics/containers/README.md1162-1178
重启策略决定了容器如何从故障中恢复
这些策略为容器提供了基本的自我修复能力。
来源: topics/containers/README.md1182-1193
容器化是现代 DevOps 实践中的一项基本技术,它提供了一种标准化的方式来打包、分发和运行包含其依赖项的应用程序。通过理解容器基础知识、镜像管理、网络、存储和安全最佳实践,团队可以在其开发和部署工作流中有效地利用容器。
有关生产环境中更高级的容器管理,请考虑使用 Kubernetes 管理 来探索容器编排。