【转载】Docker 经验之谈
本文来源:Ghostcloud原创
对于用户来说,可能一开始在不了解的情况下会对容器报以拒绝的态度,但是在尝到容器的甜头、体验到它的强大性能之后,相信大家最终是无法抵挡其魅力的。容器技术能够解决IT业目前面临的很多问题,而且优势也很明显,比如说:
1、容器具有不可变的特性。
容器将操作系统、程序库、配置文件、路径和应用程序打包在一起运行,也就是说,我们在做QA测试的时候整个镜像是什么样,投入到产品环境以后就是什么样,其性能不会有任何差距。
2、容器都非常轻量。
单个容器的内存占用很小,不像其他进程动辄占用上万MB的内存空间,容器只会给主进程分配内存,可以有效降低系统开销。
3、容器的速度更快。
虚拟机的启动时间一般都在分钟级,容器的启动速度可以达到秒级,启动容器就跟启动linux进程一样快。
虽然容器的好处这么多,但是有很多用户还不了解,还认为容器跟一般的虚拟机没什么差别。实际上,容器是可销毁的,这是容器跟虚拟机之间最大的差别。容器的存在周期很短,只要用户使用完毕,就可以立即销毁容器,所以用“朝生暮死”来形容也不算过分。
在对容器进行使用和维护时,我们应该充分利用容器的这个特性,不要再把容器当成一般的虚拟机来看待,不然就真的大材小用了。在实际使用过程中,为了最大限度地发挥容器的优势,有些错误还是少犯为妙。我总结出了下面几个要点供大家参考,在跑容器的时候大家最好还是尽量遵照这几条原则:
1) 不要将数据储存在容器中。
容器随时都可以停止、销毁或迁移,比方说,一个容器里运行的应用版本是1.0,我们分分钟就可以把这个应用升级到1.1,同时还不会对数据造成任何影响。所以如果用户想要存数据的话,最好是用数据卷来存储。不过在用卷存数据的时候大家还是要注意一点,如果有两个容器共用一个数据卷,都往里面写数据的话,是有可能造成程序崩溃的。我们在设计应用程序的时候应该考虑到这一点,为保万无一失,应用程序应该具备特定的机制,以确保在往共享数据存储区写入数据的时候不会出错。
2) 不要把应用程序分块交付。
在部分用户看来,容器跟虚拟机没什么两样,所以有些人往往会把应用程序部署到当前运行的若干个容器中。这种做法在开发阶段没有太大的问题,因为做开发的时候我们会很频繁地进行部署和调试,但是到了持续交付(CD)阶段,下一步就是QA测试和正式投产了,这种做法就不太适合了。在这一阶段,我们应该充分考虑到容器的不可变特性,最好是将应用程序打包到一个镜像中交付。
3) 不要把镜像体积建得很大。
镜像越大,就越难发布。镜像中只包含必要的文件和library就可以了,能让应用或者进程运行起来就行。千万不要在镜像中安装些没必要的东西,在构建镜像的时候要避免使用yum这种update命令,免得系统自动下载很多不相干的文件到新镜像层中。
4) 建镜像的时候不要只建一层。
大家都知道,Docker的文件系统是分层的,在建镜像的时候我们应该这么建,将操作系统单独建一层,作为基础镜像,然后用户名定义文件、运行时安装环境、配置文件都要分别建一层镜像,最后才是应用镜像层。这么做的话,我们以后重建、管理以及发布镜像的时候就要轻省得多了。
5) 不要把本地运行的容器转成镜像。
换句话说就是创建镜像的时候不要用“docker commit”命令来创建。用这种办法建镜像是完全不可取的,因为这种办法是不能重复的。我们在建镜像的时候应该从Dockerfile创建,或者用其他S2I(从源文件构建镜像)的方式来创建,这样镜像才具有可再生性,而且如果我们把镜像存在git之类提供版本控制能的系统里的话,还可以对Dockerfile的改动进行跟踪。
6) 给镜像打tag的时候不要只打“latest”。
latest其实就相当于Maven里头的“快照”。因为容器的文件系统是分层的,我们最好是给镜像多打几个tag。如果只有latest的话,可能过段时间我们再来运行应用程序的时候就发现程序运行不起来了,因为应用的父层(就是Dockerfile里面的跟在FROM命令后面的那一层)被更新的版本覆盖了,而新版本又不能向下兼容,还有可能就是从build cache里面取镜像的时候取到了错的“latest”镜像。在产品环境中部署容器的时候也要避免使用latest,不然容易造成无法跟踪记录镜像版本的问题。
7) 不要在单个容器里面运行多个进程。
容器本来就是用来运行单个应用的(比如http daemon,应用服务器,数据库等等),如果我们非要在一个容器里跑几个应用,那么在管理每个应用进程、存取日志、升级应用的时候就会很麻烦。
不要把认证口令存在镜像中,用环境变量比较好。
如果我们把用户名/密码值对存在镜像里的话,就只有采用硬编码的方式来挨个处理,估计这种麻烦事没人愿意去干。所以我们最好是用环境变量的方从容器外部获取此类信息。
9) 不要用root用户的角色来运行进程。
Docker容器默认是以root权限运行的。不过随着技术的成熟,docker也会提供安全性更高的默认操作选项。在现有技术条件下,以root权限运行会对其他应用带来安全隐患,而且在有些运行环境下root权限是取不到的,所以我们在跑容器的时候应该用USER命令来指定非root权限的用户。
10) 不要过分依赖IP地址。
每个容器都有一个内部IP,这个IP不是固定的,我们启动容器或者停止容器的时候IP都会变。如果我们要让应用或者微服务模块在容器之间进行通信的话,正确的做法是通过设置环境变量来传递主机名和端口号。
【转载】Docker 经验之谈的更多相关文章
- [转载]Docker的安装配置及使用详解
简介 官网:http://www.docker.com/,点击get started进入下载,目前三个系统的docker容器都有,Windows版需要win10系统,我的是win7系统一开始用的 ...
- [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
原文: http://dockone.io/article/455 如果你已经构建了一些多容器的应用程序,那么肯定需要定义一些网络规则来设置容器间的通信.有多种方式可以实现:可以通过--expose参 ...
- [转载]Docker 完全指南
Docker 完全指南 原作者地址: https://wdxtub.com/2017/05/01/docker-guide/ 发表于 2017-05-01 | 更新于 2017-08-03 | ...
- [转载] Docker 实现原理
目录 Namespaces 进程 网络 libnetwork 挂载点 chroot CGroups UnionFS 存储驱动 AUFS 其他存储驱动 总结 原文链接:https://dravenes ...
- (转载)Docker的boot2docker.iso镜像使用
原文路径:https://blog.csdn.net/jiangjingxuan/article/details/54908272#commentsedit 在Docker首次启动时需要下载的一个bo ...
- [转载]Docker容器无法被stop or kill问题
来源: 问题过程 某环境一个mysql容器无法被stop or kill or rm sudo docker ps | grep mysql 查看该容器 7844250860f8 mysql:5.7. ...
- docker with flannel
** 原创文章,请勿转载 ** docker的单host,多container环境下,是使用host的docker0网桥进行通信的.如果跨host, container之间要通信怎么办呢?答案是fla ...
- [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务
转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...
- Docker学习笔记 — Docker私有仓库搭建【转载】
标签: Docker 2015-03-10 21:08 24190人阅读 评论(0) 收藏 举报 分类: Docker(26) 目录(?)[+] 和Mavan的管理一样,Dockers不仅 ...
随机推荐
- the usage of String
经典算法:(整理汇总) 1)如何快速倒叙: public static char[] reverseArray(char[] c){ char t; for(int i=0;i<c.length ...
- Tomcat结合nginx使用入门
Nginx: Nginx是一款高性能,轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 特点是:占有内存少,并发能力强. 反向代理服务器: 反向代理(Reverse ...
- kafka集群安装,配置
1.安装+配置(集群) 192.168.0.10.192.168.0.11.192.168.0.12(每台服务器kafka+zookeeper) # kafka依赖java环境,需要提前安装好jdk. ...
- CentOS7安装OpenStack(Rocky版)-03.安装Glance镜像服务组件(控制节点)
上篇文章分享了keystone的安装配置,本文接着分享openstack的镜像服务glance. --------------- 完美的分割线 ---------------- 3.0.glance概 ...
- convert CAN frame
前言 最近了解了一些socket can的知识点,本文主要介绍如何将数据转换为CAN报文,前提是已经确定CAN的传输协议. 本文使用的CAN报文共有22条,这些报文共用一个can id,每条报文使用序 ...
- 原生js实现数据的双向绑定
原生js实现数据的双向绑定 需要了解的属性是原色js的Object.definePrototype(obj,pop,descript); obj:被构造的对象 pop:被构造的对象的属性,创建对象或修 ...
- HDU 2544:最短路
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- BZOJ1835,LG2605 [ZJOI2010]基站选址
题意 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为\(D_i\) 需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为\(C_i\) 如果在距离第i个村 ...
- Pma模块详解,对用户登录linux等进行限制,密码修改限制等
PAM详细介绍 2014-04-02 09:26:41 标签:PAM 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lidefu ...
- Weston学习
来源网址:http://blog.csdn.net/fyh2003/article/details/49253713 Weston启动时会读取weston.ini这个配置文件,其中可以配置桌面,动画和 ...