HONGWEI's Blog

基于 Docker 的 Django 容器化部署之二:docker-compose 部署 Django 博客

Django 180

本文章为原创内容,只发布于 CSDN 博客我的私人博客,这里是为了让大家预览 Django-Blog 项目的时候好跳转,转载请注明,谢谢


基于 Docker 的 Django 容器化部署教程分为三部分,当前所在的是第二部分 - 基于 Docker 的 Django 容器化部署之一:定制属于自己的 docker 镜像 - 基于 Docker 的 Django 容器化部署之二:docker-compose 部署 Django 项目 - 基于 Docker 的 Django 容器化部署之三:定时备份,两步实现服务器迁移

docker-compose

Docker Composedocker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 Compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。简单来说,就是用来编排多个容器,将启动容器的命令统一写到 docker-compose.yml 文件中,一次启动全部启动。

前面我们已经定制了我们自己的 django 博客镜像,我们还要用到 mysqlnginx 镜像,这些仓库都提供了官方镜像,我们直接使用就好了,如果你还有其他需求,基本上仓库中都有,只有我们定制的内容需要手动打包构建镜像。

编排如何使用这几个镜像就用到了 docker-compose

Docker-Compose模板文件说明

Compose 允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 模板文件是一个定义服务、网络和卷的 YAML 文件。Compose 模板文件默认路径是当前目录下的 docker-compose.yml,可以使用 .yml.yaml 作为文件扩展名。

Docker-Compose 标准模板文件应该包含 versionservicesnetworks 三大部分,最关键的是 servicesnetworks 两个部分。

先来看一下 docker-compose.yml,无论用的是上一章中的哪一个镜像,都适用

# Compose文件格式版本,3这是最新版本。
version: "3"
# 服务,主要用来整合容器,表明之间的关系
services:

  website:                         # 服务名称
    image: hw-website              # 默认为 latest 最新版 指定服务使用的镜像名称,hw-website 代表标签为 latest 的最新版
    container_name: hw_django      # 指定容器的名字
    restart: always                
    expose:                        # 映射端口给其他容器,不会将端口暴露给主机
      - "7000"
    volumes:                       # 挂载卷,实现了宿主机和容器目录的映射
      - ./django:/opt/hw-blog
    # 尽可能把命令规划好,都写在这里
    command: bash -c "python manage.py collectstatic --noinput && python manage.py makemigrations && python manage.py migrate && python manage.py rebuild_index --noinput && gunicorn --timeout=30 --workers=4 --bind :7000 website.wsgi:application"
    depends_on:
      - mysql
    networks:                      # 下面定义了一个网络,使得三个容器在同一个网络中
      - django_network

  mysql:
    image: mysql:5.7               # 使用 5.7 版本的 mysql 镜像
    container_name: hw_mysql
    restart: always
    expose:                         
      - "3306"
    volumes:
      - ./mysql:/var/lib/mysql
    # MySQL的基本配置,可以写成文件形式,再进行磁盘映射
    command: mysqld --explicit_defaults_for_timestamp=true --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES utf8mb4;'
    environment:                   # 环境变量
      - MYSQL_ROOT_PASSWORD=zhwei.cn
      - MYSQL_DATABASE=website
    networks:
      - django_network

  nginx:
    image: nginx:latest
    container_name: hw_nginx
    restart: always
    ports:                         # 映射端口给其他容器,会将端口暴露给主机
      - "9000:8000"
    volumes:                       # nginx 处理 static 和 media,挂载 nginx 配置参数
      - ./django/static:/opt/hw-blog/static
      - ./django/media:/opt/hw-blog/media
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - website
    networks:
      - django_network

networks:                          # 定义网络,只有在相同的网络之中才能进行通讯。
  django_network:
    driver: bridge

Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。 和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。

ngixn 相关配置

模板文件中的 mysql 我是直接配置了,其实是可以写成配置文件形式的,再进行挂载,就像下面我要说的 nginx 配置一样

nginx 的默认配置文件 /etc/nginx/nginx.conf 里的 http 块下有这么一句话 include /etc/nginx/conf.d/*.conf;,说明我们可以自定义配置文件,而且还可以分拆配置

所以我们要进行配置文件自定义来对模板文件进行适配

在项目根目录创建 nginx 文件夹,文件夹内创建 django.conf 配置文件

server {
    listen 8000;
    server_name localhost;

    # 配置 docker-compose.yml 中挂载的 static 
    location /static/ {
        autoindex on;
        alias /opt/hw-blog/static/;
    }

    # 配置 docker-compose.yml 中挂载的 media
    location /media/ {
        autoindex on;
        alias /opt/hw-blog/media/;

    }

    # 拦截所有请求 服务转发 端口需要一致
    location / {
        proxy_pass http://website:7000;
        proxy_set_header Host $host; #header添加请求host信息
        proxy_set_header X-Real-IP $remote_addr; # header增加请求来源IP信息
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 增加代理记录
    }
}

流程: 1. django 服务(7000 端口)启动 2. nginx 会将容器内 django服务 进行反向代理并转发到容器中本地地址 localhost8000 端口 3. nginx 会监听容器内 localhost8000 端口,反向代理到宿主机的 9000 端口 4. 通过宿主机的9000端口就可以访问了

这时候如果你想要通过80端口访问,只需要更改 docker-compose.ymlnginx 的宿主机端口

  ...

  nginx:
    ...
    ports:
      - "80:8000"

  ...

如果你想要配置 https 并配置 SSL 证书,参考 Configuring HTTPS servers

服务器部署

既然准备工作都做完了,那就开始部署吧

目录结构

.
├── django
│   ├── apps
│   ├── __init__.py
│   ├── manage.py
│   ├── media
│   ├── requirements.txt
│   ├── static
│   ├── templates
│   └── website
├── docker-compose.yml
└── nginx
    └── django.conf

mediastatic 文件夹如果没有会自动创建

启动容器

docker-compose up -d

好了,在浏览器中访问吧

!!注意:如果出现容器内数据库连接不上、外网浏览器访问不了,请检查服务器的防火墙或者安全组,需要设置放通内网和出入站规则

其他命令 - 停止容器

docker-compose down
  • 查看容器
docker-compose ps
  • 查看容器日志,方便调试
docker-compose logs

前面在 docker-compose.ymlwebsite 服务的 command 中说了要 尽可能把命令规划好,都写在这里 ,下面告诉你原因

因为我的 Composecommand 基本是已经把 Django 要用的命令都写了,当然是对于我的项目来说

就只剩一个了,运行后,部署就结束了

创建后台管理员账户

docker-compose run website python manage.py createsuperuser

项目体验

欢迎 ForkStar 我的 Django博客项目,如果需要一个练手项目,就去看看吧~~

  1. 第一步:下载源码
git clone https://github.com/hongweifuture/Django-Blog
  1. 第二步:部署
  2. 启动
docker-compose up -d
  • 创建后台管理员账户
docker-compose run website python manage.py createsuperuser


就这样的结束了吗? 然而并没有

请看下一篇 基于 Docker 的 Django 容器化部署之三:定时备份,三步实现服务器迁移


本文链接: https://blog.zhwei.cn/article/ji-yu-docker-de-django-rong-qi-hu-1
版权声明: 本博客所有文章除特别声明外,均遵循 CC 4.0 BY-NC-SA 版权协议。转载请附上原文链接!