依旧使用centos 7.6

1 安装docker

https://www.runoob.com/docker/centos-docker-install.html

  1. systemctl start docker
  2. systemctl enable docker
  3. systemctl restart docker # 重启
  4. systemctl stop docker # 停止

2 docker部署Django应用

1.1 基于python基础镜像方式

mysql redis自行先启动

1.1.1 上传代码

  1. # 压缩并上传代码
  2. tar -czvf project.tar.gz project
  3. scp project.tar.gz root@192.168.13.2:/home/
  4. # 登录服务器并解压
  5. cd /home
  6. tar -xzvf project.tar.gz

1.1.2 拉取python3.x.x镜像并运行容器

  1. docker run -di --name=project -p 8080:8080 -v /home/project:/home/project python:3.7.1

1.1.3 安装依赖

  1. docker exec -it project /bin/bash
  2. cd /home/project
  3. pip install -r requirement.txt
  4. pip install uwsgi

1.1.4 配置uwsgi

  1. # 在项目根路径下创建一个uwsgi.ini 文件,写入
  2. cat >> /home/project/uwsgi.ini << EOF
  3. [uwsgi]
  4. #配置和nginx连接的socket连接
  5. socket=0.0.0.0:8080
  6. #也可以使用http
  7. #http=0.0.0.0:8080
  8. #配置项目路径,项目的所在目录
  9. chdir=/home/project
  10. #配置wsgi接口模块文件路径
  11. wsgi-file=project/wsgi.py
  12. module = project.wsgi
  13. #配置启动的进程数
  14. processes=4
  15. #配置每个进程的线程数
  16. threads=2
  17. #配置启动管理主进程
  18. master=True
  19. #配置存放主进程的进程号文件
  20. pidfile=uwsgi.pid
  21. #配置dump日志记录
  22. daemonize=uwsgi.log
  23. EOF

1.1.5 启动uwsgi

  1. #启动,停止,重启,查看
  2. uwsgi -d --ini uwsgi.ini #启动
  3. lsof -i :8080 #按照端口号查询
  4. ps aux | grep uwsgi   #按照程序名查询
  5. kill -9 13844 #杀死进程
  6. uwsgi --stop uwsgi.pid #通过uwsg停止uwsgi
  7. uwsgi --reload uwsgi.pid #重启
  8. exit

1.1.6 创建nginx配置

  1. mkdir -p nginx/{conf,html,logs}
  1. # 创建文件default.conf,注意nginx依赖uwsgi,因此,uwsgi服务要先启动
  2. # nginx配置文件。
  3. upstream django {
  4. ip_hash;
  5. # docker inspect [imageName] | grep "IPAddress" 进行查看docker分配的Ip,这里若写宿主机ip会不通
  6. server 172.17.0.3:8080; # Django+uwsgi容器所在IP地址及开放端口,非宿主机外网IP
  7. }
  8. server {
  9. listen 80; # 监听80端口
  10. server_name localhost; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址
  11. location /static {
  12. alias /usr/share/nginx/html/static; # 静态资源路径
  13. }
  14. location /media {
  15. alias /usr/share/nginx/html/media; # 媒体资源,用户上传文件路径
  16. }
  17. location / {
  18. include /etc/nginx/uwsgi_params;
  19. uwsgi_pass django;
  20. uwsgi_read_timeout 600;
  21. uwsgi_connect_timeout 600;
  22. uwsgi_send_timeout 600;
  23. # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  24. # proxy_set_header Host $http_host;
  25. # proxy_redirect off;
  26. # proxy_set_header X-Real-IP $remote_addr;
  27. # proxy_pass http://django;
  28. }
  29. }
  30. access_log /var/log/nginx/access.log main;
  31. error_log /var/log/nginx/error.log warn;

1.1.7 使用docker启动nginx

  1. 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 nginx
  2. apt-get update
  3. apt-get install -y vim
  4. # 根据上面的配置文件修改
  5. # 修改完毕后执行
  6. docker restart nginx
  7. # 然后即可访问页面

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