`
haiouc
  • 浏览: 118477 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用Docker容器的十大误区

阅读更多

对于用户来说,可能一开始在不了解的情况下会对容器报以拒绝的态度,但是在尝到容器的甜头、体验到它的强大性能之后,相信大家最终是无法抵挡其魅力的。容器技术能够解决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,应用服务器,数据库等等),如果我们非要在一个容器里跑几个应用,那么在管理每个应用进程、存取日志、升级应用的时候就会很麻烦。
8)不要把认证口令存在镜像中,用环境变量比较好。
    如果我们把用户名/密码值对存在镜像里的话,就只有采用硬编码的方式来挨个处理,估计这种麻烦事没人愿意去干。所以我们最好是用环境变量的方从容器外部获取此类信息。
9) 不要用root用户的角色来运行进程。
    Docker容器默认是以root权限运行的。不过随着技术的成熟,docker也会提供安全性更高的默认操作选项。在现有技术条件下,以root权限运行会对其他应用带来安全隐患,而且在有些运行环境下root权限是取不到的,所以我们在跑容器的时候应该用USER命令来指定非root权限的用户。
10) 不要过分依赖IP地址。
    每个容器都有一个内部IP,这个IP不是固定的,我们启动容器或者停止容器的时候IP都会变。如果我们要让应用或者微服务模块在容器之间进行通信的话,正确的做法是通过设置环境变量来传递主机名和端口号。

分享到:
评论

相关推荐

    docker学习.xmind

    docker的基本内容,了解docker的操作流程:docker的安装及docker的代码实现过程,查找相关的软件和系统,docker的运行误区,docker的定义,

    Java 使用Docker时经常遇到的五个问题

    虽然它们在某些方面相似,如提供隔离的运行环境,但Docker容器并不模拟硬件,而是共享主机的操作系统内核。这意味着Docker在资源隔离和安全性上不如虚拟机,例如,它不能隔离页缓存和内核熵池,这可能影响到其他进程...

    有关容器的六大误区和八大正确场景.docx

    6. **跨平台部署** - Docker容器可以在多种操作系统上运行,增强了应用程序的移植性。 7. **无服务架构** - 对于短暂运行、无状态的函数,容器可以提供高效的计算服务,如AWS Lambda。 8. **开发/测试/生产环境一致...

    Java程序员需要注意的五大Docker误区

    Docker现在很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Docker的优势和问题。...

    拥抱金融科技的几个误区.pdf

    在某些情况下,企业会过度热衷于采用最新的技术趋势,例如将每个对接渠道都设计成微服务,或者在只有少量业务需求时就引入大数据和Docker容器化。这种做法可能导致资源浪费和技术过度应用,而忽视了技术与实际业务...

    华为DDD培训PDF格式.pdf

    在文件中,微服务被误解为仅仅构建HTTP服务、使用Docker容器和Kubernetes集群管理等,但实际上微服务的概念要丰富得多。微服务的特征包括组件化、业务能力组织、产品导向而非项目导向、智能端点与傻瓜管道、去中心化...

    【精品】网易中台的博弈与演进-19.9.pdf

    误区之一是简单地将后台系统如ERP、CRM通过企业服务总线(ESB)暴露,但这并不能完全满足前台业务的需求,因为后台系统往往使用管理语言而非业务语言,且单体应用通过ESB难以实现快速迭代。误区之二是将微服务、容器...

    企业中台技术架构演进.pdf

    企业可以选择根据自身条件采用封装或重构的方式构建中台,前者适合后台系统复杂、无法大规模重构的情况,通过API网关将后台服务转化为前台可使用的格式;后者则适用于技术力量雄厚且系统负担较轻的企业,可以通过...

    DevOps企业实践与架构.docx.pdf

    这一概念自2009年提出以来,随着云计算、容器技术(如Docker)、微服务架构以及敏捷开发的普及而逐渐受到重视。在互联网时代,DevOps 更成为了企业应对快速变化市场环境,实现业务敏捷性的重要工具。 误区方面,有...

    Ziade -- Python Microservices Development -- 2017.pdf

    - **容器技术**:利用Docker等容器化工具将应用及其依赖打包成一个可移植的容器镜像,简化了部署流程并提高了环境一致性。 - **服务发现**:通过配置中心(如Consul、Etcd等)动态管理服务实例的位置信息,便于...

    有经验的Java开发者和架构师容易犯的10个错误(下)Ja

    此外,作为Java开发者和架构师,应持续学习最新的技术和最佳实践,如Java新特性、设计模式、微服务架构、容器化技术(Docker)、持续集成/持续部署(CI/CD)等,以保持与时俱进。同时,良好的团队沟通和项目管理能力...

    刘宇-DevOps工具链条的错与对.zip

    6. 容器化技术:Docker用于打包应用,Kubernetes作为容器编排平台,提供弹性伸缩和高可用性。 7. 监控和日志管理:如Prometheus、ELK Stack(Elasticsearch、Logstash、Kibana),确保运行时系统的可见性和性能监控...

    企业中台技术架构演进.pptx

    容器化借助Docker和Kubernetes等工具,实现了环境的一致性和资源的有效管理。DevOps实践确保了从开发到上线的顺畅流程。 在构建中台时,需要考虑业务架构、IT架构和组织架构的调整。业务架构需要从业务服务化到...

    信息安全中常用术语介绍.docx

    漏洞靶场可以是真实的物理环境或虚拟化的环境(如虚拟机或Docker容器)。 - **优势**:通过漏洞靶场,研究人员可以在可控的环境中模拟攻击场景,测试防御措施的有效性。 - **工具**:一些常用的漏洞靶场搭建工具...

    糟糕概念:测试说明

    采用Docker容器化技术可以确保测试和生产环境的一致性。 总结来说,"糟糕概念:测试说明"提醒我们在进行C#测试时,应避免上述的误区,包括依赖具体实现细节、忽视代码覆盖率、过度模拟、忽略非功能测试以及不一致的...

    DevOps企业实践与架构.docx

    这个概念自2009年提出以来,随着云计算、容器技术(如Docker)、微服务以及敏捷开发方法的普及而逐渐受到重视。在互联网行业中,DevOps已成为推动业务创新和快速响应市场变化的关键。 首先,DevOps强调打破传统的...

    2018年系统架构设计师真题PDF.zip

    在云计算方面,系统架构设计师应熟悉AWS、Azure、阿里云等主流云平台的服务和架构,包括IaaS、PaaS和SaaS的不同模式,以及容器技术如Docker和Kubernetes的应用。 分布式系统和微服务架构是现代企业级应用的趋势。...

Global site tag (gtag.js) - Google Analytics