django+uwsgi nginx+vue mysql在docker中部署实践
环境准备
ubuntu安装docker
sudo apt-get install docker-ce
ubuntu安装docker compose
使用pip安装
sudo pip install docker-compose
拉取需要的镜像mysql、nginx和python3.6
sudo docker pull mysql:5.7
sudo docker pull nginx:latest
sudo docker pull python:3.6
创建部署目录
mkdir ~/project
mkdir ~/project/mysql
mkdir ~/project/nginx,vue部署文件存放目录
mkdir ~/project/django_webapi,django项目存放目录
分别将vue项目dist目录下的文件和django项目下的工程文件拷贝到上述目录下
Build django镜像
- django项目的依赖库requirements文件拷贝到~/project/django_webapi目录下
- django使用uwsgi方式部署,django工程目录下创建uwsgi.ini文件
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_webapi.settings.product")
application = get_wsgi_application()
- 创建Dockerfile文件
FROM python:3.6
# install mysql-client
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo "deb http://mirrors.aliyun.com/debian buster main" >/etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >>/etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian buster-updates main" >>/etc/apt/sources.list
RUN apt-get update
#RUN apt-get install -y mysql-client
RUN apt-get install -y libsasl2-dev python3-dev libldap2-dev libssl-dev
RUN apt-get install git
# env
ENV RUN_MODE=DEPLOY
# add project to the image
ADD . /app/
# set working directory to /app/
WORKDIR /app/
# install python dependencies
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY ssh /root/.ssh
RUN chmod 600 /root/.ssh/id_rsa
# RUN server after docker is up
#CMD python manage.py runserver 0.0.0.0:8000
CMD uwsgi --ini uwsgi.ini
- 创建django镜像
cd ~/project/django_webapi
sudo docker build -t django_webapi .
配置
mysql配置文件
~/project/mysql/conf目录下创建mysqld.cnf文件
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
#表名不区分大小写
#lower_case_table_names=1
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
nginx配置文件
~/project/sites-enabled目录下创建nginx.conf文件
server {
listen 80;
listen [::]:80;
server_name exp_nginx;
client_max_body_size 500m;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
index index.html index.htm;
location / {
root /usr/share/nginx/html/vue-webui;
}
# django跳转配置
location /app {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://django_webapi:8000; # 此处可以使用django docker容器名称
}
}
docker-compose配置
~/project目录下创建docker-compose.yaml文件
version: "3"
services:
mysql:
restart: always
image: mysql:5.7
container_name: mysql # 容器名
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
environment:
- MYSQL_ROOT_PASSWORD=test
networks:
- back
webapi:
restart: always
image: django_webapi
container_name: django_webapi # 容器名
ports:
- "8600:8000"
depends_on:
- mysql
volumes:
- ./django_webapi:/app # 挂载django部署目录
- ./logs:/home/logs
- /etc/localtime:/etc/localtime:ro
dns:
- 10.192.1.10
networks:
- back
nginx:
restart: always
image: nginx:latest
container_name: exp_nginx # 容器名
ports:
- "80:80"
depends_on:
- mysql
volumes:
- ./nginx/sites-enabled/nginx.conf:/etc/nginx/conf.d/default.conf
- ./nginx/vue-webui:/usr/share/nginx/html/vue-webui
- /etc/localtime:/etc/localtime:ro
networks:
- back
networks:
back:
driver: bridge
部署
执行sudo docker-compose up -d命令启动mysql、nginx、django三个容器
sudo docker-compose start [container name]启动单个容器
创建创建库
mysql客户端连接mysql容器,创建数据库
修改django数据库配置
settings/product.py文件中修改DATABASES配置,执行mysql容器
生成数据库表
sudo docker exec -it django_webapi bash
python manage_product.py makemigrations
python manage_product.py migrate
重启容器sudo docker-compose restart
测试
访问http://ip,业务是否正常
FAQ
django项目新增python第三方库
需要更新django镜像,第三方库添加到requirements文件中
执行docker exec -it django_webapi bash
pip install -r requirements
docker commit containerID django_webapi ,保存镜像
nginx工程更新
将vue部署文件拷贝到~/project/nginx目录下,reload方式更新,sudo docker exec -i nginx nginx -s reload
django工程更新
将django工程文件拷贝到~/project/django_webapi目录下,reload方式更新
docker exec -i django_webapi uwsgi --reload uwsgi.pid
数据库变更
sudo docker exec -it django_webapi bash
python manage_product.py makemigrations
python manage_product.py migrate
停止服务
进入~/projects/xp_cicenter目录
sudo docker-compose stop
快速部署
可以使用fabric编写快速部署脚本,自动打包vue和django工程并部署到对应目录下