由于博客项目是由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镜像
镜像拉取完毕查看镜像信息内容:
项目结构树
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} # 定义网段
个人博客网站