如何将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. 启动验证
- 进入
docker/文件夹:cd docker - 构建并启动容器:
docker-compose up --build - 打开浏览器访问
http://localhost:8000,如果能看到Django的默认欢迎页面,就说明配置成功了!
内容的提问来源于stack exchange,提问作者George B
相关产品推荐
相关产品推荐

