Docker 是当前最流行的容器技术,也是耳熟能详的“云原生”的基础。Docker 使用 Go 语言开发,以轻量和高性能著称。
Docker 能做什么?简单来说,Docker 的核心功能就是创建容器。容器是可以运行在操作系统中的一个特殊的独立空间,这个空间与操作系统隔离,并且拥有自己独立的运行环境。
假设有一台 Linux 服务器,这台服务器安装了 Node.js v16。服务器内还运行了一个容器,容器内安装了 Node.js v14。两个版本的 Node.js 互相独立、互不影响。
当有一个环境要求为 Node.js v14 的项目要部署到服务器上,传统方案只能将服务器的 Node.js 版本降级为 v14。但有 Docker 的话,可以直接运行一个 Node.js v14 环境的容器,在容器内运行项目,此时项目就不受服务器环境的影响了。
Docker 容器可以快速创建、快速销毁,开销极低,这使项目的迁移和部署几乎可以无视服务器环境。
总的来说,Docker 可以快速创建一个有独立运行环境的容器,在容器里运行项目,不受服务器环境影响。
Docker 包括三个基本概念:
容器是最终运行起来的进程,只有容器在运行中这个独立空间才会被创建。
一般为了区别服务器环境和容器环境,我们将服务器环境称为宿主环境
。容器环境与宿主环境虽然隔离,但并不代表他们没有关联。他们通过“映射”的方式建立联系。
容器与宿主机的映射关系有以下两种:
端口映射是将两个环境的两个端口打通。假设一个项目部署在容器内,占用了 8080 端口;此时容器的 8080 端口与宿主机的 80 端口建立了映射。那么我们在宿主机内访问 80 端口,经过端口映射就访问到了容器内的应用。
数据卷映射,是指将宿主机的一个目录映射到容器的一个目录中,从而实现目录的共享。
假设在容器中运行了一个 Node.js 项目,项目代码存放在目录 B 之中。现在我要修改代码,难道要进入容器中通过 vim 修改?显然是不现实的。正确的做法是在宿主机中创建一个目录 A 与容器的目录 B 映射,只要将修改后的代码传到服务器的目录 A,目录 B 就会自动同步。
一句话,数据卷映射可以实现“代码在宿主机中,环境在容器中”。