本文章為原創内容,隻釋出于本部落格和 我的私人部落格,轉載請注明,謝謝
項目源碼,歡迎 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; # 增加代理記錄
}
}
流程:
-
服務(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 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
就這樣的結束了嗎? 然而并沒有
請看下一篇 基于 Docker 的 Django 容器化部署之三:定時備份,三步實作伺服器遷移