使用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 应用名称等)

目录结构

image.png

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.
image.png

进行迁移(创建表格)

由于容器已经挂载,因此在主机端编辑源代码也没有问题。
让我们编辑 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

image.png
image.png

我已经确认了在admin.py中注册的模型。以上。辛苦了。

考試準備

抱歉,由于是草稿,可能很难阅读。我后悔没有分段。

由于Docker使得Django可以连接MySQL,因此能够轻松地进行各种操作而无需污染主机环境…非常方便(令人激动)

广告
将在 10 秒后关闭
bannerAds