欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-12 08:34:14
...

一、项目结构
[[email protected] 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
[[email protected] 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配置文件
[[email protected] 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
[[email protected] 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