Docker 容器十诫

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文作者为 Rafael Benevides,主要介绍使用 Docker 容器时应该注意的十个陷阱。文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。

【编者按】本文作者为 Rafael Benevides,主要介绍使用 Docker 容器时应该注意的十个陷阱。文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。

Docker 容器十诫

当你刚开始使用容器时,会发现容器能解决许多问题,而且好处很多:

  1. 首先:容器是不可变的 —— 操作系统、库版本、配置、文件夹以及应用全都包裹在容器内。你可以确保,在 QA 阶段测试的一张图片,肯定会在生产环境中出现,并且行为保持一致。
  2. 其次:容器是轻量级的 —— 容器的内存占用很小。容器只会给主进程分配内存,因此无需十几万个 MB 的内存空间。
  3. 最后:容器速度很快 —— 启动容器就跟启动典型的 linux 进程一样快。无需好几分钟,一个新的容器可以在几秒内启动完毕。

然而,许多用户仍然只是将容器视为典型的虚拟机。他们忘记了容器的一个重要特征:容器是可丢弃的

围绕容器的咒语:“容器是临时的”。

Docker 容器十诫

鉴于这一特征,用户必须转变他们使用以及管理容器时的心态。下面,笔者将介绍为了充分利用 Docker 容器的好处,用户应该避免的十个陷阱:

1)不要在容器内存储数据 —— 容器可以被停止、销毁或者取代。运行在容器中的应用1.0版本应该能够轻易地被1.1版本所取代,且不产生任何影响或数据丢失。因此,如果你需要存储数据,请将其存储在卷组(volume)中。在这种情况下,你要格外小心两个容器向同一卷组写入数据的情况,因为这很容易导致数据污染。总之,要确保自己的应用向共享的数据存储区填写数据。

2)不要将应用分开发布 —— 有些人会将容器视为虚拟机,他们中的大部分人认为,应该在现有的运行容器中部署应用。在开发阶段,因为需要不断地修改配置并调试应用,这样做无可厚非。但是,当持续交付管道行进至 QA 与生产阶段时,不应该把镜像和应用分开。记住:容器是不可变的。

3)不要创建太大的镜像 —— 镜像越大,越难以分发。确保只留有运行应用或进程所需的文件和库。不要安装不必要的包或运行“update”(yum update)指令下载太多文件到新的镜像层。

更新:关于这条建议,有一篇解释更为详尽的文章:《保持小巧:细究 Docker 镜像大小》

4)不要使用单层镜像 —— 为了有效利用分层的文件系统,总是为操作系统创建基础镜像层,此外,分别为用户名定义运行时安装、配置、以及自己的应用创建不同的镜像层。这样一来,重现、管理以及传送镜像会变得更为简单。

5)不用为运行中的容器创建镜像 —— 换句话说,不要使用 “docker commit” 指令创建镜像。这种创建镜像的方法是不可重现的,应该完全避免。相反,总是使用 Dockerfile 或任何 S2I (source-to-image,源码到镜像) —— 完全可重现的方法来创建镜像。这样一来,如果你将 Dockerfile 保存在源码存储控制库(git)内,就可以追踪其后续变化。

6)不要单独使用“latest(最新)”标签 —— 最新标签就像 Maven 用户眼中的 “SNAPSHOT(快照)”。因为容器本身的分层式文件系统,我们鼓励使用标签。但是,你可不想在几个月后正打算创建镜像时,却惊讶地发现应用无法运行,而原因居然是一个父层(Dockerfile 中的 FROM)已经被无法向后兼容的新版取代,或是创建缓存中检索出的“最新”版本是错的。此外,由于你无法追踪当前运行镜像的版本,“最新”标签也不应该在生产环境中部署容器时使用。

7)不要在一个容器内运行多个进程 —— 容器在运行单一进程(http 后台进程、应用服务器、数据库)时几乎无可挑剔,但是,如果运行多个进程,你可能会在管理、检索日志以及独个更新进程时遇到麻烦。

8)不要在镜像中存储凭证 —— 使用环境变量。不要将镜像中的任何用户名或密码写死。使用环境变量从容器外部检索这些信息。Postgress 镜像就是践行该准则的好榜样。

9)不要以 root 用户运行进程 —— “默认情况下,docker 容器以 root 权限运行。(…)随着 Docker 的不断完善,更多安全的默认选项会逐渐出现。就当下而言,要求 root 权限对有些用户而言比较危险,可能无法在所有环境中实现。你的镜像应该使用 USER 指令为容器确定一个非 root 运行权限。”(摘自《Docker 镜像作者指南》

10)不要依赖 IP 地址 —— 每个容器都有其内部 IP 地址,该地址可能因为启动或停止容器而发生改变。如果你的应用或微服务需要与另一个容器交换消息,应该使用环境变量在容器间传送合适的主机名与端口号。

本文转自 OneAPM 官方博客

原文地址:http://developerblog.redhat.com/2016/02/24/10-things-to-avoid-in-docker-containers/

相关文章
|
8天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
132 77
|
17天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
1天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
10 2
实战~如何组织一个多容器项目docker-compose
|
10天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
44 3
|
17天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
50 7
|
17天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
27 5
|
17天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
41 4
|
17天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
44 3
|
17天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
25 2
|
17天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
33 1