Docker部署教程

内容纲要

一、上传代码到服务器

配置信息:

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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部