docker-compose 发布django 项目

docker-compose 介绍

Docker Compose是Docker编排服务的一部分,Compose可以让用户在集群中部署分布式应用。Docker Compose是一个属于“应用层”的服务,用户可以定义哪个容器组运行哪个应用,它支持动态改变应用,并在需要时扩展。

通过 python3+uwsgi+nginx+redis+mysql 中间件运行Django 项目,运行成功后截图如下

运行效果

docker-compose 发布django 项目_第1张图片

 项目目录

docker-compose 发布django 项目_第2张图片

compose 文件夹内容

./compose/mysql/conf/my.cnf

 # compose/mysql/conf/my.cnf
 [mysqld]
 user=mysql
 default-storage-engine=INNODB
 character-set-server=utf8

 port            = 3306 # 端口与docker-compose里映射端口保持一致
 #bind-address= localhost #一定要注释掉,mysql所在容器和django所在容器不同IP

 basedir         = /usr
 datadir         = /var/lib/mysql
 tmpdir          = /tmp
 pid-file        = /var/run/mysqld/mysqld.pid
 socket          = /var/run/mysqld/mysqld.sock
 skip-name-resolve  # 这个参数是禁止域名解析的,远程访问推荐开启skip_name_resolve。

 [client]
 port = 3306
 default-character-set=utf8

 [mysql]
 no-auto-rehash
 default-character-set=utf8

./compose/mysql/init/init.sql

 # compose/mysql/init/init.sql
 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "p@ssw0rdwcx";
 FLUSH PRIVILEGES;

./compose/nginx/Dockerfile

 # nginx镜像compose/nginx/Dockerfile

FROM nginx:latest

 # 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/nginx/conf.d/default.conf \
 && mkdir -p /usr/share/nginx/html/static \
 && mkdir -p /usr/share/nginx/html/media \
 && mkdir -p /usr/share/nginx/ssl

 # 设置Media文件夹用户和用户组为Linux默认www-data, 并给予可读和可执行权限,
 # 否则用户上传的图片无法正确显示。
RUN chown -R www-data:www-data /usr/share/nginx/html/media \
 && chmod -R 775 /usr/share/nginx/html/media

 # 添加配置文件
ADD ./nginx.conf /etc/nginx/conf.d/

 # 关闭守护模式
CMD ["nginx", "-g", "daemon off;"]

 ./compose/nginx/nginx.conf

 # nginx配置文件
 # compose/nginx/nginx.conf

upstream sobase {
    server web:8010; # Docker-compose web服务端口
    keepalive 2000;
}
upstream weboffice {
    server web1:8011; # Docker-compose web服务端口
    keepalive 2000;
}
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
server_tokens off;
server {
     listen 80; # 监听80端口
     server_name localhost; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址

     charset utf-8;
     client_max_body_size 10M; # 限制用户上传文件大小

     location /static {
         alias /usr/share/nginx/html/static; # 静态资源路径
     }

     location /media {
         alias /usr/share/nginx/html/media; # 媒体资源,用户上传文件路径
     }
     location /sobase {
           client_max_body_size 50m;
           include /etc/nginx/uwsgi_params;
           #proxy_pass  http://sobase;
           uwsgi_pass sobase;
           uwsgi_read_timeout 600;
           uwsgi_connect_timeout 600;
           uwsgi_send_timeout 600;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $http_host;
           proxy_redirect off;
           proxy_set_header X-Real-IP  $remote_addr;
           #proxy_set_header X-Forwarded-For $http_x_forwarded_for; # $http_x_forwarded_for变量 = X-Forwarded-For变量
     }
     location /weboffice {
           client_max_body_size 50m;
           include /etc/nginx/uwsgi_params;
           #proxy_pass  http://sobase;
           uwsgi_pass weboffice;
           uwsgi_read_timeout 600;
           uwsgi_connect_timeout 600;
           uwsgi_send_timeout 600;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $http_host;
           proxy_redirect off;
           proxy_set_header X-Real-IP  $remote_addr;
           #proxy_set_header X-Forwarded-For $http_x_forwarded_for; # $http_x_forwarded_for变量 = X-Forwarded-For变量
     }
     location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
     }
}

./compose/redis/redis.conf

# compose/redis/redis.conf
# Redis 6.2.5配置文件下载地址
# url 中6.2.5 是redis 的版本,其它版本需要修改版本号
# https://raw.githubusercontent.com/antirez/redis/6.2.5/redis.conf 
# 请注释掉下面一行,变成#bind 127.0.0.1,这样其它机器或容器也可访问
bind 0.0.0.0
protected-mode no

