文章来自:When to use and when not to use Docker7 Cases When You Should Not Use Docker,以及互联网网上的一些零散内容。这篇文章只是基于我自己的理解,进行简单的概述。

适合的场景

  1. 你的团队不是一成不变的。
    当有新的成员加入,在他们开始编码之前,他们必须为项目设置本地开发环境,例如据库或其它第三方工具。这可能会花很多时间,比如我之前在做CRM系统时,本地要安装Oracle,Siebel,SVN等等这些东西,一个一个安起来非常麻烦,各种问题,安了两天才成功完成。而如果有了Docker,利用Docker Compose,通过编写docker-compose.yml一键就可以把它们全部安装,包括设定谁前谁后,环境变量等,如下图是安装ELK(ElasticSearch,Logstash,Kibana,做日志的东西;根据我的经验,你一个一个安会很痛苦的,安装时出了问题也不好找)的docker-compose.yml文件。
    而且团队越大,团队成员的变动就越多,Docker可以大大减少在安装上浪费的时间。

    version: '3.2'
    
    services:
        elasticsearch:
            image: elasticsearch:7.17.4
            volumes:
                - /etc/localtime:/etc/localtime
                - ./es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
                - ./es/data:/usr/share/elasticsearch/data #数据文件挂载
            ports:
                - '9200:9200'
                - '9300:9300'
            container_name: elasticsearch
            restart: always
            environment:
                - 'cluster.name=elasticsearch' #设置集群名称为elasticsearch
                - 'discovery.type=single-node' #以单一节点模式启动
                - 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m' #设置使用jvm内存大小
            networks:
                - elk
        logstash:
            image: logstash:7.17.4
            container_name: logstash
            restart: always
            volumes:
                - /etc/localtime:/etc/localtime
                - './logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml'
                - './logstash/logstash-audit.conf:/usr/share/logstash/pipeline/logstash-audit.conf'
                - './logstash/logstash-user-action.conf:/usr/share/logstash/pipeline/logstash-user-action.conf'
            ports:
                - '5044:5044'
                - '50000:50000/tcp'
                - '50000:50000/udp'
                - '9600:9600'
            environment:
                LS_JAVA_OPTS: -Xms1024m -Xmx1024m
                TZ: Asia/Shanghai
                MONITORING_ENABLED: false
            links:
                - elasticsearch:es #可以用es这个域名访问elasticsearch服务
            networks:
                - elk
            depends_on:
                - elasticsearch
        kibana:
            image: kibana:7.17.4
            container_name: kibana
            restart: always
            volumes:
                - /etc/localtime:/etc/localtime
                - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
            ports:
                - '5601:5601'
            links:
                - elasticsearch:es #可以用es这个域名访问elasticsearch服务
            environment:
                - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
                - 'elasticsearch.hosts=http://es:9200' #设置访问elasticsearch的地址
                - I18N_LOCALE=zh-CN
            networks:
                - elk
            depends_on:
                - elasticsearch
    networks:
        elk:
            name: elk
            driver:
                bridge
    
  2. 你的软件运行在不同的环境中
    我们平时开发人员是在开发环境中进行开发,当编写好、测试好代码后,要提交到生产环境。因为你的开发环境不可能和生产环境一模一样,所以可能会遇到一些无法预料的问题。而Docker一个个Container具有很好的隔离性,会大大降低外界环境的影响。而且也利用Docker的可移植性,也就是说比如你从一台服务器移动到另一台服务器,只要安装好相同的镜像,运行启动即可使用。
    在这里插入图片描述
    这里要额外说明一下,进入Docker官网后,这里安装的是Docker Desktop,也就是一个桌面应用,可以可视化一些操作内容。而它不同的版本Apple、Windows,安装后Docker的内部其实还是Linux,并不是Apple、Windows的系统。因为Docker本身就是基于Linux的,在非Linux上安装,本质上是利用Windos或Apple的一些特性,安装了Linux虚拟机。
    在这里插入图片描述

  3. 你的软件由许多部分组成
    这点依然用到了第一点提到的Docker Compose。随着软件的成长,组件越来越多,越来越不好管理,通过Docker Compose可以解决这个问题,一个docker-compose.yml文件。就可以管理好个个组件的关系。

  4. 你希望你的软件是可扩展的
    Docker本身并不支持动态扩容,但是它可以很方便的进行横向扩展,也就是在run一个images。之后再通过负载均衡从而达到扩展的目的。

不适合的场景

  1. 桌面应用
    Docker本身是可以运行GUI(图形用户界面)的,但是Docker 的设计初衷是为了在不同的环境中运行应用程序,而桌面应用程序通常需要与操作系统进行交互,比如要访问本地文件系统、音频系统等其他资源,由于Docker容器本身是隔离的,这些功能在 Docker 中可能无法直接实现,因此需要额外的工作来解决这些问题。

  2. 你的软件规模比较小
    Docker本身并不是开箱即用的,会涉及很多内容,命令、文件挂在、日志输出等等,比如说如果你的软件只涉及一个服务器,那完全没有必要使用Docker。

  3. 你想加快你应用的速度
    在大多数情况下,Docker 的性能开销对你来说是不可见的,因为Docker仅仅是基于Linux的LXC虚拟技术,利用它的namespace(隔离开),cgroup(限制住自己)技术,也就说仅仅是做了分离,而不是像虚拟机那样,又重新造一个系统。但可能一定程度上会受到影响,因为使用Docker会在应用和操作系统之间又多了“一层”。如果你的目标是提高应用程序的速度,Docker本身是无能为力的。

  4. 你非常注重安全
    对于安全并不是太懂,简单来讲Docker是基于Linux的namespace进行隔离的,隔离性是远不如虚拟机的,比如时间就隔离不了,容器一更改时间,主机也会改。而且对于Docker,所有容器都是可以访问主机内核的,可能会造成风险。而传统的虚拟机同样地很多操作都需要通过内核处理,但这只是虚拟机的内核,并非宿主主机内核,因此万一出现问题时,最多只影响到虚拟系统本身。

总结

Docker的好处:

  • 利用其可移植性,镜像提供了除内核外完整的运行环境,确保了应用运行环境的一致性,可以方便的在不同环境中进行安装运行;
  • 利用其隔离性,可以不用像虚拟机一样,占用过多资源,而且也比虚拟机启动更快;让自己的运行环境不受外部干扰,让资源不会容易受到其他用户的影响(与可移植性类似);
  • 可以方便的进行不同组件的管理,以及快速搭建系统的整体的环境;
  • 可以方便的对服务进行横向扩展
  • 利用以上特性,更加适合云原生的发展,实现像是持续集成和部署。

Docker的坏处:

  • 由于隔离的限制,不适合桌面应用的安装;
  • 软件规模较小时,没有必要使用,会大大增加复杂度;
  • 无法提高应用的性能;
  • 一定程度上可能会影响安全,因为它并不像虚拟机隔离的彻底
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