Docker部署Django博客项目(一)

由于博客项目是由Python+Django+Mysql+uwsgi+Nginx搭建的,所以这里需要Nginx、mysql和博客镜像这三个镜像,Mysql与Nginx镜像直接pull下载即可,博客运行环境镜像则是自己手动构建的,可参考:Dockerfile与腾讯云容器服务构建镜像

镜像下载

docker pull nginx:mainline-alpine-perl                    # 下载Nginx镜像
docker pull mysql:5.7.28                                  # 下载Mysql镜像
docker pull ccr.ccs.tencentyun.com/sitven/web:[tag]       # 下载博客项目web镜像

镜像拉取完毕查看镜像信息内容:

Docker部署Django博客项目(一)_第1张图片

Docker部署配置

项目结构树

Blog                                      # 项目名
├── mysql_db
│   └── mysqld.cnf                        # mysql的配置文件,挂载到mysql容器
├── nginx
│   ├── conf.d
│   │    └── default.conf                 # nginx服务配置文件,挂载到nginx容器
│   ├── log
│   │    ├── error.log                    # nginx错误日志文件,挂载到nginx容器  
│   │    └── host.access.log              # nginx日志文件,挂载到nginx容器
│   └── ssl
│        ├── 1_www.sitven.cn_bundle.crt   # ssl证书文件,挂载到nginx容器
│        └── 2_www.sitven.cn.key          # ssl私钥文件,挂载到nginx容器
│
├── python
│   ├── mysite                            # 博客源码,挂载到web容器                        
│   │
│   └── mysite_uwsgi
│        ├── debug.log                    # 博客debug日志,记得添加写的权限,挂载到web容器
│        ├── mysite.ini                   # uwsgi启动配置文件,挂载到web容器
│        └── mysite.pid                   # uwsgipid文件,挂载到web容器
│
├── .env                                  # docker-compose环境变量配置文件
│
├── mysite.env                            # 博客项目环境变量配置文件
│
└── docker-compose.yml                    # docker-compose的运行文件

创建文件.env

.env是docker-compose默认使用的环境变量文件,可以把参数传递到 docker-compose 中,下列文件中填写配置参数

# mysql信息配置
MYSQL_IMAGE=mysql:5.7.28
MYSQL_ROOT_PASSWORD=PASSWORD
MYSQL_IP=192.110.0.2

# Web博客项目信息配置
BLOG_IMAGE=ccr.ccs.tencentyun.com/xxx/xxx:[tag]
BLOG_IP_BACKEND=192.110.0.6
BLOG_IP_FRONTEND=182.120.0.4

# nginx信息配置
NGINX_IMAGE=nginx:mainline-alpine-perl
NGINX_IP=182.120.0.2

# network信息配置
BACKEND_SUBNET=192.110.0.0/16
FRONTEND_SUBNET=182.120.0.0/16

创建mysite.env

mysite.env 文件是博客容器的配置参数,里面的环境变量都会传递给django 项目的 settings 文件中使用,下列文件中填写自己的host、密码、port

SECRET_KEY=#$zg51=z7lgy(46d+$nfz1)xy$i@_(1pcm3gbg4-mbq#cm6l%bmznf

# mysql数据库配置
HOST=192.110.0.2
PORT=3306
DATABASES_USER=USERNAME
DATABASES_PASSWORD=PASSWORD
NAME=DBNAME

# 邮件配置
[email protected]
EMAIL_HOST_PASSWORD=XXXXXXXXXX
EMAIL_SUBJECT_PREFIX=李文君的博客网站

修改配置文件mysqld.cnf

Mysql数据库的配置文件

[mysqld]
explicit_defaults_for_timestamp=true
character-set-server=utf8
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8;'
max_allowed_packet=10M
wait_timeout=288000
interactive_timeout = 288000
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
skip-name-resolve
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql/
log-error       = /var/lib/mysql/error.log
symbolic-links=0

修改配置文件default.conf

Nginx的配置文件

server {
    listen 80;
    server_name www.sitven.cn;
    # http重定向为https
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
    listen       443 ssl;
    server_name  www.sitven.cn;
    charset utf-8;

    # 证书
    ssl_certificate 1_www.sitven.cn_bundle.crt;
    # 私钥
    ssl_certificate_key 2_www.sitven.cn.key;
    # 会话超时
    ssl_session_timeout 5m;
    # 请按照以下协议配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 请按照以下套件配置,配置加密套件,写法遵循 openssl 标准
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    # 是否配置ssl
    ssl_prefer_server_ciphers on;

    # 最大文件大小限制  
    client_max_body_size 75M;
    # 请求日志
    access_log  /var/log/nginx/host.access.log  main;
    # 错误日志
    error_log /var/log/nginx/error.log error;

    # 转发博客请求
    location / {
        add_header Content-Security-Policy upgrade-insecure-requests;
        uwsgi_pass 182.120.0.4:8000;
        include /etc/nginx/uwsgi_params;
    }

    # 转发静态文件请求
    location ~*\.(ico|gif|jpg|jpeg|png|bmp|swf|css|js|eot|svg|ttf|woff|woff2|propertie)$ {
        # 静态文件路径
        root /usr/share/nginx/html/;
        # 当访问路径不存在该资源时,转发请求到宿主机的8080端口获取
        if (!-e $request_filename) {
            proxy_pass http://182.120.0.1:8080;
        }
    }
}
    