./docker-compose.yaml

version: "3"

volumes: # 自定义数据卷,位于宿主机/var/lib/docker/volumes内
  sobase_db_vol: # 定义数据卷同步容器内mysql数据
  sobase_redis_vol: # 定义数据卷同步redis容器内数据
  sobase_media_vol: # 定义数据卷同步media文件夹数据

services:
  portainer:
    image: portainer/portainer
    container_name: portainer
    restart: always # always表容器运行发生错误时一直重启
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
  redis:
    image: redis:6.2.5
    container_name: redis
    command: redis-server /etc/redis/redis.conf # 容器启动后启动redis服务器
    volumes:
      - sobase_redis_vol:/data # 通过挂载给redis数据备份
      - ./compose/redis/redis.conf:/etc/redis/redis.conf # 挂载redis配置文件
    ports:
      - "6379:6379"
    restart: always # always表容器运行发生错误时一直重启

  db:
    image: mysql:5.7
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=p@ssw0rdwcx # 数据库密码
      - MYSQL_DATABASE=sobase # 数据库名称
      - MYSQL_ROOT_USER=root # 数据库用户名
      - MYSQL_PASSWORD=p@ssw0rdwcx # 用户密码

    volumes:
      - sobase_db_vol:/var/lib/mysql:rw # 挂载数据库数据, 可读可写
      - ./compose/mysql/conf/my.cnf:/etc/mysql/my.cnf # 挂载配置文件
      - ./compose/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本
    ports:
      - "3306:3306" # 与配置文件保持一致
    restart: always

  web:
    build: ./ # 使用myproject目录下的Dockerfile
    container_name: web
    privileged: true #设置容器的权限为root
    expose:
      - "8010"
    volumes:
      - ./:/var/www/html/SOBase # 挂载项目代码
      - sobase_media_vol:/var/www/html/SOBase/media # 以数据卷挂载容器内用户上传媒体文件
      - ./compose/uwsgi:/tmp # 挂载uwsgi日志
    links:
      - db
      - redis
    depends_on: # 依赖关系
      - db
      - redis
    environment:
      - DEBUG=False
      - TZ=Asia/Shanghai
      - privileged=true
    restart: always
    tty: true
    stdin_open: true
  web1:
    build: /smartOffice/WebOffice # 使用myproject目录下的Dockerfile
    container_name: web1
    ports:
      - "8000:8000"
    expose:
      - "8000"
    volumes:
      - /smartOffice/WebOffice:/var/www/html/WebOffice # 挂载项目代码
      - sobase_media_vol:/var/www/html/WebOffice/media # 以数据卷挂载容器内用户上传媒体文件
      - /smartOffice/WebOffice/compose/uwsgi:/tmp # 挂载uwsgi日志
    links:
      - db
      - redis
    depends_on: # 依赖关系
      - db
      - redis
    environment:
      - DEBUG=False
      - TZ=Asia/Shanghai
      - privileged=true
    restart: always
    tty: true
    stdin_open: true
  nginx:
    build: ./compose/nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    expose:
      - "80"
    volumes:
      - ./static:/usr/share/nginx/html/static # 挂载静态文件
      - ./compose/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
      - ./compose/nginx/log:/var/log/nginx # 挂载日志
      - sobase_media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
    links:
      - web
      - web1
    depends_on:
      - web
      - web1
    restart: always
 

./Dockerfile

# SOBase/Dockerfile
# 建立 python3.7
FROM python:3.7

# 镜像作者cx
MAINTAINER cx

# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1

COPY pip.conf /root/.pip/pip.conf
# 创建 SOBase 文件夹
RUN mkdir -p /smartOffice/SOBase

# 将 SOBase 文件夹为工作目录
WORKDIR /smartOffice/SOBase

# 将当前目录加入到工作目录中(. 表示当前目录)
ADD . /smartOffice/SOBase

# 更新pip版本
RUN /usr/local/bin/python -m pip install --upgrade pip

# 利用 pip 安装依赖
RUN pip install -r requirements.txt

# 去除windows系统编辑文件中多余的\r回车空格
RUN sed -i 's/\r//' ./start.sh

# 给start.sh可执行权限
RUN chmod +x ./start.sh

./pip.conf

[global]
index-url = http://pypi.douban.com/simple #豆瓣源,可以换成其他的源
extra-index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host =
    pypi.douban.com            #添加豆瓣源为可信主机,要不然可能报错
    pypi.tuna.tsinghua         #清华
