内容纲要
一、上传代码到服务器
配置信息:
1、linux:
Ubuntu 22.04 64 位
2、docker:
Docker version 25.0.5(阿里云源)
3、MySQL
8.0.36 / 8.0.37
4、postgresql:
15
注意的点:
镜像、应用的版本号要注意和固定
拉取镜像的国内来源都要写好
下载什么之前都要配置好来源地址
1、从本地打包,把ppt_generation文件夹,打包成tar包:ppt_generation.tar.gz
tar -czvf ppt_generation.tar.gz ppt_generation
2、上传压缩包到服务器
先删除旧秘钥(非必选)
ssh-keygen -R 175.178.117.184
命令格式:
scp 本地文件路径 用户名@服务器IP:服务器目标路径
scp ppt_generation.tar.gz root@43.99.55.217:/opt/ppt/
scp ppt_generation.tar.gz ubuntu@175.178.117.184:~/
sudo mv ~/ppt_generation.tar.gz /opt/ppt/
3、在服务器上解压
tar -zxvf ppt_generation.tar.gz
4、做好准备工作:
1. 确认文件名称与位置
在执行构建命令之前,必须确保Dockerfile、 pyproject.toml 和 uv.lock 这些文件已经存在于项目目录中。
pyproject.toml: 定义了项目的元数据和依赖。
uv.lock: 锁定了所有依赖的具体版本,确保环境的一致性。
如果你的项目还没有这两个文件,你需要先在本地使用 uv 命令生成它们,然后再连同 Dockerfile 一起上传到服务器。
如果缺少 uv.lock 文件,构建过程会直接报错失败。
二、安装docker
5、在linux系统上先卸载可能存在的docker旧版本,有就卸载,没有就当做“清理+保险”
sudo apt remove -y docker.io docker-ce docker-ce-cli containerd.io
sudo apt autoremove -y
sudo rm -rf /var/lib/docker /etc/docker
命令注释
docker.io: 它是Ubuntu 社区维护的旧版 Docker 打包,不是 Docker 官方发布的版本。
docker-ce: ce=Community Edition(社区版)。Docker官方维护的开源免费版本,也是目前生产环境的标准选择。
docker-ce-cli: Docker 命令行客户端
containerd.io:
docker-compose-plugin
6、配置安装docker的镜像源地址(如果换了别的系统,要找AI重新生成命令)(先看清系统版本:noble:Ubuntu 24.04。jammy:Ubuntu 22.04)
加密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
加国内源(中科大,超快)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
7、添加 / 修改 / 删除 软件源之后,必须执行一次 <code>apt update</code>,把下载地址,同步到本地
apt update
8、查看刷新apt地址后,查看apt现在支持的docker版本:取相同值
apt list -a docker-ce
apt list -a containerd.io
8、在linux系统上安装docker(为了固定版本),将apt list -a docker-ce命令返回的结果,掐头去尾,复制主体,作为版本号信息进行安装
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
9、锁定版本
sudo apt-mark hold docker-ce docker-ce-cli containerd.io
10、确认版本号是否正确:
docker --version
三、打包项目为镜像文件
改Dockerfile文件内容
FROM python:3.12-slim
WORKDIR /app
# 安装 uv(国内清华源)
RUN pip install --no-cache-dir uv -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制依赖文件
COPY pyproject.toml ./
# ==========================================
# 核心:自动删除可能存在的国外 lock
# 自动用国内源重新生成 lock + 安装依赖
# ==========================================
RUN rm -f uv.lock && \
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
uv lock && \
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
uv pip install --system -e .
# 复制代码
COPY . .
# 启动服务
EXPOSE 8000
CMD ["uvicorn", "api.app:app", "--host", "0.0.0.0", "--port", "8000"]
命令解析:
uv sync:这就是用来下载依赖包
这是核心命令,意思是“根据 uv.lock 文件安装依赖”。
作用:它会读取 uv.lock,然后去下载并安装所有列出的第三方库。
--frozen:
含义:严格模式。
作用:它要求 pyproject.toml(项目定义)和 uv.lock(锁定版本)必须完全一
致。如果 uv.lock 不存在,或者它不是基于当前的 pyproject.toml 生成
的,uv 就会报错退出,不会自动去重新生成锁文件。
Docker 构建中,不希望构建过程“偷偷”修改了依赖版本。--frozen 确保了构建的可复现性。
--no-install-project:
含义:不安装当前项目本身。
依赖包被下载到哪里去了
当你执行uv sync时,uv默认会在当前工作目录(WORKDIR /app)下创建一个虚拟环境(.venv)
所有的第三方库(如 flask, requests 等)都会被解压并安装在这个 .venv/lib/python3.12/site-packages 目录下。
11、开始构建镜像文件(不带缓存)
docker build --no-cache -t ppt_generation:v1.0 .
12、查看镜像地址所在(被打包后镜像被docker接管,并存放在docker的目录下)
docker images
四、保存镜像文件
13、保存镜像文件(镜像包的名字不能出现冒号符号)
docker save -o ppt_generation_v1.0.tar ppt_generation:v1.0
docker save -o python_3.12_slim.tar python:3.12-slim
14、导出镜像文件到本地,在本地cmd窗口里执行
scp root@120.25.223.91:/opt/ppt/ppt_generation_v1.0.tar D:\projects\code\docker_images\
镜像包文件复用
从本地cmd上传两个镜像
scp D:\projects\code\docker_images\ppt_generation_v1.0.tar root@120.25.223.91:/opt/ppt/
scp D:\projects\code\docker_images\ppt_generation_v1.0.tar root@120.25.223.91:/opt/ppt/
进入目录
cd /opt/ppt
加载镜像
docker load -i ppt_generation_v1.0.tar
五、启动容器服务
15、docker-compose.yaml
services:
ppt_gen:
image: ppt_generation:v1.0
restart: always
ports:
- "8000:8000"
16、启动容器
apt update && apt install -y docker-compose
docker-compose up -d
docker-compose down
17、实时查看容器日志(排查错误最关键)
docker-compose logs -f
15、docker compose文件编辑
18、docker compose文件编辑
services:
app:
# 直接使用你已经打包好的镜像
image: ppt_generation:v1.0 # 你的镜像名字
ports:
- "8000:8000"
depends_on:
- mysql
- postgres
restart: always
environment:
# 🔥 🔥 🔥 关键:强制覆盖代码里的 host
MYSQL_HOST: mysql
POSTGRESQL_HOST: postgres
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: user_login_info
volumes:
- mysql_data:/var/lib/mysql
postgres:
image: postgres:15
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: abc123456
POSTGRES_DB: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
mysql_data:
postgres_data:
docker 命令集
查看所有容器
docker ps -a
停止容器
docker stop <容器名称或ID>
删除容器
docker rm <容器名称或ID>
强制删除(停止+删除)
docker rm -f <容器名称或ID>
删除所有已经停止的容器
docker container prune
删除所有docker镜像
docker rmi -f $(docker images -aq)
查看版本号:
docker-version