真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用docker部署django技術(shù)棧項(xiàng)目

這篇文章主要介紹了如何使用docker部署django技術(shù)棧項(xiàng)目的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇如何使用docker部署django技術(shù)棧項(xiàng)目文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

巍山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

項(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的編排配置文件。

編寫dockerfile 及啟動(dòng)初始化腳本

在docker-compose中,容器的啟動(dòng)有兩種方法,一種是直接使用公共的鏡像來(lái)啟動(dòng)容器,另一種是通過(guò)我們自己編寫的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)腳本。

編寫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è)試

編寫好配置文件之后,編譯鏡像測(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端的編碼??芍苯邮褂门渲梦募采w的方式,指定所有的編碼格式。

配置如下:

[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..."

關(guān)于“如何使用docker部署django技術(shù)棧項(xiàng)目”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“如何使用docker部署django技術(shù)棧項(xiàng)目”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:如何使用docker部署django技術(shù)棧項(xiàng)目
本文網(wǎng)址:http://weahome.cn/article/gjojcd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部