docker使用命令行安装,代码使用git拉取
项目结构大致如下:
.
├── app
│ ├── main.py
│ ├── mq
├── docker-compose.yml
├── Dockerfile
├── Dockerfile.rabbitmq
├── README.md
├── requirements.txt
├── temp
└── templates
1.编写Dockerfile
# 使用官方 Python 3.11 镜像作为基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 复制 requirements.txt 文件到容器内
COPY requirements.txt /app/requirements.txt
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 将项目代码复制到容器内的 /app/app 目录
COPY ./app /app/app
# 复制 temp 目录(包括 img 目录)
COPY ./temp /app/temp
# 暴露 FastAPI 默认端口 8000
EXPOSE 8000
# 设置环境变量,确保日志输出不会被缓冲
ENV PYTHONUNBUFFERED=1
# 启动 FastAPI 服务
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
2.编写安装rabbbitmq延时队列的Dockerfile.rabbitmq
FROM rabbitmq:3.13-management
# 安装 wget 用于下载插件
RUN apt-get update && apt-get install -y wget
# 下载 rabbitmq_delayed_message_exchange 插件
RUN wget -P /plugins https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.13.0/rabbitmq_delayed_message_exchange-3.13.0.ez
# 启用插件
RUN rabbitmq-plugins enable --offline rabbitmq_delayed_message_exchange
此dockerfile作用:
在原始的 RabbitMQ 镜像中,可能并不包含应用所需要的所有插件。Dockerfile.rabbitmq
的一个重要作用就是安装额外的插件。例如,在你的案例中,需要使用 rabbitmq_delayed_message_exchange
插件来实现延迟消息功能,但基础镜像中没有该插件,因此通过 Dockerfile.rabbitmq
下载并安装该插件。
3.编写docker-compose.yml
services:
# FastAPI 服务
fastapi:
build: .
container_name: payment-service
env_file:
- .env
environment:
- DATABASE_URL=${DATABASE_URI}
- REDIS_URL=${REDIS_DB_URL}
- RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
rabbitmq:
condition: service_healthy
networks:
- backend
# MySQL 服务
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 111111
MYSQL_DATABASE: payment-service
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
start_period: 20s
timeout: 5s
# Redis 服务
redis:
image: redis:7.4.2
container_name: redis
networks:
- backend
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
retries: 5
start_period: 20s
timeout: 5s
# RabbitMQ 服务
rabbitmq:
build:
context: .
dockerfile: Dockerfile.rabbitmq
container_name: rabbitmq
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
ports:
- "5672:5672" # AMQP 协议端口
- "15672:15672" # 管理界面端口
networks:
- backend
healthcheck:
test: [ "CMD", "rabbitmqctl", "status" ]
interval: 10s
retries: 5
start_period: 20s
timeout: 5s
# 数据卷配置
volumes:
mysql_data:
driver: local
# 自定义网络配置
networks:
backend:
driver: bridge
4.执行命令
docker compose up --build # 前台运行
docker compose up --build -d # 后台执行
测试:
使用ip+端口访问
说明可以进行响应,部署成功。
5.代码更新
5.1首先使用git指令pull最新代码
git pull <远端分支>
5.2停止并删除现有容器
docker compose down
5.3. 重新构建和启动服务
docker compose up --build -d
6.踩坑
在docker-compose.yml里面刚开始写的是:
# RabbitMQ 服务
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
command: rabbitmq-plugins enable --offline rabbitmq_delayed_message_exchange
networks:
- backend
后面发现项目启动一直报错,问题是连接不上rabbitmq,后面使用命令发现:
mth@vm001:~/workspace/payment-service$ docker compose logs rabbitmq
rabbitmq | Enabling plugins on node rabbit@5afd62c446cb:
rabbitmq | rabbitmq_delayed_message_exchange
rabbitmq | Error:
rabbitmq | {:plugins_not_found, [:rabbitmq_delayed_message_exchange]}
找不到mq的延时队列插件。
再写一个Dockerfile,用来安装rabbitmq_delayed_message_exchange可以解决
若有收获,就点个赞吧