依旧使用centos 7.6
1 安装docker
systemctl start docker
systemctl enable docker
systemctl restart docker # 重启
systemctl stop docker # 停止
2 docker部署Django应用
1.1 基于python基础镜像方式
mysql redis自行先启动
1.1.1 上传代码
# 压缩并上传代码
tar -czvf project.tar.gz project
scp project.tar.gz root@192.168.13.2:/home/
# 登录服务器并解压
cd /home
tar -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/bash
cd /home/project
pip install -r requirement.txt
pip 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.py
module = project.wsgi
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录
daemonize=uwsgi.log
EOF
1.1.5 启动uwsgi
#启动,停止,重启,查看
uwsgi -d --ini uwsgi.ini #启动
lsof -i :8080 #按照端口号查询
ps aux | grep uwsgi #按照程序名查询
kill -9 13844 #杀死进程
uwsgi --stop uwsgi.pid #通过uwsg停止uwsgi
uwsgi --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 nginx
apt-get update
apt-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