配置uwsgi文件mysite.ini

chdir = /opt/myapp/                 # django项目路径
module = mysite.wsgi:application    # wsgi文件路径

master = True                       # 启动主进程管理子进程
processes = 4                       # 子进程数
harakiri = 60                       # 超时时长
max-requests = 5000                 # 最大请求数,超过这个进程自动重启
buffer-size = 65536                 # 请求的最大文件大小

socket = 0.0.0.0:8000               # IP与端口号
uid = 1000        
gid = 2000

pidfile = /opt/cloud/mysite_uwsgi/mysite.pid
#daemonize = /opt/cloud/mysite_uwsgi/uwsgi.log   日志功能, 不能启动,否则uwsgi后台运行容器直接退出
vacuum = True

配置docker-compose.yml

version: '3.1'

services:
  mysql:
    image: ${MYSQL_IMAGE}                                             # mysql镜像
    container_name: "mysql_5.7.28"                                    # 容器名称
    volumes:
      - ./mysql_db/mysqld.cnf:/etc/mysql/mysql.conf.d/                # 挂载mysql配置文件
      - ./mysql_db/datadir:/var/lib/mysql/                            # 挂载mysql数据文件
    restart: always                                                   # 开机启动
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}                    # 设置ROOT账号密码
    ports:
      - "3306:3306"                                                   # 容器3306端口挂载到宿主机3306
    networks:
      my_backend:                                                     # 加入网络-my_backend
        ipv4_address: ${MYSQL_IP}                                     # 指定的IP地址

  web_mysite:
    image: ${BLOG_IMAGE}                                                           # 博客项目镜像
    container_name: "web_mysite"                                                   # 容器名称
    volumes:
      - ./python/mysite_uwsgi:/opt/cloud/mysite_uwsgi                              # 挂载uwsgi与日志文件到容器
      - ./python/mysite:/opt/myapp                                                 # 挂载博客源码文件到宿主机
    restart: always                                                                # 开机启动
    ports:
      - "8000:8000"                                                                # 容器8000端口映射宿主机8000端口
    depends_on:                                                                    # 晚于这两容器启动
      - mysql
      - nginx
    networks:
      my_backend:                                                                  # 加入网络-my_backend
        ipv4_address: ${BLOG_IP_BACKEND}                                           # 指定IP地址
      my_frontend:                                                                 # 加入网络-my_frontend
        ipv4_address: ${BLOG_IP_FRONTEND}                                          # 指定的IP地址
    env_file:
      - ./mysite.env                                                               # 引用mysite.env参数为环境变量
    command: uwsgi --ini /opt/cloud/mysite_uwsgi/mysite.ini                        # uwsgi启动博客项目

  nginx:
    image: ${NGINX_IMAGE}                                                               # nginx镜像
    container_name: "nginx_1.17.9"                                                      # 容器名称
    volumes: 
      - ./nginx/conf.d:/etc/nginx/conf.d                                                # 挂载nginx配置文件
      - ./nginx/log:/var/log/nginx                                                      # 挂载日志文件到宿主机
      - ./python/mysite/static_collected:/usr/share/nginx/html/static:ro                # 挂载博客静态文件到nginx
      - ./nginx/ssl/1_www.sitven.cn_bundle.crt:/etc/nginx/1_www.sitven.cn_bundle.crt:ro # 挂载证书文件到Nginx
      - ./nginx/ssl/2_www.sitven.cn.key:/etc/nginx/2_www.sitven.cn.key:ro               # 挂载私钥文件到nginx
    restart: always                                                                     # 开机启动
    ports:                                                                              # 容器端口映射宿主机
      - "80:80"                                                                         
      - "443:443"
    networks:
      my_frontend:                                                                      # 加入网络-my_frontend
        ipv4_address: ${NGINX_IP}                                                       # 指定的IP地址

networks:
  my_backend:                                                        # 自定义网络-my_backend
    driver: bridge                                                   # 定义的网络模式
    ipam:
      config:
        - subnet: ${BACKEND_SUBNET}                                  # 定义网段
  my_frontend:                                                       # 自定义网络-my_frontend
    driver: bridge                                                   # 定义的网络模式
    ipam:
      config:
        - subnet: ${FRONTEND_SUBNET}                                 # 定义网段

 

个人博客网站

 

你可能感兴趣的:(Docker)