如何使用docker部署django技术栈项目

发布时间:2022-05-31 11:32:09 作者:iii
来源:亿速云 阅读:304

这篇文章主要介绍了如何使用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 配置文件。

编写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容器的其他文件:

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启动配置文件

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技术栈项目”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. centos8如何使用Docker部署Django项目
  2. Docker如何部署springboot项目

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker django

上一篇:基于Docker如何快速搭建ELK

下一篇:docker如何部署mysql实现远程连接

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》