制作自己的镜像
简单版本
1. 编写 Dockerfile
Dockerfile
# 基础镜像
FROM node:latest
# 维护者信息
LABEL maintainer="jsopy"
# 设置工作目录
WORKDIR /app
# 复制文件到工作目录注意. 后面的空格
COPY . /app
# 安装依赖
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install -g http-server
# 暴露端口
EXPOSE 8080
# 挂载磁盘
VOLUME /app
# 执行命令
CMD ["http-server", "-p", "8080"]
2. 构建镜像
- 注意 最后是 空格+
.
shell
docker build -t 你的镜像名称:你的标签名称 -f 你指定的dockerfile名字 .
复杂版本
.dockerignore
.dockerignore
文件和.gitignore
文件类似,用于排除不需要包含在镜像中的文件和目录
bash
*.md
!README.md
node_modules/
[a-c].txt
.git/
.DS_Store
.vscode/
.dockerignore
.eslintignore
.eslintrc
.prettierrc
.prettierignore
*.md
就是忽略所有 md 结尾的文件,!README.md
就是其中不包括 README.mdnode_modules/
就是忽略node_modules
下 的所有文件[a-c].txt
就是忽略 a.txt, b.txt, c.txt.git/
就是忽略 git 仓库.DS_Store
就是忽略 mac 系统下的隐藏文件.vscode/
就是忽略 vscode 的配置文件.dockerignore
就是忽略 dockerignore 文件.eslintignore
就是忽略 eslint 的配置文件.eslintrc
就是忽略 eslint 的配置文件.prettierrc
就是忽略 prettier 的配置文件.prettierignore
就是忽略 prettier 的配置文件
pm2 版本
1. 先去拉取 Node 基础镜像
- 我拉取的是 alpine 版本的 node 镜像,因为 alpine 镜像比较小,比较适合用来做基础镜像
bash
docker pull node:22-alpine3.21
创建一个 nest 项目
- 项目结构
ts
// 写一个nest项目目录
├── .dockerignore
├── 2.dockerfile // 删除src只保留dist版本
├── Dockerfile // 原始版本全部保留
├── README.md
├── nest-cli.json
├── package.json
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.spec.ts
│ ├── app.module.ts
│ ├── app.service.spec.ts
│ ├── app.service.ts
│ ├── main.ts
│ └── test.ts
├── test
│ ├── app.e2e-spec.ts
│ └── test.app.module.ts
└── tsconfig.json
编写 Dockerfile
bash
FROM node:alpine3.22
WORKDIR /app
COPY package.json .
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install
COPY . /app
RUN npm run build
RUN npm install pm2 -g
EXPOSE 5000
# CMD ["pm2-runtime", "/app/main.js"] // 无配置文件
CMD ["pm2-runtime","start", "ecosystem.config.js","--env","production" ]
执行打包命令
bash
docker build -t 你的镜像名:版本号 -f 你指定的dockerfile .
非 pm2 版本
1. 先去拉取 Node 基础镜像
- 我拉取的是 alpine 版本的 node 镜像,因为 alpine 镜像比较小,比较适合用来做基础镜像
bash
docker pull node:22-alpine3.21
创建一个 nest 项目
- 项目结构
ts
// 写一个nest项目目录
├── .dockerignore
├── 2.dockerfile // 删除src只保留dist版本
├── Dockerfile // 原始版本全部保留
├── README.md
├── nest-cli.json
├── package.json
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.spec.ts
│ ├── app.module.ts
│ ├── app.service.spec.ts
│ ├── app.service.ts
│ ├── main.ts
│ └── test.ts
├── test
│ ├── app.e2e-spec.ts
│ └── test.app.module.ts
└── tsconfig.json
编写 Dockerfile
ts
FROM node:22-alpine3.21
WORKDIR /app
COPY package.json .
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install
COPY . /app
RUN npm run build
EXPOSE 5000
CMD [ "node", "./dist/main.js" ]
- 这种打包以后 900M 左右,因为把 src 下的所有文件都打包进去了,所以体积比较大
编写 2.dockerfile 去掉 src
bash
# build stage
# 通过 FROM 继承镜像的时候,给当前镜像指定一个名字,比如 build-stage。
#-alpine3.14 就是用 alpine 的 linux 的 3.5 版本,用 node 的 最新 版本。
FROM node:22-alpine3.21 AS build-stage
# 指定app目录为工作目录
WORKDIR /app
# 将package.json复制到工作目录
COPY package.json .
# 设置仓库
RUN npm config set registry https://registry.npmmirror.com/
# 安装依赖
RUN npm install
# 将所有文件复制到工作目录
COPY . /app
# 构建项目
RUN npm run build
# production stage
# 通过 FROM 继承镜像的时候,给当前镜像指定一个名字,比如 production-stage。
FROM node:22-alpine3.21 AS production-stage
# 通过 COPY --from-build-stage 从那个镜像内复制 /app/dist 的文件到当前镜像的 /app 下。
COPY --from=build-stage /app/dist /app
COPY --from=build-stage /app/package.json /app/package.json
# 指定工作目录
WORKDIR /app
# 设置仓库地址
RUN npm config set registry https://registry.npmmirror.com/
# 安装依赖
RUN npm install --production
# 暴露端口
EXPOSE 5000
# 启动项目
CMD ["node", "/app/main.js"]
- 这种打包以后是上面的一半 因为没有 src 目录
执行打包命令
bash
docker build -t 你的镜像名:版本号 -f 你指定的dockerfile .