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镜像

  1. django项目的依赖库requirements文件拷贝到~/project/django_webapi目录下
  2. 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()
  1. 创建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
  1. 创建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工程并部署到对应目录下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值