docker学习记录-Dockerfile的使用

365 阅读3分钟

前言

在实际的开发中的docker是用来生产运行一个个应用。使用docker来运行应用就必须经过以下流程:配置镜像基础信息=》构建镜像=》运行镜像。而构建镜像我们可以根据docker的基础命令docker commit来构建,这种方式的缺点很明显:可移植性差(每次构建都需要基于现有的container),难以扩展和维护(基于容器创建的,难以直接更改镜像的配置文件)。为了解决这种问题docker提供了另外一种构建方式-Dockerfile。下面我们来减少下Dockerfile的构建方式。

Dockerfile

dockerfile是一个用来构建基础镜像的文本文件,当我们运行docker build Dockerfile时候,docker会根据Dockerfile中的指令来构建镜像。Dockerfile中的每一条指令构建一层,每一条指令的内容就是描述该层应当如何构建。以下常用的指令有:

常用指令

  • FROM:在我们构建镜像时候基础镜像必须指定并且指定基础镜像的指令FROMn必须在第一行,
    • AS:一般用于多阶段构建中指定某个阶段的名称,后续可以在其他阶段方便使用,该指令常与FROM一起使用也可以与 RUN和COPY一起用
FROM nginx:latest AS running

RUN npm build AS build
  • RUN: 构建镜像的重要部分,用于执行任意命令,并将结果提交到镜像中。常用于软件安装,脚本运行等,基本用法如下
RUN <command>

  • COPY:将宿主机中的文件或目录复制到镜像中,在多阶段构建中也可以复制某一个阶段的产物
COPY --from=build ** ***
  • WORKDIR:设置docker镜像的工作目录,主要作用如下:
    • 指定WORKDIR后,接下来的指令都会相对于该目录执行
    • 确保镜像中工作目录的存在(如果不存在则会自动创建)
    • 使dockerfile更加易读
//设置工作目录
WORKDIR /app
//后续的操作基于/app,将
COPY ./
  • CMD:指定容器启动时要运行的命令。每个 Dockerfile 只能有一个 CMD 指令。如果指定多个,只有最后一个会被执行。
CMD ["node", "app.js"]
  • ENV:设置镜像的环境变量值,通常用来区分软件运行的环境,可以同时设置多个,具体设置方法如下:
ENV <key>=<value>
# 设置变量
ENV NODE_ENV=prd
  • nodejs服务中通过process.env获取环境变量
const nodeEnv = process.env.NODE_ENV || 'development';
  • EXPOSE:声明镜像要公开的端口,但不会实际应用,主要作为文档说明使用

应用-前端部署

前端项目的部署方式有很多种,目前适用于k8的容器部署(Docker)是生产环境常用的一种,此种方式的优点是能保证环境的一致性,避免生产和测试环境不同造成的"测试没问题生产有问题",另外容器部署简单快捷(通过Dockerfile只用几行命令),易于扩展和管理。下面介绍下通过Dockefile部署的react项目的步骤:

  • 在镜像文件中打包编译前端项目生成最终发版的产物
  • 通过Docker命令复制打包好的产物到镜像中
  • 复制nginx服务配置并运行nginx服务
# 打包阶段
FROM node:16 AS build
WORKDIR /workspace
COPY . .
RUN npm config set registry https://registry.npmmirror.com
RUN npm install
RUN npm run build

# 运行服务
FROM nginx:latest
COPY --from=build /workspace/dist/* /workspace/www
COPY src/assets/nginx.conf /etc/nginx/conf.d/Kspace.conf
RUN rm -rf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ['nginx']

  • 生成镜像:通过docker build生成docker镜像
docker buidl -t demo .
  • 服务启动:启动docker镜像