今回の作成したものへのGit
Docker
https://github.com/dsrice/base_docker/tree/step2
API
https://github.com/dsrice/base-django/tree/step1
はじめに
今回は、前回作った環境に新しくPythonで作るAPIサーバのコンテナと
フロントサイドをAngularで作るWebサーバのコンテナを
前回作成したdocker環境に追加していきます。
作業環境
・Windows10 Pro
・Docker Desktop on WIndows
作業Git
Dockerの設定関連
Webサーバ
APIサーバ
最初に書きましたが今回はPythonで作ります。
採用するフレームワークはDjangoです。
Djangoを採用する理由ですが、
言語はPythonと決めていたので採用がもっとも多いDjangoにしたというだけです。
細かいところはやりながら勉強します。
手順1 APIサーバのコンテナを用意する。
なにはともあれまずPythonをインストールしたコンテナを用意する必要があります。
docker-compose.ymlを以下の内容に編集します。
version: '3'
services:
base_db:
container_name: base_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: 'Asia/Tokyo'
command: --innodb-use-native-aio=0
volumes:
- ./cache/db/ :/var/lib/mysql
- 33306:3306
restart: always
- "8000:8000"
volumes:
- "./contents/server :/code"
depends_on:
- base_db
tty: true
environment:
- PMA_ARBITRARY=1
- PMA_USER=blog
- PMA_PASSWORD=blog
- 8080:80
さらに
APIコンテナのためにcontentsフォルダをにも新しく追加します。
追加後のフォルダ構成は以下のようになります。
┣ーーbase_docker
┃ ┣ーーcontents
┃ ┃ ┃ ┣ーーDockerfile
┃ ┃ ┃ ┗ーーrequirement.txt
┃ ┃ ┣ーーDockerfile
┃ ┃ ┗ーーconf.d
┃ ┃ ┗ーーmy.conf
┃ ┗ーーdocker-compose.yml
┃
┗ーーbase-django(追加しなくてもdocker起動時に追加されます)
contentsフォルダ内に配置するDockerfileは、以下の内容のものになります。
RUN mkdir /code
RUN apt-get update
WORKDIR /code
ADD requirement.txt /code/
RUN pip install -r requirement.txt
ADD . /code/
EXPOSE 8000
requirement.txtはコンテナをbuildするときにファイルの中にあるモジュールをpip installで取得するようになります。コンテナ内でpip installすることは可能ですが、コンテナが再起動するたびに初期化されます。開発をしているとコンテナの再起動をするケースとかは珍しくないのでbuildしたコンテナイメージはインストール済みにしてあることがおすすめです。 今回用意したrequirement.txtの内容は
になります。installするモジュールのVersion指定も可能です。今は指定する必要がないので最新版で動けばいいと思います。
手順2 djangoのアプリを用意する。
base_apiはホストOSとコンテナ間の共有ディレクトリになります。
このため、docker-compose upすることでディレクトリがない場合は作られます。
共有するディレクトリはdocker環境の外のディレクトになります。
このようにしている理由は、
dockerの環境だけをgit管理したかったです。
apiはapiだけでgit管理をしたく、混在しているとgit管理がしにくそうだったからです。
コンテナが起動していなかったら
「docker-compose up」してコンテナを起動してください。
必要なコマンド
になります。
このコマンドはコンテナに入るときに使用するコマンドになります。
base-
apiの部分を入りたいコンテナの名称に変更することで別のコンテナに入ることができます。
コンテナに入ったら
django-admin.py startproject baseapi
を実行してください。
実行すると
Djangoプロジェクトとしてbaseapiができます。
プロジェクト名に決まりはないですが、
ここではbaseapiがプロジェクト名としていろいろなものを書いていきます。
その点に注意していただけば問題ないです。
さらにアプリケーションも追加しておきます。
追加時は作成したプロジェクト内に移動してから実行する必要があります。
手順3 djangoのアプリを設定を変更する。
ホストOS側からdjangoプロジェクトの設定を変更します。
主な変更点は、
・RESTfull APIとするつもりなので設定を追加する。
・DBはデフォルトSQLiteなのでMysqlに変更する。
の2点です。
RESTful API対応
初期状態ではRESTful APIをするには設定が足りていないので追加します。
本来は、モジュールの追加installが必要なのですが、
すでにrequirement.txtに追記しているので今回は不要になります。
必要なものは
・djangorestframework
・django-filter
の2つになります。
設定を追加するところは
base-api/baseapi/setting.py
アプリケーションの追加も行っています。
INSTALLED_APPS = [
'django.contrib.contenttypes',
'rest_framework',(追加)
'v1',(追加)
]
先ほどのファイルにさらに追加を行います。
必要なモジュールはインストール済みです。
必要なものは
・mysqlclient
のみです。
base-api/baseapi/setting.py
DATABASES = {
'default': {
'NAME': 'blog',
'USER': 'blog',
'PASSWORD': 'blog',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
},
}
}
デフォルトでは、SQLiteへの接続設定が記載されています。
ここでは残していませんが、残したい方はコメントアウトでも可能です。
ポイントportの指定です。
docker-compose.yml内では、ポート転送の設定を入れています。
しかし、このポートはホストOSとMySQLコンテナ間の転送設定です。
MySQLコンテナとAPIコンテナ間はホストOSを経由するわけではないので
3306で通信できるようになります。
設定は以上です。
正常に接続できるか確認のため、APIコンテナに入ります。
入ったらmigrationを実行します。
ここまで来たらほぼ終了です。
今のままでもいいのですが、
サーバ起動のためにはコンテナ内に入る必要があります。
少々面倒だと思うので最後にdocker-compose.ymlに追記します。
version: '3'
services:
base_db:
container_name: base_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: 'Asia/Tokyo'
command: --innodb-use-native-aio=0
volumes:
- ./cache/db/ :/var/lib/mysql
- 33306:3306
restart: always
- "8000:8000"
command: sh -c "sleep 5; python baseapi/manage.py runserver 0.0.0.0:8000"(追加)
volumes:
- "./contents/server :/code"
depends_on:
- base_db
tty: true
environment:
- PMA_ARBITRARY=1
- PMA_USER=blog
- PMA_PASSWORD=blog
- 8080:80
APIコンテナに新しくcommandを追加しました。
これでコンテナ起動時にサーバ起動まで行うようになります。
migrationとかは起動時に行わずに、コンテナに入る想定です。
これは開発していくなかで面倒だったりしたら追記すればいいと思います。
コマンドにsleepがある理由ですが、docker-compose upしたときに
MySQLコンテナを先に起動するようにしてはありますが、
APIコンテナのコマンド実行が早すぎて起動に失敗するケースがあります。
なので実行を少し待つ必要があるのでこのようにしています。
追加したら
「docker-compose up」
(起動していたら一度「docker-compose down」で落としてください)
で立ち上げてください。