早在2013年,我一直把容器当成虚拟机来使用
直到2021年的今天,仍然有很多人都习惯将 ubuntu或者centos 容器当做虚拟机来使用,启动进程 /bin/bash
实际上,这样做是不合适的
比起虚拟机,容器实际上更类似于 windows 的程序安装包 和 linux 上的 rpm 和 dpkg 安装包,但又不完全相同
安装包的最终目的是让用户 “通过最简单的方式,安装和运行一个应用程序”
通常安装包会拷贝文件,并且设置一些相关的配置,有些需要本地编译,然后设置环境变量等等,但是安装有一个缺点,如果你安装了 Python2 又安装了 Python3 可能会带来一些依赖库之类的环境冲突
Docker 实际上提供了类似于 安装包一样的 一键安装部署应用的 能力,同时又提供了类似 conda 的环境隔离(甚至是网络隔离等等)
在没有Docker以前,如果需要把开发完成的应用程序部署到用户的服务器,通常你可能需要
- 拷贝文件
- 设置config文件
- 检查服务器的环境变量
- 如果生产环境和开发环境不一致可能需要编译
- 配置依赖的库
- 安装需要的数据库
在Docker出现之后,只需要使用image创建对应的container就可以获得全部的 环境变量 和 环境依赖,这在以前是不可想象的,例如启动一个标准的 mysql 服务
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
除了能够快速发布到生产环境,docker的这种快速启动优势还可以应用在许多 POC 场景,快速的试验各种版本,吞吐量,稳定性 和 兼容性 的测试,都可以基于docker实现
在Docker出现以前,想快速分发 dev 的开发环境,还有一种选择是通过 基于 vagrant 使用的 virtual box,实际上这种实践有些类似于 “基础设施既代码” 的概念,使用 Vagrantfile 来定义需要的配置,通过virtualbox的 box 文件来分发本地开发需要的环境
但是virtualbox本质上是虚拟机,虚拟机和docker还是有很大区别的