14年毕业后开始接触node,今天就想跟大家聊聊怎么把nodeclub项目源码构建成一个镜像。话说Docker是今年刚接触的,还在入门中,下面我简单介绍下Docker、Dockerfile的语法以及如何把nodeclub源码构建成镜像。
1.什么是docker?
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
Docker 的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
2.Dockerfile简单入门
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands you would normally execute manually in order to build a Docker image. By calling docker build from your terminal, you can have Docker build your image step by step, executing the instructions successively.Docker通过读取Dockerfile文件中的指令自动构建镜像。Dcokerfile是一个文本文件,它包含了构建镜像所需要执行的全部命令。执行docker build命令,Docker就会按照文档执行并最终创建一个镜像。
Dockerfile支持支持的语法命令如下:
INSTRUCTION argument指令不区分大小写。但是,命名约定为全部大写。
Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(译者注:CentOS和Ubuntu有些命令可是不一样的)。FROM命令可以多次使用,表示会创建多个镜像。具体语法如下:
FROM <image name>例如:
FROM google/nodejs上面的指令告诉我们,新的镜像将基于google的Node.js的镜像来构建。
继FROM命令,DockefFile还提供了一些其它的命令以实现自动化。在Dockerfile文件中这些命令的顺序就是它们被执行的顺序。
下面我们就了解下这些有趣的Dockerfile命令吧。
1.MAINTAINER:设置该镜像的作者。语法如下:
MAINTAINER <author name>2.RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:
RUN <command>3.ADD:复制文件指令。它有两个参数<source>和<destination>。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法如下:
ADD <src> <destination>4.CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:
CMD ["executable","param1","param2"]CMD ["param1","param2"]
CMD command param1 param2
5.EXPOSE:指定容器在运行时监听的端口。语法如下:
EXPOSE <port>;6.ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:
ENTRYPOINT ["executable", "param1","param2"]ENTRYPOINT command param1 param2
7.WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:
WORKDIR /path/to/workdir8.ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:
ENV <key> <value>9.USER:镜像运行时,设置一个UID。语法如下:
USER <uid>10.VOLUME:授权访问从容器内到主机上的目录。语法如下:
VOLUME ["/data"]3.把nodeclub构建成一个镜像