Docker 容器十诫
【编者按】本文作者为 Rafael Benevides,主要介绍使用 Docker 容器时应该注意的十个陷阱。
Docker 容器十诫
当你刚开始使用容器时,会发现容器能解决许多问题,而且好处很多:
首先:容器是不可变的 —— 操作系统、库版本、配置、文件夹以及应用全都包裹在容器内。你可以确保,在 QA 阶段测试的一张图片,肯定会在生产环境中出现,并且行为保持一致。
其次:容器是轻量级的 —— 容器的内存占用很小。容器只会给主进程分配内存,因此无需十几万个 MB 的内存空间。
最后:容器速度很快 —— 启动容器就跟启动典型的 linux 进程一样快。无需好几分钟,一个新的容器可以在几秒内启动完毕。
然而,许多用户仍然只是将容器视为典型的虚拟机。他们忘记了容器的一个重要特征:容器是可丢弃的。
围绕容器的咒语:“容器是临时的”。
Docker 容器十诫
鉴于这一特征,用户必须转变他们使用以及管理容器时的心态。下面,笔者将介绍为了充分利用 Docker 容器的好处,用户应该避免的十个陷阱:
1)不要在容器内存储数据 —— 容器可以被停止、销毁或者取代。运行在容器中的应用1.0版本应该能够轻易地被1.1版本所取代,且不产生任何影响或数据丢失。因此,如果你需要存储数据,请将其存储在卷组(volume)中。在这种情况下,你要格外小心两个容器向同一卷组写入数据的情况,因为这很容易导致数据污染。总之,要确保自己的应用向共享的数据存储区填写数据。
2)不要将应用分开发布 —— 有些人会将容器视为虚拟机,他们中的大部分人认为,应该在现有的运行容器中部署应用。在开发阶段,因为需要不断地修改配置并调试应用,这样做无可厚非。但是,当持续交付管道行进至 QA 与生产阶段时,不应该把镜像和应用分开。记住:容器是不可变的。
3)不要创建太大的镜像 —— 镜像越大,越难以分发。确保只留有运行应用或进程所需的文件和库。不要安装不必要的包或运行“update”(yum update)指令下载太多文件到新的镜像层。
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 Cloud Insight 产品集监控、管理、计算、协作、可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效、简单。
Docker 容器十诫的更多相关文章
- Docker学习(十)Docker容器编排 Docker-compose
Docker学习(十)Docker容器编排 Docker-compose 标签(空格分隔): docker 容器编排是什么 应用一般由单独容器化的组件组成,须按照一定顺序在网络级别进行组织,以使其能够 ...
- Flask 教程 第十九章:Docker容器上的部署
本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- Docker容器监控(十)--技术流ken
docker自带的监控命令 docker自带了三个监控命令即ps, top, stats ps docker ps 可以帮助我们很快的了解当前正在运行的容器 -a:会显示已经停掉的容器 [root@h ...
- Docker(二十)-Docker容器CPU、memory资源限制
背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...
- 使用Docker容器的十大误区
转自:http://www.dockone.io/article/1264 对于用户来说,可能一开始在不了解的情况下会对容器报以拒绝的态度,但是在尝到容器的甜头.体验到它的强大性能之后,相信大家最终是 ...
- Docker(二十六)-Docker Compose编排容器
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
- Kubernetes & Docker 容器网络终极之战(十四)
目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...
- Docker容器监控(十)
docker自带的监控命令 docker自带了三个监控命令即ps, top, stats ps docker ps 可以帮助我们很快的了解当前正在运行的容器 -a:会显示已经停掉的容器 [root ...
随机推荐
- JS 数组和对象的遍历方式,以及几种方式的比较。
通常我们会用循环的方式来遍历数组.但是循环是 导致js 性能问题的原因之一.一般我们会采用下几种方式来进行数组的遍历: 方式1: for in 循环: var arr = [1,2,3,4,5]; v ...
- js 参数声明用var和不用var的区别
var 声明的变量,作用域是当前 function 没有声明的变量,直接赋值的话, 会自动创建变量 ,但作用域是全局的. //----------------- function doSth() { ...
- #C++初学记录(sort函数)
sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...
- Apache+php+mysql环境配置
Apache+PHP+MySQL环境搭建 标题格式 正文格式 阶段性完成格式 正文中强调格式 ————————————————————————————— 前语:本文是从我写过的doc文档迁移过来的,由 ...
- A7架构
以Cortex-A7 MPCore processor来进行说明,这是一款主打低功耗的多核处理器,采用ARMv7-A架构,最多支持4个core. 每个core都有L1级的Cache,分为instruc ...
- Python消息队列工具 Python-rq 中文教程
原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...
- Linux基础命令---last
last 显示以前登录过的用户信息,last指令会搜索/var/log/wtmp文件(或者是经过-f选项指定的文件),然后列出文件中所有的用户信息.如果执行last指令时提示“last /var/lo ...
- Ubuntu系统下使用Jenkins进行项目的自动构建还是项目回滚方法
上面虽然实现了项目的自动部署,但是有时部署失败的时候我们需要回滚到指定版本的构建,这样才能更灵活的进行项目的构建部署.我们可以选择“参数化的构建过程”进行传递不同的参数来选择是进行新的构建还是回滚 如 ...
- python之路----初识面向对象(二)
类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...
- (一)github之基础概念篇
1.github: 一项为开发者提供git仓库的托管服务, 开发者间共享代码的场所.github上公开的软件源代码全都由git进行管理. 2.git: 开发者将源代码存入名为git仓库的资料库中,而g ...