使用docker-compose搭建Django容器 + MySQL容器的环境 —— 从创建表到使用迁移工具进行确认
重新寫了一遍!(2019/6/20)
我已经将其分成了第一部分和第二部分,请点击这里!
使用Docker创建Django + MySQL开发环境(第一部分)
使用Docker创建Django + MySQL开发环境(第二部分)
环境
・macOS Mojave v10.14.3
・Docker v18.09.2
· macOS Mojave 版本10.14.3
· Docker 版本18.09.2
前提 tí)
使用Django的管理命令可以创建项目和应用程序(例如:django-admin startproject 项目名称)。
・Django 可以使用管理命令
(例如 python manage.py makemigrations 应用名称等)
目录结构

docker-compose.yml 的释义是 “Compose 项目的 Docker 配置文件”。
我已经在django服务的”volumes:”下指定了要挂载的目录。
容器启动后,指定的目录将被挂载到容器内的”code”文件夹下。(虽然我还没有尝试,但应该也可以使用完整路径进行指定)
在指定的”build:”目录下的Dockerfile将被构建。
・为了从Django项目连接到MySQL的IP地址,请指定网络以获得固定IP地址。
version: '3'
services:
mysql:
image: mysql
env_file: ./mysql/.env_sample
command: --default-authentication-plugin=mysql_native_password
ports:
- "3306:3306"
networks:
app_net:
ipv4_address: 172.20.0.3
depends_on:
- django
django:
build: ./django
ports:
- "8000:8000"
volumes:
- ./docker_django_app:/code
networks:
app_net:
ipv4_address: 172.20.0.2
tty: true
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/24
volumes:
est-data:
Dockerfile 请编写与系统原生语言的中文释义。
如果在WORKDIR上指定一个目录,它将成为容器的工作目录,非常方便。
(当通过exec命令等连接到容器时,指定的目录将成为当前目录。)
FROM python:3.7.2
ENV LANG en_US.utf8
WORKDIR /code
ADD requirements.txt /code
RUN apt-get update
RUN pip install -r requirements.txt
RUN apt-get install -y mysql-client
要求.txt
django==2.1.5
PyMySQL==0.9.3
Pillow
mysqlclient
.env_样本
我计划使用名为「redbull」的数据库,在其中使用Django的管理命令执行迁移操作来更新数据库。
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=redbull
MYSQL_USER=db_user
MYSQL_PASSWORD=password
设置.py
只包括必要的部分。
(用户可能需要root权限。)
.
..
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_app',# ←作成したアプリケーションを追加しておく
]
...
..
.
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql'
, 'NAME' : 'redbull'#←.env_sampleで指定したMYSQL_DATABASE
, 'USER' : 'db_user'#←.env_sampleで指定したMYSQL_USER
, 'PASSWORD' : 'password'#←.env_sampleで指定したMYSQL_PASSWORD
, 'HOST' : '172.20.0.3' #←docker-compose.ymlに指定したmysqlのIPAddress
, 'PORT' : '3306'
,
}
}
...
..
.
管理.py
import os
import sys
import pymysql
.
..
...
#MySql接続
pymysql.install_as_MySQLdb()
使用docker-compose启动容器。
首先,使用cd命令进入包含docker-compose.yml文件的目录。
请执行以下命令
$ docker-compose up --build -d
只要出现以下消息,就表示成功启动了。
.
..
...
Creating docker_django_django_1 ... done
Creating docker_django_mysql_1 ... done
如果出现这样的错误消息,则很可能存在与已创建的容器的IPAddress空间或主机的IPAddress空间重叠的情况,请尝试将docker-compose.yml中指定的“networks:”中的“subnet”更改为不同的地址。
Pool overlaps with other one on this address space
确认容器是否已经启动。
如果状态显示为”Up…”,则表示已经启动。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ebfd9bb1af1 mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp docker_django_mysql_1
2bdd7ef8dbee docker_django_django "python3" 2 minutes ago Up 2 minutes 0.0.0.0:8000->8000/tcp docker_django_django_1
从主机的浏览器中确认在容器中启动的Django的启动页面。
将创建的Django容器配置为能够接受标准输入。
$ docker exec -it docker_django_django_1 /bin/bash
root@~:/code#
当前目录已经被指定为Dockerfile的WORKDIR目录(/code)。
请确认目录结构中标为红色的部分已经正确挂载上了。
root@~:/code# ls -al
total 144
drwxr-xr-x 7 root root 224 Mar 9 03:18 .
drwxr-xr-x 1 root root 4096 Mar 9 05:40 ..
-rw-r--r-- 1 root root 6148 Mar 6 15:05 .DS_Store
-rw-r--r-- 1 root root 131072 Mar 9 01:25 db.sqlite3
drwxr-xr-x 10 root root 320 Mar 9 02:13 django_app
drwxr-xr-x 7 root root 224 Mar 9 03:18 docker_django_app
-rwxr-xr-x 1 root root 606 Mar 9 01:34 manage.py
root@~:/code#
尝试启动Django服务器并从主机上进行连接。
.
..
...
root@~:/code# python manage.py runserver 0.0.0.0:8000
Performing system checks...
System check identified no issues (0 silenced).
You have 16 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, django_app, sessions.
Run 'python manage.py migrate' to apply them.
March 09, 2019 - 06:46:34
Django version 2.1.5, using settings 'docker_django_app.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

