您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何使用docker部署django技術棧項目的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇如何使用docker部署django技術棧項目文章都會有所收獲,下面我們一起來看看吧。
項目組織結構
首先,看下我們的項目組織結構,結構如下:
├── license ├── readme.md ├── compose │ ├── celery │ │ ├── dockerfile │ │ ├── celery-beat.sh │ │ └── celery.sh │ ├── mysql │ │ └── my.cnf │ ├── nginx │ │ └── nginx.conf │ └── web │ ├── dockerfile │ ├── entrypoint.sh │ ├── gunicorn.conf │ └── gunicorn.sh ├── docker-compose.yml ├── docker_django_demo │ ├── __init__.py │ ├── celery.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── env.tpl ├── manage.py ├── requirements.txt
除了django的項目文件外,主要增加了 compose 配置文件目錄和 docker-compose.yml 配置文件。
compose目錄主要存放各組件的dockerfile文件和啟動腳本。
docker-compose.yml 是docker-compose的編排配置文件。
編寫dockerfile 及啟動初始化腳本
在docker-compose中,容器的啟動有兩種方法,一種是直接使用公共的鏡像來啟動容器,另一種是通過我們自己編寫的dockerfile。因為我們要安裝額外的工具包和初始化相關配置,web和celery組件我們使用自定義的dockerfile方式。
web容器的 compose/web/dockerfile :
from python:3.6 env pythonunbuffered 1 run mkdir /code workdir /code copy ./requirements.txt /code/ run pip install --no-cache-dir -r requirements.txt \ && rm -rf requirements.txt copy . /code/ copy ./compose/web/*.sh /code/ run sed -i 's/\r//' gunicorn.sh \ && chmod +x gunicorn.sh \ && sed -i 's/\r//' entrypoint.sh \ && chmod +x entrypoint.sh entrypoint ["/bin/bash", "entrypoint.sh"]
web容器的其他文件:
compose/web/entrypoint.sh web容器的啟動腳本,執行一些初始化或檢測邏輯。
compose/web/gunicorn.conf gunicorn配置文件。
compose/web/gunicorn.sh gunicorn的啟動腳本。
celery的dockerfile:
from python:3.6 env pythonunbuffered 1 run mkdir /code workdir /code copy ./requirements.txt /code/ copy ./compose/celery/*.sh /code/ run pip install --no-cache-dir -r requirements.txt \ && rm -rf requirements.txt && sh init_env.sh copy . /code/ copy ./compose/celery/*.sh /code/ run sed -i 's/\r//' celery.sh \ && chmod +x celery.sh \ && sed -i 's/\r//' celery-beat.sh \ && chmod +x celery-beat.sh
celery的其他文件:
compose/celery/celery.sh celery的啟動腳本。
compose/celery/celery-beat.sh celery-beat的啟動腳本。
編寫compose啟動配置文件
docker-compose 配置如下:
version: '2' services: redis: image: redis ports: - "6379:6379" db: restart: always image: mysql:5.7.19 # command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./compose/mysql/:/etc/mysql/conf.d - ./db:/var/lib/mysql # for test ports: - "127.0.0.1:3307:3306" # (host:container) env_file: - .env web: # restart: always build: context: . dockerfile: ./compose/web/dockerfile command: sh gunicorn.sh # ["/bin/bash", "gunicorn.sh"] ports: - "8080:8002" # (host:container) volumes: - ./logs:/var/logs/ - ./collect_static:/code/collect_static - ./static:/code/static - ./templates:/code/templates - ./uploads:/code/uploads env_file: .env depends_on: - redis - db nginx: restart: always image: nginx:1.13.0 volumes: - ./compose/nginx:/etc/nginx/conf.d/ - ./staticfiles:/code/staticfiles - ./logs:/var/log/nginx ports: - "80:80" # (host:container) depends_on: - web celery: build: context: . dockerfile: ./compose/celery/dockerfile command: sh celery.sh volumes: - ./logs:/var/logs/ - ./uploads:/code/uploads depends_on: - redis - db env_file: .env celery-beat: build: context: . dockerfile: ./compose/celery/dockerfile command: sh celery-beat.sh volumes: - ./logs:/var/logs/ depends_on: - redis - db env_file: .env
celery 的worker 和beat這里我們使用同一個鏡像dockerfile, 按照一個鏡像一個進程的原則,啟動兩個容器來分別跑worker和beat進程。
編譯測試
編寫好配置文件之后,編譯鏡像測試運行:
docker-compose build docker-compose up # 前臺運行 docker-compose up -d # 無誤后可后臺運行
docker-compose ps 可以看到啟動好的容器:
$ docker-compose ps name command state ports -------------------------------------------------------------------------------------------------- dockerdjangodemo_celery-beat_1 sh celery-beat.sh up dockerdjangodemo_celery_1 sh celery.sh up dockerdjangodemo_db_1 docker-entrypoint.sh mysqld up 127.0.0.1:3307->3306/tcp dockerdjangodemo_nginx_1 nginx -g daemon off; up 0.0.0.0:80->80/tcp dockerdjangodemo_redis_1 docker-entrypoint.sh redis ... up 0.0.0.0:6379->6379/tcp dockerdjangodemo_web_1 /bin/bash entrypoint.sh sh ... up 0.0.0.0:8080->8002/tcp
映射端口可根據自己的實際情況調整。
問題
下面說下在構建過程中的幾個需要注意的問題。
mysql 編碼問題
docker 提供的mysql鏡像,默認編碼為 latin1 , 在保存中文時會顯示亂碼。官方提供了一種修改編碼方式的方法,在啟動腳本后指定編碼格式,文檔可見。mysql容器5.7.19版本可直接在docker-compose.yml 中的command后跟上參數 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci 。這種方式,只是修改server端的編碼。可直接使用配置文件覆蓋的方式,指定所有的編碼格式。
配置如下:
[mysqld] default-storage-engine=innodb character-set-server=utf8mb4 collation-server=utf8mb4_general_ci init-connect='set names utf8mb4' init_connect='set collation_connection = utf8mb4_general_ci' skip-character-set-client-handshake # 跳過客戶端的編碼配置,客戶端直接使用服務端的編碼配置 bind-address = 0.0.0.0
注:mysql 5.7.19 配置文件方式成功,5.7.4、5.7.17 均失敗,可做參考。
web等mysql啟動完成后再繼續
mysql 容器在啟動起來之前是無法接受數據庫鏈接的,在web啟動初始化時,若數據庫還沒有啟動好會導致web容器啟動失敗直接退出。我們可以增加在web容器啟動時增加檢測腳本,數據庫連通之后,再繼續。
腳本如下:
#!/usr/bin/env bash set -o errexit set -o pipefail echo $mysql_password echo $mysql_database echo $mysql_host echo $mysql_user echo $mysql_port function mysql_ready(){ python << end import sys import pymysql try: conn = pymysql.connect(host="db", port=3306, user="root", passwd="$mysql_root_password", db='$mysql_database', charset='utf8') except pymysql.err.operationalerror: sys.exit(-1) sys.exit(0) end } until mysql_ready; do >&2 echo "mysql is unavailable - sleeping" sleep 1 done >&2 echo "mysql is up - continuing..."
關于“如何使用docker部署django技術棧項目”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“如何使用docker部署django技術棧項目”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。