Appearance
记录一次 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"]
使用
node alpine
镜像,阉割了很多不需要的linux
功能,是镜像体积大幅减小先复制
package.json
文件npm install
,再复制项目docker
是分层存储的,Dockerfile
的每一行指令是一层,会有缓存,会从有变化的层开始构建,当package.json
无变化时,不会执行npm install
,会直接复用。分阶段构建,将打包后的产物用于发布,避免源码的直接使用
打包
bash
docker build -t my-project:1.0.1 .
docker build
: 用于构建Docker
镜像,会根据当前目录下的Dockerfile
文件构建一个Docker
镜像-t my-project:1.0.1
: 用于指定要构建的镜像的名称和标签。my-project
是镜像的名称,1.0.1
是标签。标签用于标识镜像的特定版本或标识符.
: 这是构建上下文的路径。Docker
在构建镜像时需要访问一个上下文,以获取构建所需的所有文件和信息,.
表示当前目录是构建上下文
上传 Docker 镜像到服务器中
bash
docker save -o ./my-project.tar my-project:1.0.1
scp ./my-project.tar [email protected]:/root/images/
docker save
: 用于将一个或多个Docker
镜像打包成一个tar
压缩文件o ./my-project.tar
: 指定输出文件的路径和名称。这里将Docker
镜像保存为my-project.tar
my-project:1.0.1
: 要保存的Docker
镜像的名称和标签, 在这个例子中是my-project
仓库下的1.0.1
版本scp
: 用于在本地主机和远程主机之间安全地复制文件./my-project.tar
: 要传输的本地文件路径和名称,即第一个打包的压缩文件[email protected]:/root/images/
: 目标主机的用户名(root
)、IP
地址(x.x.x.x
)以及目标路径。将文件传输到远程主机的/root/images/
目录下
部署 Docker 镜像
连接远程服务器
这里使用的
ssh
链接服务器
bash
ssh [email protected]
# 进入目录查看
cd root/images/
ls
- 登录远程服务器
- 找到镜像位置,确定镜像文件
加载镜像
bash
# 进入 my-project.tar 所在的目录
docker load -i images/my-project.tar
docker load
: 用于将上面使用docker save
导出的Docker
镜像加载到Docker
i images/myproject.tar
: 指定输入文件,即包含Docker
镜像的tar
压缩文件
打标签
bash
docker tag my-project:1.0.1 my-project:latest
docker tag
: 用于为Docker
镜像打标签myproject:1.0.1
: 要标记的旧镜像名称和标签myproject:latest
: 新的标签
bash
docker stop my-project && docker rm my-project
暂停并移除服务
docker stop myproject
: 停止名为myproject
的Docker
容器docker rm myproject
: 删除名为myproject
的Docker
容器
bash
docker run --name my-project -p 2333:3000 -d -v /root/logs:/usr/src/app/logs --restart always my-project
运行 Docker 服务
docker run
: 用于在新容器中运行一个命令-name myproject
: 为新容器指定名称为myproject
p 2333:3000
: 将主机的端口2333
映射到容器的端口3000
d
: 在后台运行容器v /root/logs:/usr/src/app/logs
: 将主机上/root/logs
目录挂载到容器内的/usr/src/app/logs
目录-restart always
: 设置容器总是自动重启myproject
: 要运行的Docker
镜像的名称和标签
部署完后可以通过以下方式访问服务接口
text
x.x.x.x:2333/path