# Docker 入门教程

An image

# 环境配置的难题

用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

# 虚拟机

虚拟机(virtual machine)是带环境安装的一种解决方案。

缺点:占资源、步骤多、启动慢

# Linux 容器

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。

缺点:不占资源、体积小、启动快

# Docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。

# 实例:hello world

通过最简单的 image 文件 hello world,感受一下 Docker:

$ docker container run hello-world

如果运行成功,你会在屏幕上读到下面的输出:

Hello from Docker!
This message shows that your installation appears to be working correctly.

# 实例:制作自己的 Docker 容器

准备一个练手的 koa-demos 项目:

$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos

在项目的根目录下,新建 .dockerignore 文件, 排除无需打包到 image 的文件:

.git
node_modules
npm-debug.log

在项目的根目录下, 新建 Dockerfile 文件:

FROM node:8.4   # 该 image 文件继承官方的 node image,版本 8.4
COPY . /app     # 拷贝当前目录下的所有文件到 image 文件的 /app 目录
WORKDIR /app    # 指定接下来的工作路径为 /app
RUN npm install # 在 /app 目录下,运行 npm install 命令安装依赖
EXPOSE 3000     # 将容器的 3000 端口暴露给外部

创建 image 文件:

$ docker image build -t koa-demo .  # `-t` 指定文件名, `.` 表示当前路径

如果运行成功,就可以看到新生成的 image 文件 koa-demo 了。

$ docker image ls

从 image 文件生成容器实例:

# -p:容器的 3000 端口映射到本机的 8000 端口
# -it:容器的 Shell 映射到本机窗口当前的 Shell
# koa-demo:0.0.1:image 文件的名字
# /bin/bash:容器启动以后,内部第一个执行的命令
$ docker container run -p 8000:3000 -it koa-demo /bin/bash

如果一切正常,会返回一个命令行提示符:

root@66d80f4aaf1e:/app#

这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。执行下面的命令:

root@66d80f4aaf1e:/app# node demos/01.js

这时,Koa 框架已经运行起来了。打开本机的浏览器,访问 http://127.0.0.1:8000 会显示 Not Found

测试完毕,销毁容器:

# 在容器的命令行按下 Ctrl + c 停止 Node 进程
# 按下 Ctrl + d 退出容器

# 在本机的另一个终端窗口,查出容器的 ID
$ docker container ls

# 停止指定的容器运行
$ docker container kill [containerID]

# 查出所有容器的 ID
$ docker container ls --all

# 删除指定的容器文件
$ docker container rm [containerID]