欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用docker部署django技術(shù)棧項(xiàng)目的方法步驟

 更新時(shí)間:2019年09月03日 08:16:39   作者:碼農(nóng)吳先生  
這篇文章主要介紹了使用docker部署django技術(shù)棧項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

隨著Docker的普及成熟,已經(jīng)逐漸成為部署項(xiàng)目的首選,今天來(lái)和大家分享下如何使用docker部署django技術(shù)棧項(xiàng)目。

我們這里說(shuō)的Django技術(shù)棧為:python3.6、Django2.2、redis、mysql、celery、gunicorn和nginx。在實(shí)際的生產(chǎn)項(xiàng)目中,這些組件分布在集群的不同機(jī)器,如Nginx、redis和Mysql可能會(huì)有單獨(dú)的團(tuán)隊(duì)或部門(mén)負(fù)責(zé)。涉及的部署架構(gòu)和容器的編排會(huì)更為復(fù)雜,本文暫不去深究。本文主要介紹,如何使用 docker-compose 來(lái)編排這些組件,這種方式適用于測(cè)試環(huán)境的部署或者你的個(gè)人 sideproject 的部署。

本文默認(rèn)你已經(jīng)了解 docker 和 docker-compose 的一些基本知識(shí),若你不了解,可閱讀下面這些資料:

下面我們來(lái)說(shuō)下如何部署。

項(xiàng)目組織結(jié)構(gòu)

首先,看下我們的項(xiàng)目組織結(jié)構(gòu),結(jié)構(gòu)如下:

├── 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的項(xiàng)目文件外,主要增加了 compose 配置文件目錄和 docker-compose.yml 配置文件。

  • compose目錄主要存放各組件的dockerfile文件和啟動(dòng)腳本。
  • docker-compose.yml 是docker-compose的編排配置文件。

編寫(xiě)Dockerfile 及啟動(dòng)初始化腳本

在docker-compose中,容器的啟動(dòng)有兩種方法,一種是直接使用公共的鏡像來(lái)啟動(dòng)容器,另一種是通過(guò)我們自己編寫(xiě)的Dockerfile。因?yàn)槲覀円惭b額外的工具包和初始化相關(guān)配置,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容器的啟動(dòng)腳本,執(zhí)行一些初始化或檢測(cè)邏輯。
  • compose/web/gunicorn.conf gunicorn配置文件。
  • compose/web/gunicorn.sh gunicorn的啟動(dòng)腳本。

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的啟動(dòng)腳本。
  • compose/celery/celery-beat.sh celery-beat的啟動(dòng)腳本。

編寫(xiě)Compose啟動(dòng)配置文件

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這里我們使用同一個(gè)鏡像Dockerfile, 按照一個(gè)鏡像一個(gè)進(jìn)程的原則,啟動(dòng)兩個(gè)容器來(lái)分別跑worker和beat進(jìn)程。

編譯測(cè)試

編寫(xiě)好配置文件之后,編譯鏡像測(cè)試運(yùn)行:

docker-compose build 
docker-compose up # 前臺(tái)運(yùn)行 
docker-compose up -d # 無(wú)誤后可后臺(tái)運(yùn)行

docker-compose ps 可以看到啟動(dòng)好的容器:

$ 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 

映射端口可根據(jù)自己的實(shí)際情況調(diào)整。

問(wèn)題

下面說(shuō)下在構(gòu)建過(guò)程中的幾個(gè)需要注意的問(wèn)題。

mysql 編碼問(wèn)題

docker 提供的mysql鏡像,默認(rèn)編碼為 latin1 , 在保存中文時(shí)會(huì)顯示亂碼。官方提供了一種修改編碼方式的方法,在啟動(dòng)腳本后指定編碼格式,文檔可見(jiàn)這里。mysql容器5.7.19版本可直接在docker-compose.yml 中的command后跟上參數(shù) --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 # 跳過(guò)客戶端的編碼配置,客戶端直接使用服務(wù)端的編碼配置
bind-address = 0.0.0.0

注:mysql 5.7.19 配置文件方式成功,5.7.4、5.7.17 均失敗,可做參考。

web等mysql啟動(dòng)完成后再繼續(xù)

mysql 容器在啟動(dòng)起來(lái)之前是無(wú)法接受數(shù)據(jù)庫(kù)鏈接的,在web啟動(dòng)初始化時(shí),若數(shù)據(jù)庫(kù)還沒(méi)有啟動(dòng)好會(huì)導(dǎo)致web容器啟動(dòng)失敗直接退出。我們可以增加在web容器啟動(dòng)時(shí)增加檢測(cè)腳本,數(shù)據(jù)庫(kù)連通之后,再繼續(xù)。

