依旧使用centos 7.6
1 安装docker
systemctl start dockersystemctl enable dockersystemctl restart docker # 重启systemctl stop docker # 停止
2 docker部署Django应用
1.1 基于python基础镜像方式
mysql redis自行先启动
1.1.1 上传代码
# 压缩并上传代码tar -czvf project.tar.gz projectscp project.tar.gz root@192.168.13.2:/home/# 登录服务器并解压cd /hometar -xzvf project.tar.gz
1.1.2 拉取python3.x.x镜像并运行容器
docker run -di --name=project -p 8080:8080 -v /home/project:/home/project python:3.7.1
1.1.3 安装依赖
docker exec -it project /bin/bashcd /home/projectpip install -r requirement.txtpip install uwsgi
1.1.4 配置uwsgi
# 在项目根路径下创建一个uwsgi.ini 文件,写入cat >> /home/project/uwsgi.ini << EOF[uwsgi]#配置和nginx连接的socket连接socket=0.0.0.0:8080#也可以使用http#http=0.0.0.0:8080#配置项目路径,项目的所在目录chdir=/home/project#配置wsgi接口模块文件路径wsgi-file=project/wsgi.pymodule = project.wsgi#配置启动的进程数processes=4#配置每个进程的线程数threads=2#配置启动管理主进程master=True#配置存放主进程的进程号文件pidfile=uwsgi.pid#配置dump日志记录daemonize=uwsgi.logEOF
1.1.5 启动uwsgi
#启动,停止,重启,查看uwsgi -d --ini uwsgi.ini #启动lsof -i :8080 #按照端口号查询ps aux | grep uwsgi #按照程序名查询kill -9 13844 #杀死进程uwsgi --stop uwsgi.pid #通过uwsg停止uwsgiuwsgi --reload uwsgi.pid #重启exit
1.1.6 创建nginx配置
mkdir -p nginx/{conf,html,logs}
# 创建文件default.conf,注意nginx依赖uwsgi,因此,uwsgi服务要先启动# nginx配置文件。upstream django {ip_hash;# docker inspect [imageName] | grep "IPAddress" 进行查看docker分配的Ip,这里若写宿主机ip会不通server 172.17.0.3:8080; # Django+uwsgi容器所在IP地址及开放端口,非宿主机外网IP}server {listen 80; # 监听80端口server_name localhost; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址location /static {alias /usr/share/nginx/html/static; # 静态资源路径}location /media {alias /usr/share/nginx/html/media; # 媒体资源,用户上传文件路径}location / {include /etc/nginx/uwsgi_params;uwsgi_pass django;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_pass http://django;}}access_log /var/log/nginx/access.log main;error_log /var/log/nginx/error.log warn;
1.1.7 使用docker启动nginx
docker run --name nginx -id -p 80:80 -v /home/project/static:/home/static -v /home/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginxapt-get updateapt-get install -y vim# 根据上面的配置文件修改# 修改完毕后执行docker restart nginx# 然后即可访问页面
1.2 基于dockerfile生成镜像(推荐)
1.2.1 Dockerfile 文件
使用python3.7-alphine缩小镜像体积可能因为编译环境导致报错 可以根据实际情况进行选择,解决,这里使用ubuntu的底包,也可以使用python,ubuntu实际会比python小不少
FROM ubuntu:18.04
#FROM python:3.6
MAINTAINER zbb
RUN apt-get update && \
    apt-get install -y python3.6 \
                       python-dev \
                       python3-pip \
    && apt-get clean \
    && apt-get autoclean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN pip3 install --upgrade pip && \
    pip3 config set global.index-url https://pypi.douban.com/simple/
RUN mkdir -p /usr/src/app/YunTai
# 设置容器内工作目录
WORKDIR /usr/src/app/YunTai
# 将当前目录文件拷贝一份到工作目录中(. 表示当前目录)
COPY . /usr/src/app/YunTai
# 利用 pip 安装依赖
RUN pip3 install -r requirements.txt
RUN pip3 install uwsgi
EXPOSE 9091
EXPOSE 8787
# 设置start.sh文件可执行权限
RUN chmod +x ./init.sh
RUN chmod +x ./start.sh
# ENTRYPOINT ["./start.sh"] 使用docker-compose启动可注释掉
1.2.2 start.sh
chmod +x start.sh
#!/bin/bash
# 注意:前两个服务一定要在后台运行,即后面加个&,最后一个服务要以前台运行。
#否则,全部以前台运行的话,只有第一个服务会启动;全部以后台运行的话,当最后一个服务执行完成后,容器就退出了
python manage.py collectstatic --noinput &
python manage.py makemigrations &
python manage.py migrate &
# 启动worker
celery worker -A project -l info -f /home/project/celery.log &   #这里注意日志位置要写绝对路径
# 启动beat
celery beat -A celery_tasks.main -l info &
uwsgi --ini uwsgi.ini
1.2.3 uwsgi.ini参考
[uwsgi]
project=project
uid=www-data
gid=www-data
base=/home
chdir=%(base)/%(project)
module=%(project).wsgi:application
master=True
processes=2
socket=0.0.0.0:8080
chown-socket=%(uid):www-data
chmod-socket=660
buffer-size=65536
pidfile=/tmp/%(project)-master.pid
# 若是将uwsgi作为前台启动交给docker则注释
# daemonize=/tmp/%(project)-uwsgi.log # 以守护进程运行,并将log生成与temp文件夹。
vacuum=True
max-requests=5000
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=60
post buffering=8678
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose=true
#开启内存使用情况报告
memory-report=true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy=10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
1.2.4 构建镜像并运行
#构建镜像
docker build -t=project:0.0.1 .
# 运行容器
docker run -di --name=project -p 8080:8080 -v `pwd`/project:/home/project project:0.0.1
3 使用docker-compose部署
3.1 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
3.2 docker-compose编排示例
version: '3'
services:
  yun_db:
    image: mariadb:10.5
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    volumes:
      - yun_db:/var/lib/mysql
      - ./config/mysql/config:/etc/mysql
      - /etc/localtime:/etc/localtime
    ports:
      - 3306:3306
    environment:
       MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
       MYSQL_DATABASE: test
  yun_redis:
    image: redis:6.2.1
    restart: always
    volumes:
      - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
  yun_init:
    image: "project:${TAG}"
    restart: always
    links:
      - yun_db
    depends_on:
      - yun_db
    working_dir: /home/project
    command: bash init.sh
  yun_uwsgi:
    image: "project:${TAG}"
    restart: always
    volumes:
      - ./Downloads:/usr/src/app/Downloads
      - /etc/localtime:/etc/localtime
    links:
      - yun_db
      - yun_init
    depends_on:
      - yun_db
      - yun_init
    working_dir: /home/project
    command: bash start.sh
  yun_nginx:
    image: nginx:1.19.8
    restart: always
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./config/nginx/key:/etc/nginx/key
      - ./config/nginx/error.log:/etc/nginx/logs/error.log
      - ./static:/var/www/static
    links:
      - yun_uwsgi
    depends_on:
      - yun_uwsgi
    ports:
      - ${PORT}:9090
      - 443:443
volumes:
  yun_db:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/home/project/db'
3.3 启动
export MYSQL_ROOT_PASSWORD=123456 TAG=0.0.1 PORT=8080
                    