天天看點

基于 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 容器化部署之三:定時備份,三步實作伺服器遷移