Skip to content

记录一次 Docker 服务部署

打包 Docker 镜像

正确的写一个 Dockerfile

一个基于 Node 服务的 LLM Chat 项目

docker
FROM node:16-alpine as builder

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM node:16-alpine

WORKDIR /usr/src/app

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/.env ./
ENV SKIP_HUSKY=true
RUN npm install --only=production

EXPOSE 3000

CMD ["npm", "start"]
  1. 使用 node alpine 镜像,阉割了很多不需要的 linux 功能,是镜像体积大幅减小

  2. 先复制 package.json 文件 npm install ,再复制项目

    docker 是分层存储的,Dockerfile 的每一行指令是一层,会有缓存,会从有变化的层开始构建,当 package.json 无变化时,不会执行 npm install ,会直接复用。

  3. 分阶段构建,将打包后的产物用于发布,避免源码的直接使用

打包

bash
docker build -t my-project:1.0.1 .
  1. docker build: 用于构建 Docker 镜像,会根据当前目录下的 Dockerfile 文件构建一个 Docker 镜像
  2. -t my-project:1.0.1: 用于指定要构建的镜像的名称和标签。my-project 是镜像的名称,1.0.1 是标签。标签用于标识镜像的特定版本或标识符
  3. .: 这是构建上下文的路径。Docker 在构建镜像时需要访问一个上下文,以获取构建所需的所有文件和信息, . 表示当前目录是构建上下文

上传 Docker 镜像到服务器中

bash
docker save -o ./my-project.tar my-project:1.0.1
scp ./my-project.tar [email protected]:/root/images/
  1. docker save: 用于将一个或多个 Docker 镜像打包成一个 tar 压缩文件
  2. o ./my-project.tar: 指定输出文件的路径和名称。这里将 Docker 镜像保存为 my-project.tar
  3. my-project:1.0.1: 要保存的 Docker 镜像的名称和标签, 在这个例子中是 my-project 仓库下的 1.0.1 版本
  4. scp: 用于在本地主机和远程主机之间安全地复制文件
  5. ./my-project.tar: 要传输的本地文件路径和名称,即第一个打包的压缩文件
  6. [email protected]:/root/images/: 目标主机的用户名(root)、IP 地址(x.x.x.x)以及目标路径。将文件传输到远程主机的 /root/images/ 目录下

部署 Docker 镜像

连接远程服务器

这里使用的 ssh 链接服务器

bash
ssh [email protected]
# 进入目录查看
cd root/images/
ls
  1. 登录远程服务器
  2. 找到镜像位置,确定镜像文件

加载镜像

bash
# 进入 my-project.tar 所在的目录
docker load -i images/my-project.tar
  1. docker load: 用于将上面使用 docker save 导出的 Docker 镜像加载到 Docker
  2. i images/myproject.tar: 指定输入文件,即包含 Docker 镜像的 tar 压缩文件

打标签

bash
docker tag my-project:1.0.1 my-project:latest
  1. docker tag: 用于为 Docker 镜像打标签
  2. myproject:1.0.1: 要标记的旧镜像名称和标签
  3. myproject:latest: 新的标签
bash
docker stop my-project && docker rm my-project

暂停并移除服务

  1. docker stop myproject: 停止名为 myprojectDocker 容器
  2. docker rm myproject: 删除名为 myprojectDocker 容器
bash
docker run --name my-project -p 2333:3000 -d -v /root/logs:/usr/src/app/logs --restart always my-project

运行 Docker 服务

  1. docker run: 用于在新容器中运行一个命令
  2. -name myproject: 为新容器指定名称为 myproject
  3. p 2333:3000: 将主机的端口 2333 映射到容器的端口 3000
  4. d: 在后台运行容器
  5. v /root/logs:/usr/src/app/logs: 将主机上 /root/logs 目录挂载到容器内的 /usr/src/app/logs 目录
  6. -restart always: 设置容器总是自动重启
  7. myproject: 要运行的 Docker 镜像的名称和标签

部署完后可以通过以下方式访问服务接口

text
x.x.x.x:2333/path

Released under the MIT License.