docker-compose部署django+nginx+mysql项目

一、项目结构
[root@mail docker-feiyu]# tree
`-- dokcer-feiyu
     |-- docker-compose.yml
     |-- nginx
     |   |-- Dockerfile
     |   `-- nginx.conf
     |-- User
   |-- Dockerfile
   |-- manage.py
   |-- requirements.txt
   |-- static
   |-- users
   |-- db.sqlite3
   |-- gunicorn.conf
   |-- media
   |-- start.sh
   |-- templates
   `-- User
二、nginx部分
1、先编写Dockerfile
[root@mail nginx]# vi Dockerfile

FROM nginx
#对外暴露端口
EXPOSE 80 8000
#RUN rm /etc/nginx/conf.d/default.conf
ADD nginx.conf  /etc/nginx/conf.d/
RUN mkdir -p /usr/share/nginx/html/static
RUN mkdir -p /usr/share/nginx/html/media

2、准备nginx配置文件
[root@mail nginx]# vi nginx.conf

server {
     listen      80;
     server_name localhost;
     charset     utf-8;
     error_log /tmp/nginx_error.log;
     access_log /tmp/nginx_access.log;
     location /media {
         alias /usr/share/nginx/html/media;
     }
     location /static {
         alias /usr/share/nginx/html/static;
         }
     location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://web:8000;
     }
}

关于nginx配置,要注意以下两点,是非常重要的:
    location
    静态文件配置,nginx指定的静态文件原目录是在/usr/share/nginx/html/,而该目录下的静态文件是从web容器中通过volumes同步的。所以,等下docker-compose是非常非常重要的。
    proxy_pass
    这和你直接在主机上配置是不一样的,host不能写成具体的IP,要写服务名,这里要写web service的name,web是在docker-compose中定义的web应用的service名称。后面要写docker-compose的配置。

三、django部分
1、编写Dockerfile
[root@mail User]# vi Dockerfile

FROM python:3.5
#MySQL-Python必须得先安装这个库
RUN mkdir /User
#设置工作目录
WORKDIR /User
#将当前目录加入到工作目录中
ADD . /User
#install any needed pacakges in requirements.txt,你要把所有需要安装的Python模块加到这文
件中。
RUN pip install -r requirements.txt
#对外暴露端口
EXPOSE 80 8000
#设置环境变量
ENV SPIDER=/User

2、添加requirements.txt文件

Django==1.18
Pillow
PyMySQL

3、修改项目settings.py文件配置
修改地方有两个,

ALLOWED_HOSTS = ['*', ]
。。。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dataname',
        'USER': 'root',
        'PASSWORD': '123456',
  'HOST': 'db',
    }
}

这里的NAME就是docker-compose.yml文件中的MYSQL_DATABASE,PASSWORD为docker-compose.yml文件中的MYSQL_ROOT_PASSWORD,HOST为docker-compose.yml 的db
4.启动脚本start.py

#!/bin/bash
python manage.py collectstatic --noinput &&
python manage.py migrate &&
gunicorn User.wsgi:application -c gunicorn.conf

5此外,django应用选择gunicorn做web服务器,gunicorn的配置文件如下:

workers=4
bind=['0.0.0.0:8000']
proc_name='blog'
pidfile='/tmp/blog.pid'
worker_class='gevent'
max_requests=6000

 四、编写docker-compose文件
vi Docker-compose.yml
 

version: "3"
services:
    db:
       image: mysql
       environment:
          MYSQL_DATABASE: dataname
          MYSQL_ROOT_PASSWORD: 123456
       volumes:
         - /srv/db:/var/lib/mysql
       restart: always
    web:
       build: ./User
       ports:
       - "8001:8001"
       volumes:
       - ./User:/User
       - /tmp/logs:/tmp
       command: python3 manage.py runserver 0.0.0.0:8001
   nginx:
     build: ./nginx
     ports:
     - "81:80"
     volumes:
     - ./User/static:/usr/share/nginx/html/static
     - ./User/media:/usr/share/nginx/html/media
     links:
     - web
     depends_on:
     - web
     restart: always

五、编译和启动
a、编译
docker-compose build
b、启动
docker-compose up

docker-compose up -d(后台运行)
在浏览器中输入localhost就可以成功访问项目了
参考文章
https://blog.csdn.net/hbnn111/article/details/77176629

猜你喜欢

转载自blog.csdn.net/bbwangj/article/details/81170010