实习的时候遇到过一个希望用docker运行的Web页面,这是离开学校之后做的第一个项目,然后通过nginx做代理服务器运行了一下,在此记录。
1、setting.py
因为要用于生产环境,所以将Debug设置为False
# 关闭django的调试
DEBUG = False
# 允许所有链接
ALLOWED_HOSTS = ['*']
# 在DEBUG=False的时候,Django就不会自己查找静态文件了
# 这里通过设置STATIC_ROOT等会通过docker收集静态文件
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "static"),
# ]
2、requirement.txt
当时打算使用gunicorn作为wsgi服务器,所以在requirement.txt加入了
# wsgi包
gunicorn
3、Dockerfile
Dockerfile位于项目根目录,它定义了如何构建Docker容器。它基于Python官方镜像,设置了工作目录,安装了依赖,并指定了如何收集静态文件以及运行应用程序的命令。
# 使用 Python 官方镜像作为基础镜像
FROM python:3.11.2
# 设置环境变量,防止 Python 在容器中写字节码
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 设置工作目录
WORKDIR /app
# 将依赖文件复制到容器中
COPY requirements.txt /app/
# 设置pip源
COPY pip.conf /root/.pip/pip.conf
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 将项目文件复制到容器中
COPY . /app/
# 收集静态文件
RUN python manage.py collectstatic --noinput
# 运行应用程序,注释通过docker-compose.yml运行
#CMD ["gunicorn", "--bind", "0.0.0.0:8000", "WellCare.wsgi:application"]
4、pip.conf
pip.conf被我放在根目录下,采用了阿里云的镜像源,提高依赖的安装速度
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
5、docker-compose.yml
docker-compose.yml同样是根目录下的文件,它定义了容器的服务配置,包括应用服务和Nginx服务。这里配置了服务之间的依赖(例如nginx依赖于wcwb-web-www这个项目)、端口映射、卷挂载,以便在容器环境中高效地运行Django应用和Nginx代理。
version: '3.8' # DockerCompose 的版本
services:
wcwb-web-www:
build: .
command: gunicorn WellCare.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/app
- static_volume:/app/static
- media_volume:/app/media
expose:
- 8000
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- static_volume:/app/static
- media_volume:/app/media
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- wcwb-web-www
volumes:
static_volume:
media_volume:
6、nginx.conf
nginx.conf是根目录下的nginx服务器的配置,配置了将Nginx服务器作为代理服务器的详细设置,包括静态和媒体文件的处理路径,以及如何转发对Django应用的请求。这是确保Web服务正确运行的关键部分。用一个便于理解的方法来说alias给/static/起了/app/static/的别名,在Dockerfile中,我们的应用在linux系统的根目录下的/app下,nginx会将网址路径中的/static/转译为/app/static/,从而查找静态文件
server {
listen 80;
server_name localhost; # 修改为你的域名或 IP
location /static/ {
alias /app/static/; # Django collectstatic 收集静态文件的路径
}
location /media/ {
alias /app/media/; # Django 媒体文件路径
}
location / {
proxy_pass http://wcwb-web-www:8000; # Django 应用的内部网络地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
7.运行
这个命令会根据docker-compose.yml 文件中的定义,构建(如果需要)并启动所有服务.--build 选项表示在启动服务之前先构建(或重新构建)镜像。如果你的服务已经构建好了,并且没有对 Dockerfile 或依赖做出任何改变,那么下次启动可以省略 --build 选项
docker-compose up --build