You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Docker与Docker-Compose从Django源码目录分离并搭建指定结构

没问题,这个把部署配置和业务代码分离的结构非常合理,能让项目职责划分更清晰,下面我一步步带你实现这个目标:

实现步骤

1. 先搭建好目标目录结构

首先在你的项目根目录下创建对应的文件夹和文件,最终结构应该是这样的:

你的项目根目录/
├── docker/
│   ├── docker-compose.yml
│   ├── Dockerfile-app
│   └── Dockerfile-mysql
└── src/
    ├── djangoproj/       # 你的Django项目根目录(注意统一拼写,避免和命令里的名称混淆)
    ├── core/             # 你的业务应用模块
    └── requirements.txt  # Django依赖清单

2. 配置docker-compose.yml

因为docker-compose.yml放在docker/文件夹下,要注意路径的相对引用,确保能正确找到Dockerfile和源码目录。下面是修正后的完整配置:

version: '3'
services:
  app:
    build:
      context: ../  # 指向项目根目录,这样能访问到外层的src文件夹
      dockerfile: docker/Dockerfile-app  # 相对于context的Dockerfile路径
    command: /bin/bash -c "cd /var/www/app/src/djangoproj && pip install -r ../requirements.txt && python manage.py runserver 0.0.0.0:8000 || sleep 100000"
    container_name: website_app
    ports:
      - "8000:8000"  # 映射宿主机端口到容器,方便外部访问
    depends_on:
      - mysql
    networks:
      - website_network  # 用网络替代links,更符合Docker最佳实践

  mysql:
    build:
      context: ../
      dockerfile: docker/Dockerfile-mysql
    container_name: website_mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_root_pwd
      MYSQL_DATABASE: django_db
      MYSQL_USER: django_user
      MYSQL_PASSWORD: django_pwd
    volumes:
      - mysql_data:/var/lib/mysql  # 持久化MySQL数据,避免容器销毁后数据丢失
    networks:
      - website_network

networks:
  website_network:
    driver: bridge

volumes:
  mysql_data:

注意:

  • 把your_root_pwd、django_db等字段替换成你实际的数据库配置
  • 我把原来的links换成了networks,这是Docker推荐的服务间通信方式,比links更灵活稳定
  • 修正了原命令里requirements-develop.tx的拼写错误,改成了requirements.txt(如果确实是requirements-develop.txt,你再改回去即可)

3. 编写Dockerfile-app

这个文件负责构建你的Django应用镜像,内容如下:

# 选择合适的Python基础镜像,这里用3.10-slim版本兼顾体积和功能
FROM python:3.10-slim

# 设置容器内的工作目录
WORKDIR /var/www/app

# 先复制requirements.txt,利用Docker缓存优化构建速度
COPY src/requirements.txt .

# 安装系统依赖和Python依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    default-libmysqlclient-dev \
    && rm -rf /var/lib/apt/lists/* \
    && pip install --upgrade pip \
    && pip install -r requirements.txt

# 复制整个src目录到容器的工作目录下
COPY src/ .

# 暴露Django默认服务端口
EXPOSE 8000

4. 编写Dockerfile-mysql(可选)

如果不需要自定义MySQL镜像,直接用官方的mysql:8.0即可;如果需要自定义配置(比如默认字符集),可以用这个Dockerfile:

FROM mysql:8.0

# 复制自定义配置文件到容器,设置默认字符集为utf8mb4
COPY docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf

你需要在docker/mysql/下创建my.cnf文件,内容示例:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4

5. 启动验证

  1. 进入docker/文件夹:cd docker
  2. 构建并启动容器:docker-compose up --build
  3. 打开浏览器访问http://localhost:8000,如果能看到Django的默认欢迎页面,就说明配置成功了!

内容的提问来源于stack exchange,提问作者George B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:34