这是一篇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 push
和git pull
天然一致。所以无须解释。
启动一个Container来运行指定的Image
命令:docker run -p <externalPort>:<internalPort> <imageName>
用来运行一个Container,并指定其端口和执行的Image。