进行迁移(创建表格)
由于容器已经挂载,因此在主机端编辑源代码也没有问题。
让我们编辑 models.py。
(可以直接复制粘贴,也可以自行创建。)
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
'''
お酒テーブル
'''
class Alcohol(models.Model):
product_name = models.CharField(max_length=256)
internal_capacity = models.IntegerField(default=0)
price = models.IntegerField(default=0)
frequency = models.FloatField(default=0)
origin_country = models.CharField(max_length=256, blank=True)
description = models.TextField(max_length=4000, blank=True)
delete_flag = models.CharField(max_length=1, default='0')
def __str__(self):
return 'ID: ' + str(self.id) + ', お酒の名前: ' + self.product_name + '(' + str(self.internal_capacity) + ')'
'''
消費税テーブル
'''
class Tax(models.Model):
tax = models.FloatField()
'''
お酒の写真
'''
class AlcoholPicture(models.Model):
alcohol = models.ForeignKey(Alcohol, on_delete=models.CASCADE)
picture = models.ImageField(upload_to='images/')
我们已经创建了模型,现在让我们来创建迁移文件。
请从Django的容器内执行以下命令:
python manage.py makemigrations <应用名称>
root@~:/code# python manage.py makemigrations django_app
Migrations for 'django_app':
django_app/migrations/0001_initial.py
- Create model Alcohol
- Create model AlcoholPicture
- Create model Tax
root@~:/code#
我会按照现在的情况执行迁移。
执行后,将应用所创建的迁移文件来更新数据库。
root@~:/code# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, django_app, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying django_app.0001_initial... OK
Applying sessions.0001_initial... OK
root@~:/code#
为了使用管理工具,需要创建管理用户。
首先创建管理员账户。
·用户名为admin。
·邮件地址:随意。
·密码:随意。
·再次输入密码:随意。
当设置密码过于简单时,会询问是否保持当前密码,但由于只是希望在本地确认,所以暂时选择“y”继续。
root@~:/code# python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: admin@admin.com
Password:
Password (again):
The password is too similar to the email address.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
root@~:/code#
在管理工具中注册可用的表格。
我们需要编辑admin.py文件,以便可以在管理工具中使用刚刚通过迁移注册的表格。
from django.contrib import admin
from .models import Alcohol, Tax
# Register your models here.
admin.site.register(Alcohol)
admin.site.register(Tax)
只需要这个就可以了
尝试登录管理工具。
使用Django容器启动服务器,并尝试访问管理工具。
http://localhost:8000/admin


我已经确认了在admin.py中注册的模型。以上。辛苦了。
考試準備
抱歉,由于是草稿,可能很难阅读。我后悔没有分段。
由于Docker使得Django可以连接MySQL,因此能够轻松地进行各种操作而无需污染主机环境…非常方便(令人激动)