我之前部署我的博客项目(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 就可以进入梦寐以求的网站啦!!!!
这个数据库的配置可以详细点么
这个配置是根据自己的需求来配置的,也就是重写一下,mysql不同版本配置不同