文章来自:When to use and when not to use Docker和7 Cases When You Should Not Use Docker,以及互联网网上的一些零散内容。这篇文章只是基于我自己的理解,进行简单的概述。
适合的场景
-
你的团队不是一成不变的。
当有新的成员加入,在他们开始编码之前,他们必须为项目设置本地开发环境,例如据库或其它第三方工具。这可能会花很多时间,比如我之前在做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
-
你的软件运行在不同的环境中
我们平时开发人员是在开发环境中进行开发,当编写好、测试好代码后,要提交到生产环境。因为你的开发环境不可能和生产环境一模一样,所以可能会遇到一些无法预料的问题。而Docker一个个Container具有很好的隔离性,会大大降低外界环境的影响。而且也利用Docker的可移植性,也就是说比如你从一台服务器移动到另一台服务器,只要安装好相同的镜像,运行启动即可使用。
这里要额外说明一下,进入Docker官网后,这里安装的是Docker Desktop,也就是一个桌面应用,可以可视化一些操作内容。而它不同的版本Apple、Windows,安装后Docker的内部其实还是Linux,并不是Apple、Windows的系统。因为Docker本身就是基于Linux的,在非Linux上安装,本质上是利用Windos或Apple的一些特性,安装了Linux虚拟机。
-
你的软件由许多部分组成
这点依然用到了第一点提到的Docker Compose。随着软件的成长,组件越来越多,越来越不好管理,通过Docker Compose可以解决这个问题,一个docker-compose.yml文件。就可以管理好个个组件的关系。 -
你希望你的软件是可扩展的
Docker本身并不支持动态扩容,但是它可以很方便的进行横向扩展,也就是在run一个images。之后再通过负载均衡从而达到扩展的目的。
不适合的场景
-
桌面应用
Docker本身是可以运行GUI(图形用户界面)的,但是Docker 的设计初衷是为了在不同的环境中运行应用程序,而桌面应用程序通常需要与操作系统进行交互,比如要访问本地文件系统、音频系统等其他资源,由于Docker容器本身是隔离的,这些功能在 Docker 中可能无法直接实现,因此需要额外的工作来解决这些问题。 -
你的软件规模比较小
Docker本身并不是开箱即用的,会涉及很多内容,命令、文件挂在、日志输出等等,比如说如果你的软件只涉及一个服务器,那完全没有必要使用Docker。 -
你想加快你应用的速度
在大多数情况下,Docker 的性能开销对你来说是不可见的,因为Docker仅仅是基于Linux的LXC虚拟技术,利用它的namespace(隔离开),cgroup(限制住自己)技术,也就说仅仅是做了分离,而不是像虚拟机那样,又重新造一个系统。但可能一定程度上会受到影响,因为使用Docker会在应用和操作系统之间又多了“一层”。如果你的目标是提高应用程序的速度,Docker本身是无能为力的。 -
你非常注重安全
对于安全并不是太懂,简单来讲Docker是基于Linux的namespace进行隔离的,隔离性是远不如虚拟机的,比如时间就隔离不了,容器一更改时间,主机也会改。而且对于Docker,所有容器都是可以访问主机内核的,可能会造成风险。而传统的虚拟机同样地很多操作都需要通过内核处理,但这只是虚拟机的内核,并非宿主主机内核,因此万一出现问题时,最多只影响到虚拟系统本身。
总结
Docker的好处:
- 利用其可移植性,镜像提供了除内核外完整的运行环境,确保了应用运行环境的一致性,可以方便的在不同环境中进行安装运行;
- 利用其隔离性,可以不用像虚拟机一样,占用过多资源,而且也比虚拟机启动更快;让自己的运行环境不受外部干扰,让资源不会容易受到其他用户的影响(与可移植性类似);
- 可以方便的进行不同组件的管理,以及快速搭建系统的整体的环境;
- 可以方便的对服务进行横向扩展
- 利用以上特性,更加适合云原生的发展,实现像是持续集成和部署。
Docker的坏处:
- 由于隔离的限制,不适合桌面应用的安装;
- 软件规模较小时,没有必要使用,会大大增加复杂度;
- 无法提高应用的性能;
- 一定程度上可能会影响安全,因为它并不像虚拟机隔离的彻底