参考博文
知识铺垫
虚拟机
在操作系统中运行其他操作系统,对于底层来说,虚拟机是一个文件
- 优势在于可通过还原虚拟机镜像/快照的方式还原原始环境
- 资源占用多、冗余步骤多、启动慢三个劣势
Linux容器
不是模拟完整操作系统,而是对进程进行隔离
- 优势:启动快(一个容器相当于一个底层的进程)、占用资源少(只占用需要的资源,且可以共享资源)、体积小(只包含有用的组件)
Docker
Linux 容器的封装,提供简单易用的容器使用接口
- 将应用程序与其依赖打包为一个文件,省去了环境配置带来的问题
Docker
用途
- 提供一次性的环境
- 提供弹性的云服务:随开随关,动态扩缩容
- 组件微服务架构:通过在一台机器上启动多个容器模拟微服务架构
概念
image/镜像
- 应用及其依赖打包在image文件里
- 可以看作是容器的模板,只有通过image才能生成容器
image是二进制文件,通常一个image是继承另一个image,再加上一些个性化设置而生成
命令
docker image lsdocker image rm [imageName or imageId]ordocker rmi [imageName or imageId]docker image pull [imageName]
image一般不建议重复造轮
Container/容器
- image 文件生成的容器实例,本身也是一个文件,称为容器文件
- 命令
docker container run [imageName]# 该命令有自动抓取image文件的功能,如果本地没有指定的image文件,就会从仓库自动抓取docker container run -it [imageName] bash# 将运行的容器映射到终端中-p 8000:3000参数:容器的 3000 端口映射到本机的 8000 端口。-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
docker container kill [containerId]# 终止容器运行docker container rmordocker rm
Dockerfile
文本文件,用来配置image
.dockerignore # 加入不需要打包入image的文件
1
2
3.git
node_modules
npm-debug.logDockerfile
1
2
3
4
5
6
7
8FROM node:8.4 # 继承自官方node image
COPY . /app # 将当前目录下所有文件(除了.dockerignore排除的路径)复制到image文件的/app下
WORKDIR /app # 之后的工作路径为/app
RUN npm install --registry=https://registry.npm.taobao.org # 安装node依赖
EXPOSE 3000 # 将容器的3000端口暴露出来,允许外部连接
CMD node demos/01.js # 容器启动后执行 node demos/01.js这条命令
# RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
# 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。build/打包 image
docker image build -t koa-demo .# 使用当前目录下的dockerfile打包image,名称为koa-demo
生成容器
docker container run --rm -p 8000:3000 -it [imageName] [someCmd]
一些命令
docker container start [containerId or containerName]ordocker start [containerId or containerName]# 启动一个已生成的容器docker container stopdocker container logs# 查看容器的标准输出docker container exec -it [containerID or containerName] /bin/bash# 将容器的shell映射到本地终端docker container cp [containID]:[/path/to/file] .# 将容器/path/to/file路径对应的文件复制到当前目录