DockerコンテナにDjangoを入れて起動してみた

概要

そろそろDockerを触ってみたいと思ったのと、どうせ触るならPythonやらDjangoも使ってみようと…ということで軽く試してみました。

  • 今回触れたもの一覧
    • Dockerイメージ(CentOS)
    • Python3.6
    • Django2.1
    • Django REST Framework2.0.0
    • MySQL5.7

Dockerコンテナ起動まで


Dockerイメージ(CentOS)をPullしてくる

docker pull centos


適当なIPを指定してDockerコンテナ(CentOS)を起動しつつログイン

docker run -it -p 8000:8000 centos /bin/bash

PythonDjangoのインストール


Python3系インストールのためのリポジトリをインストール

yum install -y https://centos7.iuscommunity.org/ius-release.rpm


Python3.6をサーチしてみる

yum search python36


Python3.6と関連するものをインストール

yum install -y python36u python36u-devel python36u-libs


"python3"と打てばPythonコマンドが有効になるよう、シンボリックリンクを張る

ln -s /usr/bin/python3.6 /usr/bin/python3


pipをインストール

yum install -y python36u-pip


インストールされたpipのバージョンが古いのでアップグレードする

/usr/bin/pip3.6 install --upgrade pip


DjangoDjango REST Framework、Django-Filterをインストール

pip install django
pip install djangorestframework
pip install django-filter

Djangoのプロジェクトとアプリを作成し、起動


Djangoがインストールされたディレクトリに移動

cd /usr/local/bin/


Djangoのプロジェクトを作成

django-admin.py startproject myprj


プロジェクトのルートディレクトリに移動

cd myprj


アプリを作成

python3 manage.py startapp myapp


マイグレーションを実行

python3 manage.py migrate


アプリを起動してみる

python3 manage.py runserver 0.0.0.0:8000


アプリ起動用のスクリプトを作っておく

vim /usr/local/bin/init.sh
python3 /usr/bin/myprj/manage.py runserver 0.0.0.0:8000
while true ; do
    /usr/bin/fish
done

MySQL5.7のインストール


インストール用リポジトリのインストール後、インストール実行

rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

yum -y install mysql-community-server


MySQLのrootユーザーのパスワードを確認

cat /var/log/mysqld.log |grep password
→パスワードが表示されるのでコピー等しておく


MySQLのセキュリティ設定を行う

mysql_secure_installation
※先程確認したパスワードと、新しいパスワード入力を求められる


root以外のユーザーを作成

grant all privileges on *.* to hoge@localhost identified by '任意のパスワード' with grant option;

flush privileges;


データベースを作成

create database myapp_db;

Django側のMySQL関連設定

PyMySQLのインストール

pip install PyMySQL


manage.pyにPyMySQLの設定を追記

vim manage.py
import pymysql
pymysql.install_as_MySQLdb()


settings.pyにMySQLの情報を追記

vim settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'myapp_db',
        'USER':'hoge',
        'PASSWORD':'hogeのパスワード',
        'HOST':'localhost',
        'PORT':'3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
        'TEST': {
            'NAME': 'test_sample'
        }
    }
}


マイグレーション実行

python3 manage.py makemigrations
python3 manage.py migrate


Ctrl+p,Ctrl+qでコンテナから抜けた後、コンテナをDockerイメージとして保存

#起動中のコンテナのコンテナIDを確認
docker ps
#コミットして保存
docker commit コンテナID mychuno_myapp


Dockerコンテナを止める

docker stop コンテナID

ホストからDockerコンテナを立ち上げた後、アプリを起動

Docker起動後にMySQLも起動

  • 先程保存したDockerイメージを用いる
  • -vオプションでホストの任意のディレクトリにバックアップできるようにしておく
docker run -it -p 8000:8000 -v /Users/hchuno/projects/docker_myapp/mychuno:/usr/local/bin/myprj_bk --privileged mychuno_myapp /sbin/init


Dockerコンテナにログインしてアプリを起動

docker ps

docker exec -it CONTAINER_ID /usr/local/bin/init.sh /bin/bash