Docker入門

Dockerの開発環境をローカル環境に構築する手順や、 Docker を使ったプログラムの記述方法や実行までをサンプルを使いながら順に学習していきます。

djangoとmysqlをdocker-composeで動かす【docker-compose,django,mysql】

本記事で解説すること

  • ソースコードの入手
  • Djangoプロジェクトの作成
  • docker-compose buildを使用したコンテナ作成
  • docker-compose upによる起動
  • docker-comopse exec ... bashによるコンテナ内部へのログイン
  • Djangoプロジェクトの起動確認
  • Djangoプロジェクトのアカウント作成
  • mysqlコンテナの確認

第一章:ソースコードの入手と解説

本リポジトリのソースコードをダウンロードします。

git clone https://github.com/kawadasatoshi/PythonImages.git

docker-compose.ymlの解説

version: '3'

services:
  app: 
    container_name: django 
    build: ./django
    volumes:
     - ./django/code/:/code
    ports:
     - 80:80
    command: python mysite/manage.py runserver 0.0.0.0:80
    depends_on:
      - db
  db:
    container_name: mysql
    build: ./mysql
    restart: always
    volumes:
      - ./mysql/data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      TZ: 'Asia/Tokyo'
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: 'django'
      MYSQL_USER: 'django'
      MYSQL_PASSWORD: 'django'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
    privileged: true

appdbについて

コンテナ一つ目と二つ目。 それぞれdjangoアプリケーションとmysqlサービスを稼働させます。 ここの名前はdocker-compose関連のサービスでよく扱う。

以下のコマンドではappだけ指定してコンテナを起動する

docker-compose up app
注意

個々の名前を指定してdockerコマンドを指定しても基本動かない。

例えば以下のコマンドでは、appを指定しているが、dockerコマンドなので動かない。

docker exec app bash

docker-comopseコマンドに置き換えることで動きます。

docker-compose exec app bash

container_name:コンテナ名を指定する

コンテナをビルドする際に、名前を付与します。 appdbと違い、dockerコマンドで扱われる。

container_name: django 
docker exec -it django bash

build:ビルドする場所を指定する

それぞれのコンテナのDockerfileの場所を指定する。

以下の例ではdjangoディレクトリの配下にあるDockerfileを指定します。

build: ./django

volumes:コンテナとローカルのフォルダーをつなげる

コンテナ内部のファイルシステムがホストにあるフォルダーをマウントする。

以下の例ではdjango/codeとコンテナ内部のルート直下にあるcodeを繋げています。

volumes:
 - ./django/code/:/code

今後djangoのコマンドを使用してdjangoのアプリケーションを構築する際、この/codeディレクトリの中にpythonファイルが作成されます

あるいは、mysqlのデータが詰まったコンテナをローカルとつなげることで、コンテナ自体を削除しても再度コンテナを立ち上げることでデータがバックアップされている状態を作り出しています。

ports:コンテナとローカルのポートを繋げる

以下のように、コンテナ内部の80番ポートをローカルにある80番ポートと繋げることで、 外部のPCからコンテナ内部への通信が可能になります。

    ports:
     - 80:80

environment:環境変数を設定

今回はmysqlコンテナの構築で使用。

mysqlのコンテナは環境変数にデータベースの情報を書き込むことで、その情報をもとにデータベースが構築されるという特徴があります。

    environment:
      TZ: 'Asia/Tokyo'
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: 'django'
      MYSQL_USER: 'django'
      MYSQL_PASSWORD: 'django'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

第二章:djangoプロジェクトの構築

2. カレントディレクトリ移動(move to "django_mysql" directory)

djangoディレクトリにcdコマンドで移動します。

cd PythonImages/django_mysql/

3. Djangoプロジェクトファイルを作ろう(move to "django" and create projectfile)

  • djangoディレクトリに移動
cd django
  • djangoイメージファイルをビルド
docker image build -t django .
  • djangoを起動してコンテナ内部に入る
# for mac or linux user
docker run -it -p 80:80 -v ./code:/code django bash
# for windows user
docker run -it -p 80:80 -v ${PWD}/code:/code django bash
  • コンテナ内部では以下のコマンドを実行
django-admin startproject mysite
python mysite/manage.py startapp myapp
python mysite/manage.py migrate

ファイルが作成されればプロジェクトファイルの作成は完了です!

exitコマンドでコンテナを抜け、docker-compose.ymlがあるディレクトリまでcd ..で戻る。

4. docker-composeでイメージをbuildする

docker-compose build

5. docker-compose upでコンテナ起動

docker-compose up

6. アクセスしてみる

ブラウザから http://localhost/

にアクセスしてみてください。

確認ができたら一度サービスを抜けましょう。

  1. Ctrl+Cからサーバーを止めて
  2. exitコマンドでサーバーから脱出します。
docker-compose down -v

第三章:mysqlとdjangoを結びつける

7. djangoのコードをmysqlに接続するように書き換え

djangoのコードを書き換えます。

書き換える対象は:django_mysql/django/code/mysite/mysite/settings.pyで、既に存在する変数DATABASESを以下のように書き換えてください。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'db',
        'PORT': '3306',
    }
}

8. サービス起動

その後サービスを再度起動し

docker-compose up -d

9. マイグレーションを行い、データベースにdjangoのデータを登録

django側のコンテナに入ります。

docker-compose exec app bash

コンテナに入った後は以下のコマンドでマイグレーションを行い、ユーザーデータの作成などを行います。

python mysite/manage.py migrate
python mysite/manage.py createsuperuser

11. バックグランド起動

docker-compose up db -d

2秒後ぐらいに...

docker-compose up app -d