Docker 基础

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 架构

Docker 包括三个基本概念:

  • 镜像(Image):相当于一个最小型的 Linux 系统,可定制环境。
  • 容器(Container):容器以镜像为模版创建并运行,容器的环境来源于镜像。
  • 仓库(Repository):仓库可看成一个镜像管理中心,用来保存镜像。

容器是最终运行起来的进程,只有容器在运行中这个独立空间才会被创建。

一般为了区别服务器环境和容器环境,我们将服务器环境称为宿主环境。容器环境与宿主环境虽然隔离,但并不代表他们没有关联。他们通过“映射”的方式建立联系。

容器与宿主机的映射关系有以下两种:

  • 端口映射。
  • 数据卷映射。

端口映射是将两个环境的两个端口打通。假设一个项目部署在容器内,占用了 8080 端口;此时容器的 8080 端口与宿主机的 80 端口建立了映射。那么我们在宿主机内访问 80 端口,经过端口映射就访问到了容器内的应用。

数据卷映射,是指将宿主机的一个目录映射到容器的一个目录中,从而实现目录的共享。

假设在容器中运行了一个 Node.js 项目,项目代码存放在目录 B 之中。现在我要修改代码,难道要进入容器中通过 vim 修改?显然是不现实的。正确的做法是在宿主机中创建一个目录 A 与容器的目录 B 映射,只要将修改后的代码传到服务器的目录 A,目录 B 就会自动同步。

一句话,数据卷映射可以实现“代码在宿主机中,环境在容器中”。