腳本如下:

#!/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..."

總結(jié)

到此,使用docker來(lái)部署django技術(shù)棧服務(wù)就完成了,完整的項(xiàng)目代碼,大家可參閱 docker-django-demo 。

文章開(kāi)始說(shuō)了,該部署方式不適合大型網(wǎng)站的線上生產(chǎn)服務(wù),耦合度太高,不好維護(hù)等存在著許多問(wèn)題。但是,部署自己的sideproject或者測(cè)試環(huán)境,在硬件資源有限的情況的下還是非常不錯(cuò)的。除了減少環(huán)境部署搭建的麻煩外,遷移起來(lái)也是很方便的。

demo 項(xiàng)目中也有些開(kāi)發(fā)環(huán)境下如何使用docker的案例,但是個(gè)人一直認(rèn)為docker更適合部署,在開(kāi)發(fā)環(huán)境方便不如直接搭建來(lái)的靈活方便。歡迎大家留言,共同討論docker在開(kāi)發(fā)和部署上的使用心得。

參考

cookiecutter-django

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 修改已有docker容器中的內(nèi)容方法

    修改已有docker容器中的內(nèi)容方法

    這篇文章主要介紹了修改已有docker容器中的內(nèi)容方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • docker運(yùn)行容器遠(yuǎn)程掛載卷的方法

    docker運(yùn)行容器遠(yuǎn)程掛載卷的方法

    本篇文章主要介紹了docker運(yùn)行容器遠(yuǎn)程掛載卷的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • docker中容器數(shù)據(jù)卷volume介紹

    docker中容器數(shù)據(jù)卷volume介紹

    大家好,本篇文章主要講的是docker中容器數(shù)據(jù)卷volume介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 基于Docker+Selenium Grid的測(cè)試技術(shù)應(yīng)用示例代碼

    基于Docker+Selenium Grid的測(cè)試技術(shù)應(yīng)用示例代碼

    Selenium Grid允許我們?cè)诙嗯_(tái)計(jì)算機(jī)上并行運(yùn)行測(cè)試,并集中管理不同的瀏覽器版本和瀏覽器配置。這篇文章給大家介紹基于Docker+Selenium Grid的測(cè)試技術(shù)應(yīng)用示例代碼,需要的朋友參考下吧
    2021-08-08
  • 從零搭建docker私有倉(cāng)庫(kù)的步驟

    從零搭建docker私有倉(cāng)庫(kù)的步驟

    這篇文章主要介紹了從零搭建docker私有倉(cāng)庫(kù)的步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Docker創(chuàng)建enrollment token錯(cuò)誤異常解析及解決方案

    Docker創(chuàng)建enrollment token錯(cuò)誤異常解析及解決方案

    部署完kibana,需要通過(guò)enrollment token方式來(lái)連接elasticsearch,此時(shí)需要在elasticsearch中創(chuàng)建enrollment token,這篇文章主要介紹了Docker創(chuàng)建enrollment token錯(cuò)誤異常解析及解決方案,需要的朋友可以參考下
    2024-04-04
  • 詳解docker?API管理接口增加CA安全認(rèn)證

    詳解docker?API管理接口增加CA安全認(rèn)證

    這篇文章主要介紹了docker?API管理接口增加CA安全認(rèn)證,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • docker客戶端訪問(wèn)harbor及安裝配置更新

    docker客戶端訪問(wèn)harbor及安裝配置更新

    這篇文章主要介紹了docker客戶端訪問(wèn)harbor以及harbor的安裝配置更新步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Docker容器依賴link連接按順序啟動(dòng)方式

    Docker容器依賴link連接按順序啟動(dòng)方式

    這篇文章主要介紹了Docker容器依賴link連接按順序啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Docker為網(wǎng)絡(luò)bridge模式指定容器ip的方法

    Docker為網(wǎng)絡(luò)bridge模式指定容器ip的方法

    Docker在創(chuàng)建容器時(shí)有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要用--net去指定,其他三種模式需要在創(chuàng)建容器時(shí)使用--net去指定。那Docker為網(wǎng)絡(luò)bridge模式指定容器ip該如何實(shí)現(xiàn)呢?下面通過(guò)通過(guò)這篇文章一起看看吧,文中給出了詳細(xì)的示例代碼,有需要的可以參考借鑒。
    2016-11-11

最新評(píng)論