我们来使用 docker-compose 并基于 gunicorn + mariadb + nginx 部署一个简单的 django 博客应用;
1. docker-compose 项目的组织目录
.
├── django-blog
│ ├── blogproject
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── Dockerfile
│ ├── manage.py
│ ├── requirements.txt
│ └── static
├── docker-compose.yaml
├── mysql
│ ├── conf
│ │ └── django-blog.cnf
│ └── data
└── nginx
├── conf
│ └── mysite.template
├── log
└── ssl
2. 构建 mysql 容器
mysql/
├── conf
│ └── django-blog.cnf
└── data
-
配置数据库使用
utf8mb4
编码:# mysql/conf/django-blog.cnf [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
-
docker-compose.yaml 中 mysql service 的配置:
db: image: mariadb:10.4 container_name: django-blog-db restart: always environment: MYSQL_ROOT_PASSWORD: <root 用户的密码> MYSQL_DATABASE: <容器启动时,自动创建的数据库名> MYSQL_USER: <容器启动时,自动创建的数据库用户,其对上述数据库拥有全部的权限> MYSQL_PASSWORD: <上述数据库用户的密码> volumes: - ./mysql/conf:/etc/mysql/conf.d # 挂载自定义配置目录,即上述的 mysql/conf/django-blog.cnf 中的配置 - ./mysql/data:/var/lib/mysql # 挂载数据目录 - ./mysql/log:/var/log # 挂载日志目录
-
为什么不用 mysql,而是使用 mariadb ?
mysql:latest 默认的认证方式变为
caching_sha2_password
,直接使用会报错:Authentication plugin 'caching_sha2_password' cannot be loaded
;使用 mariadb:latest 或者使用 mysql:5.7 是没有问题的;
关于这个问题的讨论可以参考如下链接,里面提到一些规避的方法:
-
caching_sha2_password
介绍: -
github 两个相关 issue 的讨论:
-
3. 构建 django-blog 容器
django-blog/
├── blogproject
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── Dockerfile
├── manage.py
├── requirements.txt # 包依赖
└── static # python manage.py collectstatic 命令收集到的静态文件的目录
-
编写 Dockerfile:
FROM python:3.7-alpine # 使用 alpine 版本,精简 image 体积; RUN echo "https://mirrors.ustc.edu.cn/alpine/latest-stable/main" > /etc/apk/repositories \ && apk update \ # alpine 中 mariadb 代替了 mysql: <https://alpinelinux.org/posts/Alpine-3.2.0-released.html> && apk add mariadb-dev build-base RUN mkdir /code WORKDIR /code COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt
其中, requirements.txt 内容为:
-i https://mirrors.aliyun.com/pypi/simple Django==2.2.5 django-haystack==2.8.1 gunicorn==19.9.0 jieba==0.39 Markdown==3.1.1 mysqlclient==1.4.4 Whoosh==2.7.4
-
docker-compose.yaml 中 web service 的配置:
web: build: django-blog/ image: django-blog:2.2.5 # 构建后,image 的名字,2.2.5是目前使用的 django 版本 container_name: django-blog-web restart: always depends_on: - db volumes: - ./django-