一、Docker 究竟是什么
Docker 就是一个盒子管理器。
它可以创建一个个隔离小盒子(容器),每个盒子里面装一套程序,盒子之间互不干扰。
- Docker:管理工具(总管)
- 镜像:盒子的模板 / 安装包(存硬盘)
- 容器:按照模板跑起来的实实在在运行的小盒子(内存里运行)
类比:
镜像 = 蛋糕模具
容器 = 用模具烤出来的蛋糕,可以烤很多个蛋糕
二、为什么会产生这么多容器?是谁规定的?
是这个项目的docker-compose.yml文件写死规定的。
打开这个文件,里面写了要启动 5 个服务:
- frontend(网页前端)
- api(后端接口)
- worker(任务工人)
- redis(消息快递员)
- postgres(数据库)
只要你执行docker compose up,Docker 就读这个配置文件,自动一次性创建 5 个容器。
不是你手动创建的,是项目配置告诉 Docker:把这 5 个盒子全部启动起来协同工作。
不是 Docker 强制要求,是 Polaris 这个软件本身设计就需要这 5 个组件配合才能完整工作。
- frontend【前端网页】
浏览器打开看到的页面界面。
- polaris‑api 【后端接口】
网页点按钮、提交任务,全部访问它。网页 ↔ api 对话。
基于polaris‑texbase镜像启动。
- polaris‑worker【任务工人】
真正干活的。调用大模型 API、跑任务、处理论文全部交给 worker。
也基于polaris‑texbase镜像启动。
- polaris‑redis【消息快递员】
任务队列。api 收到任务,把任务写进 redis;worker 从 redis 拿任务去做。
独立容器,不是 api/worker 里面的。
- polaris‑postgres【数据库】
存数据:你的账号、对话记录、项目信息全部存在这里。
独立数据库容器。
关系:
浏览器 → frontend 网页 → api 后端 → redis (任务队列) → worker 干活 → postgres 存数据
三、redis、postgres:镜像 vs 容器,什么叫官方公共镜像
先分清两个概念:
- redis:7‑alpine 【官方公共镜像】
这是模板(安装包),Redis 软件的作者把做好的镜像上传到 Dockerhub 公开给全世界下载,所有人都可以拿来用,所以叫官方公共镜像。
它不是 Polaris 作者自己写的,是现成别人做好的。 - polaris‑redis 【容器】
拿上面这个redis:7‑alpine官方镜像,烤出来一个运行中的盒子,这个运行出来的实例名字叫polaris‑redis,这才是容器。
📌一句话:
redis:7‑alpine = 模板(镜像);polaris‑redis = 用模板生成出来正在跑的盒子(容器)
同理:postgres:16→官方镜像(模板)polaris‑postgres→生成出来的容器(运行盒子)
而我们本地编译出来的:polaris‑texbase:latest→我们自己本地构建的镜像模板
api、worker 容器,是拿这个模板烤出来的容器
四、做什么会触发重新构建镜像,重新make dev
- Dockerfile本身改动
- docker上下文里面的文件发生变化(复制docker/.env就触发了)
- 项目目录下文件新增/修改,docker检测到文件哈希变动,缓存失效,全部重新build镜像
不小心用了cp 复制命令(不需要的),为了挽回一下,并且不想重新再make dev了,我现在需要
- 撤回之前把.env 复制进 docker 的操作
- 复用旧的构建缓存,不要重新 build!
- 在项目根目录~/Polaris/.env 添加邀请码(用于注册)【最后其实发现邀请码可以找到,不用自己设置】
- 保证docker 文件夹里不要存在.env,避免触发缓存失效
五、小记
构建镜像= 把运行代码所需要的系统、软件、依赖库全部准备齐全打包。
docker ps-a: 查看所有的容器
ps-process,正在运行的程序/容器
-a:all,全部的包括已经停止的,死掉的容器也一起显示出来
polaris‑texbase:latest是镜像,不是容器!
镜像相当于安装包,容器相当于把安装包跑起来的运行实例。
Q: 为什么修改后必须删掉容器?make down
A: 容器创建的那一刻才会读取。env里面的API密钥、配置。如果旧容器还在的话,compose不会新建新的容器,直接复用老盒子;所以修改后的.env根本不会生效。
nano .env编辑 配置文件
cat .env查看 配置文件
tail .env查看末尾几行 配置文件