写给 FE 同学的 Docker 入门指南

1. 什么是 Docker ?

“什么是 Docker ?”,网上有非常多的答案。

比较多的回答都会提到 “Docker” 借鉴了 “集装箱” 思想。是说,没有集装箱的年代,码头货运的物品经常会相互影响,比如食品和有毒物品装一起,会导致食品受污染。而 “集装箱” 可以很好地实现货物间隔离。

其实我们也可以说是借鉴了 “房地产” 思想。早期的智人,都是山洞里群居,现在大家肯定无法接受,因为毫无隐私可言。

所以,”Docker” 的本质也可以说是解决了应用服务的 “隐私” 问题,实现进程、内存、文件、网络之间相互隔离。

不过,对于 FE 同学而言,可以简单把 Docker 理解成一种虚拟机就可以啦,很多应用服务可以像桌面软件那样一键安装,免部署和环境配置啦。

1.1. FE 同学为什么需要使用 Docker ?

我觉得有这么几个点,对 FE 同学比较受益

  1. 对于 Full Stack 工程师。 Docker 可以提供一种简单轻便的服务器编程环境,而且可以随用随删、降低环境配置成本。

  2. 很多 FE 日常工作中需要跟 Nginx、MongoDB、MySQL 等服务器应用打交道。 用 Docker 可以很容易部署一个测试环境,学习和倒腾.

  3. 四叔说: 不懂运维的摄影师不是个好前端。

1.2. Docker 的安装

各个平台的 Docker 安装可以参考官方文档 https://docs.docker.com/v17.12/docker-for-mac/install/

简单说下Mac 下的安装,主要有两个文件

  • Docker for Mac : Docker 在 MacOS 上的运行环境

    • 下载地址: https://download.docker.com/mac/stable/Docker.dmg

  • Kitematic-Mac : Docker 的可视化管理桌面客户端

    • 下载地址: https://download.docker.com/kitematic/Kitematic-Mac.zip

2. 用前端思维分析 Docker

与 Git 的相关资料类似,Docker 的很多资料和文档都是讲解大片大片的命令行,非常乏味枯燥。

但是问题来了,要是大家都用命令行,那还要前端工程师干神马?

所以,本文主要还是 GUI 工具来操作,体验一下 Docker 的基本功能。

2.1. Docker GUI 工具

Docker 官方提供的 Kitematic-Mac , 其实是基于 Electron + React 开发的,具备基本的操作功能,但是体验比较一般。

今天我们主要使用 jetBrains 家的 IDE 中的 Docker 插件,简单而又非常实用。

2.2. 使用 jetBrains Docker Plugin 安装 Node

首先,需要启动 Docker

然后,使用 Docker Plugin 连接 Docker,安装 Node

添加 “Node Image”

添加两个 “Node Container”

实际上刚刚是这样一个流程

这个流程很像 npm 安装包的操作

  1. 从 “Registry” 上下载 “Node Image”,官方的 “Registry” 就是 “Docker Hub”。 跟 NPM 一样,也可以使用第三方 “Registry” 或 镜像

  2. Node 的 Image 会在本地存储一份缓存,以便重复利用。 实际上 “yarn” 也是采用了类似的机制缓存安装包。

  3. 使用 “Node Image” 创建了 2个 “Node Container”,这两个 “Container” 之间互相隔离互不影响

2.3. 理解 Docker 的三个基本概念

在 Docker 中有三个概念

  • Container – 容器

  • Image – 镜像

  • Registry – 仓库

可以像下面这张图来类比

“Container” 就是实际运行的应用服务,使用 “Image” 来描述依赖,而 “Registry” 上有大量公开的 “Image” 可以使用。

真的很像 NPM。

“Container” 和 “Image” 的依赖像下面这样

2.4. 理解 Docker 的 CS 架构

Docker 其实是一个 Client / Server 架构,常用的 Docker Client,就是 Docker CLI,通过命令行与 “Docker Daemon” 交互,对 “Container” 和 “Image” 进行操作。

因为 Docker 本身也提供了 RESTful API,所以也可以通过数据接口与 “Docker Daemon”操作,所以也可以按照接口实现不同的客户端。

3. Docker 的常用操作

Docker 提供了大量的接口可以操作 “Image”、”Container”,很多功能其实并不常用,我们还是结合 GUI 工具,来看一些常见操作。

3.1 Container 的操作

3.1.1. 创建一个 Container

上面是创建一个容器的基本信息,最主要的当然是确定使用的 “Image”。

等效的命令是

docker run --name node1 node:latest

其他几个比较重要的信息

  1. Command : 决定 Container 启动后运行的命令

  2. Bind Ports : 用于绑定 Container 和宿主机器的端口映射。 因为默认 Container 与外部是网络隔离的,需要映射端口,外部才能访问到 Container 中的服务

  3. Bind Mounts : Container 中的读写层无法实现持久化,有点类似前端里面的 SessionStorage, 想要持久化,要么映射到宿主的文件系统,要么需要映射到 卷(这是另外一个重要概念)

3.1.2. 端口映射

上面的操作实现了

host:8080 => container:80

这样通过宿主机的 8080 端口即可访问到容器中的服务

3.1.3. Container 的其他操作

其中,我们经常需要使用 Exec 进入容器进行交互操作。

3.2 Image 的操作

我们主要是通过 Docker Hub 或其他 Registry 来下载 Image, 当然,我们也可以制作自己的 Image 发布到 Registry 中。不过自己制作 Image 超出了本文的分享范围。简单列一下几个 GUI工具上的常见操作

4 Docker 实战演示

  1. 使用 ghost 搭建一个博客

  2. 参考 ghost docker 的配置说明,https://hub.docker.com/_/ghost/

  3. 将端口映射为 8080 上, ghost docker 默认是 2368

第一步:pull 镜像

第二步:选择镜像

第三步:创建容器

访问 http://localhost:8080/

当然,如果你会命令行就更好啦,其实只需要一句(:joy:)

docker run -p 8080:2368 --name ghost ghost:latest

5. 参考

  • 《Docker — 从入门到实践》 – https://docker_practice.gitee.io/

  • 《docker-cheat-sheet》 – https://github.com/wsargent/docker-cheat-sheet/tree/master/zh-cn

  • 《Docker开发指南》(Using Docker Developing and Deploying Software with Containers)- 英 Adrian Mouat 著 – 人民邮电出版社

  • 《Docker Engine API文档》 – https://docs.docker.com/engine/api/v1.39/#