天天看点

基于 Docker 的 Django 容器化部署之二:docker-compose 部署 Django 博客docker-composeDocker-Compose模板文件说明ngixn 相关配置服务器部署项目体验

本文章为原创内容,只发布于本博客和 我的私人博客,转载请注明,谢谢

项目源码,欢迎 Fork 和 Star | 本人 Django 博客预览

基于 Docker 的 Django 容器化部署教程分为三部分,当前所在的是第二部分

  • 基于 Docker 的 Django 容器化部署之一:定制属于自己的 docker 镜像
  • 基于 Docker 的 Django 容器化部署之二:docker-compose 部署 Django 项目
  • 基于 Docker 的 Django 容器化部署之三:定时备份,两步实现服务器迁移

docker-compose

Docker Compose

docker

提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用

Compose

,我们可以通过

YAML

文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。简单来说,就是用来编排多个容器,将启动容器的命令统一写到

docker-compose.yml

文件中,一次启动全部启动。

前面我们已经定制了我们自己的

django

博客镜像,我们还要用到

mysql

nginx

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

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

docker-compose

Docker-Compose模板文件说明

Compose 允许用户通过一个

docker-compose.yml

模板文件(

YAML

格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 模板文件是一个定义

服务、网络和卷的 YAML 文件

。Compose 模板文件默认路径是当前目录下的

docker-compose.yml

,可以使用

.yml

.yaml

作为文件扩展名。

Docker-Compose 标准模板文件应该包含

version

services

networks

三大部分,最关键的是

services

networks

两个部分。

先来看一下

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框架兼容,并具有实现简单,轻量级,高性能等特点。

  • 参考 How to use Django with Gunicorn 和 gunicorn documentation
  • version: Compose文件格式版本,3这是最新版本。参考 Compose file version 3 reference

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服务

    进行反向代理并转发到容器中本地地址

    localhost

    8000

    端口
  3. nginx

    会监听容器内

    localhost

    8000

    端口,反向代理到宿主机的

    9000

    端口
  4. 通过宿主机的

    9000

    端口就可以访问了

这时候如果你想要通过

80

端口访问,只需要更改

docker-compose.yml

nginx

的宿主机端口

...
  
  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
           

media

static

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

启动容器

docker-compose up -d
           

好了,在浏览器中访问吧

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

其他命令

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

前面在

docker-compose.yml

website

服务的

command

中说了要 尽可能把命令规划好,都写在这里 ,下面告诉你原因

因为我的

Compose

command

基本是已经把

Django

要用的命令都写了,当然是对于我的项目来说

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

创建后台管理员账户

docker-compose run website python manage.py createsuperuser
           

项目体验

欢迎

Fork

Star

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

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

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

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