仅通过Dockerfile为Django应用集成Memcached的实现方法
仅通过Dockerfile集成Django与Memcached的实现方案
注:单容器同时运行多个服务不符合容器单进程单职责的设计原则,生产环境优先推荐多容器编排方案,以下方案仅适用于本地开发、测试等不想使用docker-compose的场景
核心实现思路是通过supervisor进程管理工具,在同一个容器内同时拉起Memcached服务和Django应用进程,具体配置步骤如下:
- 编写Dockerfile,完成系统依赖、Python依赖、项目代码的拷贝,配置supervisor作为启动入口
- 编写supervisor配置,分别定义Memcached和Django的启动规则、自启策略
- 修改Django配置文件,指向同容器内的Memcached服务地址
1. Dockerfile 示例
FROM python:3.11-slim # 配置Python环境变量 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 # 安装系统依赖:Memcached服务、supervisor进程管理器 RUN apt-get update && apt-get install -y --no-install-recommends \ memcached \ supervisor \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # 安装Python依赖,requirements.txt中需要包含Django以及Memcached客户端(如pymemcache) COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 拷贝项目代码 COPY . . # 拷贝supervisor配置到容器内 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 暴露Django默认端口8000、Memcached默认端口11211 EXPOSE 8000 11211 # 启动supervisor管理所有服务进程 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
2. supervisor配置文件(supervisord.conf)
和Dockerfile放在同一目录下,配置两个服务的启动规则:
[supervisord] nodaemon=true user=root logfile=/var/log/supervisord.log pidfile=/run/supervisord.pid [program:memcached] command=/usr/bin/memcached -m 64 -p 11211 -u memcache autostart=true autorestart=true stdout_logfile=/var/log/memcached.log stderr_logfile=/var/log/memcached_err.log [program:django] # 可替换为生产环境启动命令,比如gunicorn启动指令 command=python manage.py runserver 0.0.0.0:8000 directory=/app autostart=true autorestart=true stdout_logfile=/var/log/django.log stderr_logfile=/var/log/django_err.log
Memcached启动参数中
-m 64代表为服务分配64MB运行内存,可根据实际需求调整数值。
3. Django侧缓存配置
修改项目的settings.py,配置缓存后端为Memcached,地址指向本地11211端口:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'LOCATION': '127.0.0.1:11211', } }
4. 构建与运行命令
- 构建镜像:
docker build -t django-with-memcached . - 启动容器:
docker run -p 8000:8000 -p 11211:11211 django-with-memcached
注意事项
- 若使用gunicorn、uWSGI等生产级WSGI服务器部署Django,直接替换supervisord.conf中Django段的启动命令即可
- 该方案下两个服务共享容器的网络、存储资源,无法单独针对某一个服务做资源限制、故障隔离,不建议在生产环境使用
内容的提问来源于stack exchange,提问作者Devika B Raj
相关产品推荐
相关产品推荐

