docker-compose部署项目(一)


docker-compose部署项目

Linux 安装 Docker

Ubuntu安装docker

apt-get install docker.io

CentOs安装docker

yum -y install docker-io

修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}

安装docker-compose镜像

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compos

修改文件执行权限

sudo chmod +x /usr/local/bin/docker-compose

检查安装成功与否

docker-compose --version

项目目录下的文件配置

项目目录结构

project                             # 项目根目录
├── compose                         # 存放各项容器服务的Dockerfile和配置文件
│   ├── mysql
│   │   ├── conf
│   │   │   └── my.cnf              # MySQL配置文件
│   │   └── init                    
│   │       └── init.sql            # MySQL启动脚本
│   ├── nginx                       # nginx配置文件
│   │   ├── Dockerfile              # 构建Nginx镜像所的Dockerfile
│   │   ├── log                     # 挂载保存nginx容器内日志log目录
│   │   ├── nginx.conf              # Nginx配置文件
│   │   └── ssl                     # 如果需要配置https需要用到
│   ├── redis                       # redis配置文件
│   │   └── redis.conf              # redis配置文件
│   ├── celery                      # 挂载保存容器内celery日志
│   │   ├── 1.log                   # celery(log文件)
│   └── uwsgi                       # 挂载保存django+uwsgi容器内uwsgi日志
├── docker-compose.yml              # 核心编排文件
└── project                         # 常规Django项目目录
    ├── Dockerfile                  # 构建Django+Uwsgi镜像的Dockerfile
    ├── apps                        # 存放Django项目的各个apps
    ├─index                         # 子应用
    │      └──admin.py
    │      └──apps.py               # app config
    │      └──models.py             # 模型类文件
    │      └──tests.py              # 测试文件
    │      └──urls.py               # 路由配置文件
    │      └──views.py              # 视图文件
    ├── manage.py
    ├── project                     # Django项目配置文件
    │   ├── asgi.py
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── requirements.txt            # Django项目依赖文件
    ├── .env                        # 环境变量文件
    ├── start.sh                    # 启动Django+Uwsgi容器后要执行的脚本
    ├── media                       # 用户上传的媒体资源,如果没有需手动创建
    ├── static                      # 搜集项目的静态文件夹,如果没有需手动创建
    └── uwsgi.ini                   # uwsgi配置文件
    └── utils                       # 自定义文件包
        │  mysqlObj.py              # 自定义文件(mysql连接)
        │  superman.py              # 自定义文件(中间件验证)
        │  taskGroupAdd.py          # 自定义文件(celery)
        │  __init__.py
        ├──log                      # celery(log文件)
        │   └─ 1.log                # celery(log文件)

项目目录下 构造基础Dockerfile文件

# 建立 python:3.6环境
FROM python:3.6

# 安装netcat
RUN apt-get update && apt install -y netcat

# 镜像作者柒仔
MAINTAINER Qizai

# 设置 python 环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 容器内创建 project 文件夹
ENV APP_HOME=/var/www/html/project
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

# 将当前目录加入到工作目录中(. 表示当前目录)
ADD . $APP_HOME

# 安装项目依赖 指定豆瓣源
RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple/ && \
    pip3 install websocket-client # 重新安装websocket连接

# 移除\r in windows
RUN sed -i 's/\r//' ./start.sh

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

# 数据迁移,并使用uwsgi启动服务
ENTRYPOINT /bin/bash ./start.sh

项目目录下的requirements.txt文件 有点多就放了一点点

celery==5.1.2
Django==3.2.6
django-celery==3.1.17
django-ranged-response==0.2.0
django-redis==5.0.0
django-simple-captcha==0.5.14
djangorestframework==3.12.4
eventlet==0.31.1
Jinja2==3.0.1
Pillow==8.3.1
PyMySQL==1.0.2
redis==3.5.3
requests==2.26.0
uwsgi==2.0.18

项目目录下 构造start.sh文件

#!/bin/bash
# 从第一行到最后一行分别表示:
# 1. 等待MySQL服务启动后再进行数据迁移。nc即netcat缩写
# 2. 收集静态文件到根目录static文件夹,
# 3. 生成数据库可执行文件,------------------已注释
# 4. 根据数据库可执行文件来修改数据库 ---------已注释
# 5. 用 uwsgi启动 django 服务
# 6. 跳转utils文件夹
# 7. 删除pid文件
# 8. 后台运行celery 并生成log文件
# 9. tail空命令防止web容器执行脚本后退出
while ! nc -z db 3306 ; do
    echo "Waiting for the MySQL Server"
    sleep 3
done


python manage.py collectstatic --noinput&&
# python manage.py makemigrations&&
# python manage.py migrate&&
uwsgi --ini /var/www/html/groupadd/uwsgi.ini&&
cd utils/&&
rm -rf ./log/1.pid&&
celery multi start t1 -A taskGroupAdd -l info --logfile=./log/1.log --pidfile=./log/1.pid&&
tail -f /dev/null


exec "$@"

项目目录下 构造.env文件

MYSQL_ROOT_PASSWORD=pwd
MYSQL_USER=mysql
MYSQL_DATABASE=database
MYSQL_PASSWORD=pwd

项目目录下 跟项目同名的文件夹下创建默认数据

# os_set_default.py
import os

# set mysql info
DB_HOST = "db" # 对应docker-compose.yml里面的服务名 否则使用本地(localhost)
DB_PORT = 3306
DB_NAME = "root"
DB_PWD = "pwd"
DB_DATABASE = "database"
# set redis info
# os.environ.setdefault('REDIS_PWD', "pwd")
# os.environ.setdefault('REDIS_HOST', "redis")
REDIS_PWD = "pwd"
REDIS_HOST = "redis"  # 对应docker-compose.yml里面的服务名 否则使用本地(localhost)
REDIS_PORT = 6379

项目目录下 跟项目同名的文件夹下的setting文件修改

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
        'HOST': DB_HOST,  # 数据库主机
        'PORT': DB_PORT,  # 数据库端口
        'USER': DB_NAME,  # 数据库用户名
        'PASSWORD': DB_PWD,  # 数据库用户密码
        'NAME': DB_DATABASE,  # 数据库名字
        'OPTIONS': {
            "init_command": "SET foreign_key_checks = 0;",
            'charset': 'utf8mb4',
        }
    },
}

CACHES = {
    "default": {  # 默认
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:%s@%s:%d/0" % (REDIS_PWD, REDIS_HOST, REDIS_PORT),
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": {  # session
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:%s@%s:%d/1" % (REDIS_PWD, REDIS_HOST, REDIS_PORT),
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

项目目录下 uwsgi.ini文件的配置

[uwsgi]
project = groupadd
uid = www-data
gid = www-data
base = /var/www/html
chdir = %(base)/%(project)
module = %(project).wsgi:application
master = True
processes = 4
socket = 0.0.0.0:8000
chown-socket = %(uid):www-data
chmod-socket = 664
vacuum = True
max-requests = 5000
# pid文件的储存路径
pidfile = %(base)/%(project)/log/%(project)-master.pid
# log文件的储存路径
daemonize = %(base)/%(project)/log/%(project)-uwsgi.log
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
post buffering = 8192
buffer-size = 65535
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true
#不记录request日志,只记录错误日志
disable-logging = true
#开启内存使用情况报告
memory-report = true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as = 1024

uwsgi文档


文章作者: 柒仔
文章链接: /article/48/
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XiaoLiu!
侵权声明: 若无意对您的文章造成侵权,请您留言,博主看到后会及时处理,谢谢。
评论-----昵称和邮箱必填,网址选填
  目录