Dockerfile 创建容器
小公鸡卡哇伊呀~ 人气:0Dockerfile
Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令,是用于创建 image 的蓝图。
现在有一个简单的 node 项目( 其中Dockerfile 是后面加的,初始项目没有此文件):
要运行此代码,一般的做法是,先在本机安装 node,然后在项目文件夹中先后运行:
npm install
以及:
node server.js,
然后在浏览器 localhost 地址就可以看到app运行界面。
写一个 Dockerfile
如果要改为在 container
中运行此程序,那么首先需要有此 node app
的image
,要创建 image, 则需要写一个Dockerfile:
# 将在 node image 基础上创建此自定义的 image FROM node # Docker container 工作目录 # 此指令告诉 Docker,余下的指令将在容器内的 /app 文件夹内执行。 WORKDIR /app # 将当前项目文件夹内的所有文件及子文件全部copy 到 /app 文件夹中 # 因为有上一条指令,这里改为 COPY . . 也可以 COPY . /app # 安装 package.json 中的package,生成 node_modules 文件夹 RUN npm install # 容器内的进程将发布端口 80 # 可选,这条指令什么也不做,只起文档作用,best practice EXPOSE 80 # 当基于此 image 的容器启动后,命令 node server.js 将会执行 CMD ["node", "server.js"]
上述Dockerfile总共6条指令,起作用的只有5条。
然后在终端执行命令,此命令将生成此 node app 的 image:
docker build .
. 号是Dockerfile 文件所在的路径,这里刚好是当前路径。
docker
容器是与外界独立的进程,具有自己的内部网络,当容器内的 node 应用程序在容器的端口 80 监听时,容器不会将该端口发布到我们的本地机器。此外 Dockerfile 里的端口不起作用,因此必须在命令中使用 --publish 或者 -p 实现本机端口和运行的容器端口的映射。
运行基于此image的容器:
docker run --publish 3000:80 previously_generated_image_id
打开浏览器 localhost:3000
就可以查看运行界面。
优化 Dockerfile
image
只读,如果修改了 source code,需要重新 build 一遍,其中的 npm install 特别费时间,但此指令通常是不需要执行的,因为新增第三方包的可能性远低于修改代码的可能性。
每次build image
时,Docker 都会缓存每条指令执行的结果。所以当重新 build image 时,如果不需要再次运行指令,它将使用这些缓存的结果。 这被称为基于层的架构。
每条指令都代表 Dockerfile 中的一个层, image 是根据这些不同的指令简单地从多个层构建的。
将 RUN npm install 指令提前将能优化image 的构建:
FROM node WORKDIR /app COPY package.json /app # 将此指令提前,通常都能利用前一次build 的结果, # 因此能极大节省重新 build image 所需要的时间。 RUN npm install COPY . /app # optional # 这条指令什么也不做,只起文档作用,best practice EXPOSE 80 CMD ["node", "server.js"]
container shell
使用 -it 能获得容器的 shell, i: interactive, t: tty :
docker run -it 46613ce05eae bash
然后就可以查看安装到容器内的 node 版本,以及 /app 内的文件等等,使用 exit 命令退出。
root@ca432bda02aa:/app# node -v v18.0.0 root@ca432bda02aa:/app# ls Dockerfile node_modules package-lock.json package.json public server.js root@ca432bda02aa:/app#
加载全部内容