前导工作:WEB开发三步曲之一-Ubuntu 18开发环境安装
搭一个起始环境,作后端django开发,目标:
-基于docker的django2环境
-基于docker的mkdocs环境写给前端文档参考
-基于docker的mysql数据庫
假定映射的容器卷路径:myapp,项目名myPrj,应用名myApp
一、创建和初始化项目
1、创建新python虚拟环境
安装django和相关的包,与要制作的docker镜像版本一致,之后因为使用容器内的django,这里只用其创建初始项目再映射到容器中。(在容器中创建会导致在主机中的相关文件夹为docker组权限,不方便后续编辑)
2、创建本地工作目录和第一个项目
mkdir base
cd base
mkdir mysql_data
mkdir docs # mkdocs文件
mkdir .envs # 环境变量文件
mkdir static # static_root
mkdir statics # 存放公用静态文件
mkdir templates # 存放模板文件
django-admin startproject myPrj . #在本地创建,不建立下级目录
django-admin startapp myApp #第一个应用
3、目录及文件配置
当前目录将作为容器映射后的默认工作目录,即容器启动后命令的运行目录。配置文件见下节。
--base #django project本地目录
manage.py #django项目管理文件
--mysql_data #数据库存储外部路径(映射到mysql容器中,加入.gitignore或放在项目目录外)
--docs #mkdocs本地文档目录
--.envs # 系统环境变量配置目录,其中的*.env文件供docker-compose.yml中引用,或python的environ包引用
Dockerfile #镜像生成配置
docker-compose.yml #容器编排配置
requirements.txt # 供Dockerfile使用
mkdocs.yml #mkdocs配置
修改baseApp下的settings.py
import environ
env = environ.Env()
env.read_env('/myapp/.envs/django.env') # 内容见下面
DEBUG = env.bool('DEBUG') # 用环境变量文件控制
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': env.db('DATABASE_URL') # 用环境变量文件控制
#也可每个应用单独设置数据庫,再设置数据庫路由
}
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.normpath(os.path.join(os.path.dirname(BASE_DIR), 'static'))
STATICFILES_DIRS = [os.path.join(BASE_DIR,'statics')]
拷入或编辑docker-compose.yml,Dockerfile,mkdocs.yml,requirements.txt到项目根目录,django.env和mysql.env到.envs目录
配置Pycharm的settings-->Docker,设置TCP socket连接为tcp://localhost:2375 (docker先配置好端口)
配置Pycharm的settings-->Prject:base的Project Interpreter,新增Docker Compose,选择配置文件为./docker-compose.yml,service为django
添加Path mappings:.:myapp
修改调试配置,Host:0.0.0.0,Port:80与docker-compose.yml内一致,Run browser中端口为映射端口为8080与docker-compose.yml一致
二、配置文件内容:Dockerfile和docker-compose.yml
1、mysql镜像,
1)用hub上现成的版本
2)容器编排
配置docker-compose.yml中的services加入mysql将mysql数据目录映射到容器中以持久保存
version: '3'
services:
mysql:
image: mysql:5.7.26
container_name: myapp_mysql_container
restart: always
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
env_file:
- .envs/mysql.env
ports:
- "3300:3306"
volumes:
- ./mysql_data:/var/lib/mysql
2、django和mkdocs镜像
Dockerfile配置,引入python安装requirements.txt中的所有包
FROM python:3.7
ADD requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
EXPOSE 8000
WORKDIR /myapp
# 开发环境
CMD python manage.py runserver 0.0.0.0:80
# 生产环境
# Migrates the database, uploads staticfiles, and runs the production server
# CMD python manage.py makamigrations && \
# python manage.py migrate && \
# python manage.py collectstatic --noinput && \
# gunicorn --bind 0.0.0.0:8000 --access-logfile - piedpiper.wsgi:application
参考requirements.txt:
# Core
pytz==2018.9
Django==2.0
gunicorn==19.9.0
django-environ==0.4.5
urllib3==1.25.3
django-cors-headers==3.1.1
transitions==0.7.1
django-rest-framework-rules==1.0.0
drf-access-policy==0.5.1
# Model Tools
django-model-utils==3.1.2
mysqlclient==1.4.2.post1
PyMysql==0.9.3
django-mysql==3.2.0
django-mptt==0.10.0
django-simple-history==2.8.0
# Rest apis
djangorestframework==3.9.1
djangorestframework_simplejwt==4.4.0
Markdown==3.0.1
django-filter==2.1.0
drf-nested-routers==0.91
# Developer Tools
mkdocs==1.0.4
# Static and Media Storage
django-storages==1.7.1
boto3==1.9.93
1)mkdocs容器编排
mkdocs文档服务镜像,用于给前端提供文档说明,使用与django相同的镜像(Dockerfile),如不使用mkdocs服务,有关接口的说明可参考Django RESTful framework中的Browsable属性,让Browsable API通过浏览器访问时显示参考信息(Needs markdown module)。
docker-compose.yml中配置
接上面services:
documentation:
restart: always
build: .
container_name: myapp_docs
command: "mkdocs serve"
volumes:
- .:/myapp
ports:
- "8081:80"
command会覆盖Dockerfile中的CMD
2)django容器编排
docker-compose.yml中配置
接上面services:
django:
build: .
container_name: myapp_container
env_file:
- .envs/django.env
- .envs/mysql.env
depends_on:
- mysql
volumes:
- .:/myapp
ports:
- 8080:80
command: >
bash -c "python wait_db_ready.py
python manage.py makemigrations
python manage.py migrate
python manage.py initdata
python manage.py collectstatic --noinput
python manage.py runserver 0.0.0.0:80"
command会覆盖Dockerfile中的CMD
所引用的envs中环境变量配置:
django.env
# django_secret_key
DJANGO_SECRET_KEY=
# DEBUG
DEBUG=True
# admin with python manage.py createsuperuser
ADMIN_USER=admin
ADMIN_PASSWORD=Admin123456
ADMIN_EMAIL=admin@admin.com
# general
MYSQL_CHECK_TIMEOUT=30
MYSQL_CHECK_INTERVAL=1
# db_url
# DATABASE_URL=mysql://username:password@host:port/database_name?charset=utf8mb4&other=other_config
# DATABASE_URL=mysql://<MYSQL_USER>:<MYSQL_PASSWORD>@mysql/<MYSQL_DATABASE>?charset=utf8mb4
DATABASE_URL=mysql://myapp:Myapp123@myapp_mysql_container/myapp?charset=utf8mb4
mysql.env
# root password
MYSQL_ROOT_PASSWORD=urpwd
# user
MYSQL_USER=myapp
# user password
MYSQL_PASSWORD=urpwd
# db_name
MYSQL_DATABASE=myapp