使用 Dockerfile 自定义 Docker 镜像
需要提前声明一下的是,该文章会涉及一些 nodejs 的知识,不过不影响阅读。Dockerfile 是文本格式的配置文件,我们可以使用 Dockerfile 来快速创建自定义的镜像。一般 Dockerfile 分为四部分:(如下)基础镜像信息维护者信息镜像操作指令容器启动时执行指令指令指令:FROM格式:FROM或FROM :栗子:FROM node
需要提前声明一下的是,该文章会涉及一些 nodejs 的知识,不过不影响阅读。
Dockerfile 是文本格式的配置文件,我们可以使用 Dockerfile 来快速创建自定义的镜像。一般 Dockerfile 分为四部分:(如下)
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
指令
指令:FROM
格式:FROM <image> 或 FROM <image>:<tag>
栗子:FROM node
Dockerfile 的第一条指令必须为 FROM 指令,有点相当于我们代码中的依赖的意思。
指令:MAINTAINER
格式:MAINTAINER docker_user docker_user@email.com
栗子:MAINTAINER zone zone@qq.com
指定维护者信息。
指令:RUN
格式:RUN <command>
栗子:RUN npm install
栗子中将会在 shell 终端执行 npm install
指令:CMD
格式:CMD <command>
栗子:CMD node ./bin/www
启动容器时执行,每个 Dockerfile 只能有一条 CMD 命令,如果有多条 CMD 命令,则只会执行最后一条命令
EXPOSE
格式:EXPOSE port
栗子:EXPOSE 22 80 3000
指明容器暴露的端口,在启动容器时可以通过 -p 来指明本地端口与容器端口之间的映射关系。
指令:ENV
格式:ENV <key> <value>
栗子:ENV PATH /usr/local
指定环境变量。
指令:ADD
格式:ADD <src> <dest>
栗子:ADD D://Test /usr/local
将本地目录(左边)中的文件复制到容器目录(右边)中。
指令:COPY
格式:COPY <src> <dest>
栗子:COPY D://Test /usr/local
将本地目录(左边)中的文件复制到容器目录(右边)中。目录不存在时,将会自动创建。
指令:ENTRYPOINT
格式:ENTRYPOINT <command>
栗子:
指令:VOLUME
格式:VOLUME ["/data"]
栗子:
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
指令:WORKDIR
格式:WORKDIR path
栗子:WORKDIR /usr/local/node_project
指定后续命令的执行目录。
指令:ONBUILD
格式:ONBUILD [instruction]
栗子:
最终通过 Dockerfile 生成新镜像
docker build -t image_tag /usr/local/docker/file/path
-t 指明新镜像的 tag ,后面为 Dockerfile 的路径
举个完整的栗子
理论的东西都很干涩,我个人认为,只有实操了才有更多的动力去学某一件东西,完成之后也会有些许的成就感,这也是对我们的激励吧。那么接下来我们进行实操。
下面的功能是将一个 nodejs 的 express 应用运行在服务器的 4000 端口上。
第一步:
在一个空目录下新建 dockerfie :
vim Dockerfile
第二步:
编写 Dockerfile 文件,如下:
#基于 node 镜像
FROM node
#指定维护者信息
MAINTAINER zone 842221695@qq.com
#WORKDIR /usr/local
#新建路径
#RUN mkdir testgit
#WORKDIR testgit
#将 github 中的项目 clone 到本地
#RUN git clone https://github.com/zonezoen/test.git
#上面这一段代码已经注释掉,就不会被调用
#指定下一条命令的运行目录
WORKDIR /usr/local
#新建路径
RUN mkdir work
#在 /usr/local 的基础上指定运行目录,所以当前目录为:/usr/local/work
WORKDIR work
#安装必要的组件
RUN npm install express
RUN npm install express-generator -g
RUN npm install supervisor -g
RUN express myapp -e
#将当前目录下的文件,复制到 /usr/local/work/ 下
#COPY . /usr/local/work/
WORKDIR /usr/local/work/myapp
RUN npm install
WORKDIR /usr/local/work/myapp
#启动 express 应用
CMD supervisor ./bin/www
#暴露容器 3000 端口
EXPOSE 3000
第三步:
docker build -f dockerfile/Dockerfile -t myimage .
值得注意的是,这句代码最后还有一个小点,是指定 dockerfile 在当前目录中。而且镜像名称不可以有大写字符。
第四步:
docker run -p 4000:3000 myimage
如果没有错的话我们的镜像就跑起来了,来看下运行结果:
更多推荐
所有评论(0)