这是一篇Docker的学习笔记。

为什么要用Docker

抛开生涩的计算机语言不论,一个生动形象的比喻是,Docker好似集装箱,而传统的VM更像是特别定制的航运船。所以,其优点也一目了然,特别定制的航运船,必然有很强的依赖性,而集装箱则更多的强调轻量化、标准化。

几个概念

Image

Image是一个只读的模板,是一个有层次结构的文件系统。所以,Image可以是一个程序(包括数据库),也可以用来作为共享文件。

Container

Container是一个相互隔离的运行时,它是基于image的。Container可以启动,停止。

通俗来讲,Image就像一个可执行文件,而Container就是运行了该可执行文件的进程。所以,一个可执行文件是可以被多个进程执行的。

Dockfile

Dockfile是一个文本文件,通常就叫dockerfile,没有后缀名。它用来定义创建Image所需的命令。

一个创建Nodejs程序的示例文件:

FROM        node:alpine
LABEL       author="Author"
ENV         NODE_ENV=production
WORKDIR     /var/www
COPY        . .
RUN         npm install
EXPOSE      8080
ENTRYPOINT  ["node", "server.js"]

常见的操作

创建Image

创建Image,就是基于上述的Dockerfile,来生成真正的image。

一个常见指令:
docker build -t <name> .

其中:

  • -t--tag的简写;
  • <name>是Image的名称;如果image需要发布到对应的registry上,那么名称可以改为<registry>/<name>:<tag>.
  • . 是指定创建Image的目录, .表示Dockerfile所在的当前目录;

查看所有当前系统上Images

命令:docker images用来查看当前系统上所有的Images。

删除指定的Image

命令:docker rmi <imageId>用来删除一个指定的Image。

这里的<imageId>可以是Image UUID的前几个可以辨识的数字,而不必输入完整的Image UUID。

发布Image到Registry

通常,创建的Image是需要发布出去,让需要使用的人使用。譬如,测试就需要拿着开发完成的最新版本Image来进行测试。

命令:docker push <user name>/<image name>:tag 用来将刚刚创建的Image上传到制定的Registry。譬如,Docker hub。

从Registry获取Image

跟上述发布Image到Registry反相的操作,就是从Registry中获取Image。

命令:docker pull <imageName>

实话实说,这两条指令跟git pushgit pull天然一致。所以无须解释。

启动一个Container来运行指定的Image

命令:docker run -p <externalPort>:<internalPort> <imageName>用来运行一个Container,并指定其端口和执行的Image。