timeout = 120

./start.sh

 #!/bin/bash
 # 从第一行到最后一行分别表示:
 # 1. 收集静态文件到根目录,
 # 2. 生成数据库可执行文件,
 # 3. 根据数据库可执行文件来修改数据库
 # 4. 用 uwsgi启动 django 服务
 python manage.py collectstatic --noinput&&
 python manage.py makemigrations --settings=SOBase.test_settings&&
 python manage.py migrate --settings=SOBase.test_settings&&
 uwsgi --ini /smartOffice/SOBase/uwsgi.ini

./uwsgi.ini

[uwsgi]
project=SOBase
uid=www-data
gid=www-data
base=/var/www/html
chdir=%(base)/%(project)
#wsgi-file=shopping/pro_wsgi.py
module=%(project).test_wsgi:application
master=True
processes=2
socket=0.0.0.0:8010
chown-socket=%(uid):www-data
chmod-socket=664
vacuum=True
max-requests=5000
pidfile=/tmp/%(project)-master.pid
daemonize=/tmp/%(project)-uwsgi.log
harakiri = 60
buffer-size= 65535
harakiri-verbose = true
memory-report = true
reload-mercy = 10
reload-on-as= 1024
python-autoreload=1
# 设置日志文件最大字节数
log-maxsize=1000
# 设置每个请求进程最大请求数
max-requests=1000

番外篇

# 安装docker
https://cloud.tencent.com/developer/article/1701451
#检查docker版本
sudo docker -v
#检查Docker-compose的版本。
sudo docker-compose -v
#安装Docker-compose命令。安装完成之后再次使用上面命令检查版本。
https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#如果提示Permission denied。执行以下语句赋权
sudo chmod +x /usr/local/bin/docker-compose


docker-compose: 未找到命令
https://www.cnblogs.com/annatest/p/14881098.html


停止、删除所有的docker容器和镜像
https://colobu.com/2018/05/15/Stop-and-remove-all-docker-containers-and-images/

# 列出所有的容器 ID
docker ps -aq

# 停止所有的容器
docker stop $(docker ps -aq)

# 删除所有的容器
docker rm $(docker ps -aq)

# 删除所有的镜像
docker rmi $(docker images -q)


# 切换到docker-compose.yaml 根目录  后台运行

# 进入docker-compose.yml所在文件夹,输入以下命令构建镜像
sudo docker-compose build
# 查看已生成的镜像
sudo docker images
# 启动容器组服务
sudo docker-compose up
# 查看运行中的容器
sudo docker ps

Docker-compose常用命令

#以下所有命令需要和d.yml在同一目录。也可以通过 -f 执行.yml文件
#查看当前容器运行的状态。显示容器名称|执行脚本|当前运行状态|当前监听端口信息。 指定.yml文件用法 sudo docker-compose -f ./docker-compose.yml ps
sudo docker-compose ps
#重启或者重启某个服务 sudo docker-compose restart ||sudo docker-compose xxxx
sudo docker-compose restart
#构建服务
sudo docker-compose build
#显示日志
sudo docker-compose logs
#-d表示后台。up命令会构建,(重新)创建,启动,链接一个服务相关的容器。默认情况下如果容器已经存在,将会停止并尝试重新创建他们。并使用之前挂载的卷。
# --no-recreate参数可以让容器不被停止或者重新创建
sudo docker-compose up -d
#stop和start停止当前运行的某个容器
sudo docker-compose stop xxxx
sudo docker-compose start xxxx
#停止所有容器,并删除容器
docker-compose down


Linux Centos Permission denied目录权限更改
文件夹
chmod -R 777 【路径】
文件
chmod 777 【路径】
//首先声明这样做有风险,而且请注意这里的r是大写!RRR

django 项目报错

1.Internal Server Error

        查看uwsig 日志,显示应用没有权限读写logs文件夹导致,导致项目启动失败

2.Permission denied

        django 应用上传文件提示Permission denied  暂未解决,临时解决方案手动授权

        docker-compose 发布django 项目_第3张图片  

 

3.no python application found, check your startup logs for errors

        同理和Internal Server Error 都是权限问题导致

参考博客:

Docker-compose 八步部署Django + Uwsgi + Nginx + MySQL + Redis升级篇_大江狗-CSDN博客

Docker部署Django | 大江狗的博客

你可能感兴趣的:(docker,django,mysql)