前言
在实际的开发中的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镜像