Docker 部署Django博客项目


我之前部署我的博客项目(Django应用),没用Docker,直接借助的宝塔Linux服务器面板在服务器上部署的,部署起来也是十分的方便,使用了Django+Nginx+Supervisor+Gunicorn部署,可查看我写过的一片博客:Centos安装python3并使用Nginx+Gunicorn+virtualenv+supervisor来部署django项目

这段时间了解了Docker,为其“Build,Ship and Run Any App,Anywhere”的思想所折服!

Docker 部署 Django 应用可以通过两种方式来完成:迭代构建和容器互联。

我的博客是使用了容器互联的方式搭建 Django 容器栈。

网络架构

Docker环境

  • Nginx容器: nginx:1.15
  • Web Server容器: python:3
  • Memcached容器: memcached
  • MySQL容器: mysql:5.7

项目结构

.
├── db
│   ├── Dockerfile
│   └── mysql.cnf               ---数据库配置
├── djangoblog
│   ├── DjangoBlog
│   └── Dockerfile
├── docker-compose.yml
├── memcached
│   └── Dockerfile
├── nginx
│   ├── Dockerfile
│   ├── fkomm.cn
│   └── nginx
└── run.sh

db里面是我mysql的配置,内有Dockfile文件;djangoblog里面是我的django应用的源码,内也有Dockfile文件;nginx文件里还有一个Dockfile。db、djangoblog、memcached、nginx都分别是一个service,我们通过docker-compose.yml文件的配置来创建镜像和容器。也就是说你必须要做几件事:

  • 在每个服务(应用)下编写Dockerfile;

  • 在docker-compose.yml文件中配置相关的服务;

  • run.sh 执行 docker-compose命令:build 和 up!

Dockerfile配置:

MySQL应用的配置(db):

FROM mysql:5.7

RUN mkdir -p /var/lib/mysql/ && mkdir -p /var/log/mysql/  && chown -R mysql:root /var/lib/mysql/ && \
    chown -R mysql:mysql /var/lib/mysql/ && \
    chown -R mysql:mysql /var/log/mysql/ && \
    chown -R  mysql /var/lib/mysql && \
    chgrp -R  mysql /var/lib/mysql && \
    chown -R mysql:root /var/lib/mysql/
ADD ./mysql.cnf /etc/mysql/conf.d/mysql.cnf
CMD ["mysqld"]

Django应用的配置(djangoblog):

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir -p /code/DjangoBlog/ && mkdir -p /var/www/resource/
ADD ./DjangoBlog/requirements.txt /requirements.txt
RUN pip install -Ur /requirements.txt -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com && \
        pip install gunicorn  -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

Memcached的配置(memcached):

FROM memcached:latest

CMD ["memcached"]

EXPOSE 11211

Nginx配置(nginx目录):

FROM nginx:1.15
RUN mkdir -p /etc/letsencrypt/live/
ADD fkomm.cn /etc/letsencrypt/live/fkomm.cn/     ---小绿锁证书配置

RUN rm -rf /etc/nginx
COPY ./nginx/ /etc/nginx

docker-compose.yml配置:

version: '2'

services:
  db:
    build: ./db
    restart: always
    mem_limit: 500m
    env_file:
      - ".env"
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - ./date/mysql/:/var/lib/mysql
    depends_on:
      - memcached
    container_name: db
  djangoblog:
    build: ./djangoblog
    restart: always
    mem_limit: 500m
    env_file:
      - ".env"
    command:  bash -c  'sh /code/DjangoBlog/bin/docker_start.sh'
    volumes:
      - ./djangoblog/DjangoBlog/:/code/DjangoBlog
    links:
      - db
    depends_on:
      - db
    container_name: djangoblog
  nginx:
    restart: always
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes_from:
      - djangoblog
    links:
      - djangoblog:djangoblog
    container_name: nginx
  memcached:
    build: ./memcached
    container_name: memcached

配置的几个方面介绍:

MySQL:

  • build:根据Dockerfile重新build一个镜像;

  • environment:配置了环境变量,创建一个数据库(该数据库名为djangoblog,django在执行migrate操作时会用);

  • volumes:数据卷,为了实现备份用的,/date/mysql 是主机目录,/var/lib/mysql 是MySQL容器内目录;

  • restart:默认是no,意思是在任何情况都不会重启;设成always,就是如果stop了,就会重启;

  • depends_on:它有两层含义,一是在启动服务的时候,会先启动memcached,然后再启动db;二是如果执行docker-compose up db也会创建和启动memcached。

在DjangoBlog应用的settings.py里也要写成相应的配置,具体如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoblog',
        'USER': 'root',
        'PASSWORD':'admin',
        'PORT':3306,
        'HOST':'db',
    }
}

DjangoBlog:

  • links: 创建和其他容器中的service的链接,指定服务名字即可。有了这个连接,服务之间就可以通过service名字通信了!

Nginx:

  • ports:格式为HOST:CONTAINER。相当于一个nat转换,设置内部的端口向外转发的端口; http默认端口

Memcached:

因为不需要重新配置,直接用仓库中的镜像即可!

run.sh启动:

#清理临时镜像
docker rmi $(docker images -q -f dangling=true) -f
#清理所有容器
docker rm $(docker ps -a -q) -f

docker-compose build
docker-compose up

接着在浏览器里面输入https://www.fkomm.cn 就可以进入梦寐以求的网站啦!!!!