使用docker需要注意的十件事

当你最后投入容器的怀抱,发现它能解决很多问题,而且还具有众多的优点:

    第一:它是不可变的 – 操作系统,库版本,配置,文件夹和应用都是一样的。您可以使用通过相同QA测试的镜像,使产品具有相同的表现。

    第二:它是轻量级的 – 容器的内存占用非常小。不需要几百几千MB,它只要对主进程分配内存再加上几十MB。

    第三:它很快速 – 启动一个容器与启动一个单进程一样快。不需要几分钟,您可以在几秒钟内启动一个全新的容器。



但是,许多用户依然像对待典型的虚拟机那样对待容器。但是他们都忘记了除了与虚拟机相似的部分,容器还有一个很大的优点:它是一次性的。

容器的 准则 :

“容器是临时的”。

RH_Icon_Container_with_App_Flat

这个特性“本身”促使用户改变他们关于使用和管理容器的习惯;我将会向您解释在容器中不应该做这些事,以确保最大地发挥容器的作用。


1) 不要在容器中存储数据 –  容器可能被停止,销毁,或替换。一个运行在容器中的程序版本1.0,应该很容易被1.1的版本替换且不影响或损失数据。有鉴于此,如果你需要存储数据,请存在卷中,并且注意如果两个容器在同一个卷上写数据会导致崩溃。确保你的应用被设计成在共享数据存储上写入。

2) 不要将你的应用发布两份 –  一些人将容器视为虚拟机。他们中的大多数倾向于认为他们应该在现有的运行容器里发布自己的应用。在开发阶段这样是对的,此时你需要不断地部署与调试;但对于质量保证与生产中的一个连续部署的管道,你的应用本该成为镜像的一部分。记住:容器应该保持不变。
skyvoice7
skyvoice7


3) 不要创建超大镜像 – 一个超大镜像只会难以分发。确保你仅有运行你应用/进程的必需的文件和库。不要安装不必要的包或在创建中运行更新(yum更新)。

4) 不要使用单层镜像 – 要对分层文件系统有更合理的使用,始终为你的操作系统创建你自己的基础镜像层,另外一层为安全和用户定义,一层为库的安装,一层为配置,最后一层为应用。这将易于重建和管理一个镜像,也易于分发。

5) 不要为运行中的容器创建镜像 – 换言之,不要使用“docker commit”命令来创建镜像。这种创建镜像的方法是不可重现的也不能版本化,应该彻底避免。始终使用Dockerfile或任何其他的可完全重现的S2I(源至镜像)方法。


6) 不要只使用“最新”标签 – 最新标签就像Maven用户的“快照”。标签是被鼓励使用的,尤其是当你有一个分层的文件系统。你总不希望当你2个月之后创建镜像时,惊讶地发现你的应用无法运行,因为最顶的分层被非向后兼容的新版本替换,或者创建缓存中有一个错误的“最新”版本。在生产中部署容器时应避免使用最新。

7) 不要在单一容器中运行超过一个进程 – 容器能完美地运行单个进程(http守护进程,应用服务器,数据库),但是如果你不止有一个进程,管理、获取日志、独立更新都会遇到麻烦。


8) 不要在镜像中存储凭据。使用环境变量 –不要将镜像中的任何用户名/密码写死。使用环境变量来从容器外部获取此信息。有一个不错的例子是postgres镜像。

9) 使用非root用户运行进程 – “docker容器默认以root运行。(…)随着docker的成熟,更多的安全默认选项变得可用。现如今,请求root对于其他人是危险的,可能无法在所有环境中可用。你的镜像应该使用USER指令来指令容器的一个非root用户来运行。”(来自 Docker镜像作者指南)

10) 不要依赖IP地址 – 每个容器都有自己的内部IP地址,如果你启动并停止它地址可能会变化。如果你的应用或微服务需要与其他容器通讯,使用任何命名与(或者)环境变量来从一个容器传递合适信息到另一个。

### 如何通过 Docker 容器运行命令时设置内存限制 在使用 `docker container run` 命令时,可以通过特定的参数来设置容器的内存限制。这些参数允许用户控制分配给容器的资源量,从而优化性能并防止单个容器占用过多系统资源。 #### 设置内存限制的相关选项 以下是常用的与内存限制相关的参数及其说明: - **--memory 或 -m**: 该参数指定容器可以使用的最大内存量(单位为字节)。支持常见的大小缩写,如 `k`, `m`, 和 `g` 表示千字节、兆字节和吉字节[^4]。 - **--memory-swap**: 此参数定义了总可用交换空间加上内存的最大值。如果将其设为 `-1`,则表示不限制 swap 使用;否则应大于等于 `--memory` 的值[^5]。 - **--memory-reservation**: 这是一个软性限制,当主机上的内存充足时不生效,但在竞争激烈的情况下会尝试将此作为目标上限[^6]。 - **--kernel-memory**: 设定内核内存的最大用量。注意这不包括文件系统的缓存数据[^7]。 下面给出一些具体的例子展示如何应用上述选项。 #### 实际操作案例 ```bash # 创建一个新的容器, 并为其设定2GB内存硬限以及3GB的整体(含swap)界限. docker container run \ --name limited_memory_container \ -m 2g \ --memory-swap=3g \ ubuntu sleep infinity ``` 上面的例子创建了一个基于 Ubuntu 映像的新容器,并设置了两个主要约束条件:一是绝对不允许超过两吉字节的实际物理 RAM 使用率;二是考虑到虚拟存储后总的可利用容量不得超过三个吉字节[^8]。 对于更复杂的场景比如希望优先考虑节约硬件成本而不是严格保障服务质量,则可以选择加入预留机制: ```bash docker container run \ --name soft_limited_memory_container \ --memory="100M" \ --memory-reservation="50M" \ alpine top ``` 在此配置下,虽然理论上最高能消耗一百兆随机访问存储单元,但如果整个机器处于高负载状态的话,操作系统可能会倾向于让这个进程只维持五十兆左右的工作集规模[^9]。 最后提醒一点,在实际部署之前一定要确认宿主服务器本身有足够的剩余能力满足所提出的各项需求! ### 注意事项 尽管能够精确调控各个实例间的资源共享比例是一件好事,但也需谨慎行事以免因过度细分而导致整体效率下降甚至崩溃等问题发生。因此建议先做充分测试再推广到生产环境当中去实践这些策略[^10]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值