本文章为原创内容,只发布于本博客和 我的私人博客,转载请注明,谢谢
项目源码,欢迎 Fork 和 Star | 本人自己写的 Django 博客预览
基于 Docker 的 Django 容器化部署教程分为三部分,当前所在的是第二部分
Docker Compose
是 docker
提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 Compose
,我们可以通过 YAML
文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。简单来说,就是用来编排多个容器,将启动容器的命令统一写到 docker-compose.yml
文件中,一次启动全部启动。
前面我们已经定制了我们自己的 django
博客镜像,我们还要用到 mysql
和 nginx
镜像,这些仓库都提供了官方镜像,我们直接使用就好了,如果你还有其他需求,基本上仓库中都有,只有我们定制的内容需要手动打包构建镜像。
编排如何使用这几个镜像就用到了 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框架兼容,并具有实现简单,轻量级,高性能等特点。
模板文件中的 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; # 增加代理记录
}
}
流程:
django
服务(7000
端口)启动nginx
会将容器内 django服务
进行反向代理并转发到容器中本地地址 localhost
的 8000
端口nginx
会监听容器内 localhost
的 8000
端口,反向代理到宿主机的 9000
端口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 ps
docker-compose logs
前面在 docker-compose.yml
中 website
服务的 command
中说了要 尽可能把命令规划好,都写在这里 ,下面告诉你原因
因为我的 Compose
中 command
基本是已经把 Django
要用的命令都写了,当然是对于我的项目来说
就只剩一个了,运行后,部署就结束了
docker-compose run website python manage.py createsuperuser
欢迎 Fork
和 Star
我的 Django博客项目,如果需要一个练手项目,就去看看吧~~
git clone https://github.com/hongweifuture/Django-Blog
docker-compose up -d
docker-compose run website python manage.py createsuperuser