# Docker 入门实践(1): 使用自定义镜像,部署自己的应用
在工作、学习中社区的镜像往往不能够满足需求,为此我们会使用自定义镜像。
我们通常会使用 Dockerfile 文件来制作镜像,Dockerfile 是一个文本文件,用来定义该如何创建、运行一个镜像。
下面将介绍如何构建自定义镜像,以及将其运行在 Docker 之中。
# 实现一个简单的 Node.js 应用
首先执行 npm init 初始化一个项目,该项目是一个 Node.js 应用,其根入口文件 index.js 代码如下。
const Koa = require('koa')
const app = new Koa()
app.use((ctx) => {
ctx.body = 'Hello Docker'
})
app.listen(8000)
当运行该脚本的时候,通过浏览器访问部署机器的 8000 端口,浏览器会返回、渲染 Hello Docker 文本。
# 编写 Dockerfile 文件
在项目根目录创建一个 Dockerfile 文件,其内容如下。
FROM node:latest
COPY . /app
WORKDIR /app
RUN npm i
CMD ["node", "index.js"]
FROM node:latest,该镜像基于Node.js镜像,冒号后面的是镜像的版本号,这里表示镜像基于最新的Node.js镜像。COPY . /app,将当前根目录的所有文件(除开被.dockerignore忽略的文件),都复制到镜像的/app目录中。WORKDIR /app,工作目录为/app,也就是说镜像、容器默认都是在/app目录下执行命令的。RUN npm i,RUN用于构建镜像时执行命令,这里执行npm i来安装依赖。CMD ["node", "index.js"],CMD为容器启动时执行的命令,这里启动了一个Node.js服务。
RUN 和 CMD 都是用来执行命令,相似但有以下不同。
RUN是在构建镜像阶段执行,执行后的产物都会打包进构建出来的image中,所以一般用于应用环境依赖的安装,而CMD是在容器启动的时候执行。- 一个
Dockerfile中能够有个RUN指令,而CMD只能有一个。
# 构建镜像
有了 Dockerfile 之后,我们可以根据 Dockerfile 构建镜像,执行以下命令。
docker build -t hello-docker .
build,构建镜像。-t,镜像的名称,这里是hello-docker。.,命令的最后,用于告诉Docker应该在哪查找Dockerfile文件,这里用的是当前项目根目录。
构建成功之后,执行 docker image ls,可以看到一个名为 hello-docker 的镜像文件。
# 生成、运行容器
执行下方命令,以 hello-docker 镜像生成、运行一个容器实例。
docker run -d -p 8000:8000 hello-docker
-d,后台执行。-p 8000:8000,宿主机器的 8000 端口映射至容器的 8000 端口。
启动成功之后,执行 docker container ls 可以看见多出了一个 status 为 up 的容器。我们访问宿主机器的 8000 端口,比如 http://192.168.0.103:8000/ ,此时可看见浏览器返回了 Hello Docker 文本,至此我们的自定义镜像、容器已经成功部署运行。
本文 demo 源码可从 https://github.com/xuwenchao66/docker-demos (opens new window)中查看、获取。