開発環境を作る parat2

 

今回の作成したものへの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サーバ

 

APIサーバの用意

最初に書きましたが今回はPythonで作ります。

採用するフレームワークDjangoです。

Djangoを採用する理由ですが、

 言語はPythonと決めていたので採用がもっとも多いDjangoにしたというだけです。

細かいところはやりながら勉強します。

 

手順1 APIサーバのコンテナを用意する。

なにはともあれまずPythonをインストールしたコンテナを用意する必要があります。

docker-compose.ymlを以下の内容に編集します。

version'3'

services:
  base_db:
    build./contents/mysql
    container_namebase_mysql
    restartalways
    environment:
      MYSQL_ROOT_PASSWORDroot
      MYSQL_DATABASEblog
      MYSQL_USERblog
      MYSQL_PASSWORDblog
      TZ'Asia/Tokyo'
    command--innodb-use-native-aio=0
    volumes:
      - ./cache/db/ :/var/lib/mysql
      - ./contents/mysql/conf.d :/etc/mysql/conf.d/
      - ./log/mysql :/var/log/mysql
    ports:
      - 33306:3306
    
  api:
    build./contents/api
    container_namebase-api
    restartalways
    ports:
      - "8000:8000"
    volumes:
      - "../base-django :/base-api"
      - "./contents/server :/code" 
    depends_on:
      - base_db
    ttytrue
        
  phpMyAdmin
    container_namebase_phpmyadmin
    imagephpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=base_mysql
      - PMA_USER=blog
      - PMA_PASSWORD=blog
    ports:
      - 8080:80
 
さらにAPIコンテナのためにcontentsフォルダをにも新しく追加します。
追加後のフォルダ構成は以下のようになります。
 
  ┣ーーbase_docker
  ┃  ┣ーーcontents
  ┃  ┣ーーapi(このフォルダとその配下追加)
  ┃       ┃     ┃  ┣ーーDockerfile
  ┃       ┃     ┃  ┗ーーrequirement.txt
  ┃  ┃  ┗ーーmysql
  ┃  ┃     ┣ーー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/
WORKDIR /base-api

EXPOSE 8000
 requirement.txtはコンテナをbuildするときにファイルの中にあるモジュールをpip installで取得するようになります。コンテナ内でpip installすることは可能ですが、コンテナが再起動するたびに初期化されます。開発をしているとコンテナの再起動をするケースとかは珍しくないのでbuildしたコンテナイメージはインストール済みにしてあることがおすすめです。 今回用意したrequirement.txtの内容は
Django
psycopg2
djangorestframework
django-filter
mysqlclient
 になります。installするモジュールのVersion指定も可能です。今は指定する必要がないので最新版で動けばいいと思います。 

手順2 djangoのアプリを用意する。 

base_apiはホストOSとコンテナ間の共有ディレクトリになります。

このため、docker-compose upすることでディレクトリがない場合は作られます。

共有するディレクトリはdocker環境の外のディレクトになります。

このようにしている理由は、

dockerの環境だけをgit管理したかったです。

apiapiだけでgit管理をしたく、混在しているとgit管理がしにくそうだったからです。

 
コンテナが起動していなかったら
「docker-compose up」してコンテナを起動してください。
 
 
base-apiコンテナの中に入ります。
新しくコマンドプロンプトを立ち上げてください。
必要なコマンド

 

docker exec -it base-api /bin/bash

 

になります。
このコマンドはコンテナに入るときに使用するコマンドになります。
base-apiの部分を入りたいコンテナの名称に変更することで別のコンテナに入ることができます。
 
コンテナに入ったら

 

django-admin.py startproject baseapi
 を実行してください。
実行するとDjangoプロジェクトとしてbaseapiができます。
プロジェクト名に決まりはないですが、
ここではbaseapiがプロジェクト名としていろいろなものを書いていきます。
その点に注意していただけば問題ないです。
さらにアプリケーションも追加しておきます。
追加時は作成したプロジェクト内に移動してから実行する必要があります。
cd baseapi
python manage.py startapp v1
 

手順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.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',(追加)
    'v1',(追加)
]

 

MySQL対応

先ほどのファイルにさらに追加を行います。

必要なモジュールはインストール済みです。

必要なものは

 ・mysqlclient

のみです。

 

base-api/baseapi/setting.py

DATABASES = {
  'default': {
    'ENGINE''django.db.backends.mysql',
    'NAME''blog',
    'USER''blog',
    'PASSWORD''blog'
    'HOST''base_mysql',
    'PORT''3306',
    'OPTIONS': {
        'charset''utf8mb4',
    },
  }
}

デフォルトでは、SQLiteへの接続設定が記載されています。

ここでは残していませんが、残したい方はコメントアウトでも可能です。

ポイントportの指定です。

docker-compose.yml内では、ポート転送の設定を入れています。

しかし、このポートはホストOSとMySQLコンテナ間の転送設定です。

MySQLコンテナとAPIコンテナ間はホストOSを経由するわけではないので

3306で通信できるようになります。

 

設定は以上です。

正常に接続できるか確認のため、APIコンテナに入ります。

入ったらmigrationを実行します。

docker exec -it base-api /bin/bash

cd baseapi

python mange.py migrate

MySQLコンテナとの通信が問題がなければDjangoが用意する

初期テーブルが作成されます。

 

テーブルが作成されたらサーバを起動させてみましょう。

python mange.py runserver 0.0.0.0:8000

 

ホストOSのブラウザから

http://localhost:8000」でアクセスしてください。

問題がなければ、下の画面が表示されます。

f:id:ds_ricekun:20200429224753p:plain

 ここまで来たらほぼ終了です。
 
今のままでもいいのですが、
サーバ起動のためにはコンテナ内に入る必要があります。
少々面倒だと思うので最後にdocker-compose.ymlに追記します。
version'3'

services:
  base_db:
    build./contents/mysql
    container_namebase_mysql
    restartalways
    environment:
      MYSQL_ROOT_PASSWORDroot
      MYSQL_DATABASEblog
      MYSQL_USERblog
      MYSQL_PASSWORDblog
      TZ'Asia/Tokyo'
    command--innodb-use-native-aio=0
    volumes:
      - ./cache/db/ :/var/lib/mysql
      - ./contents/mysql/conf.d :/etc/mysql/conf.d/
      - ./log/mysql :/var/log/mysql
    ports:
      - 33306:3306
    
  api:
    build./contents/api
    container_namebase-api
    restartalways
    ports:
      - "8000:8000"
    commandsh -c "sleep 5; python baseapi/manage.py runserver 0.0.0.0:8000"(追加)
    volumes:
      - "../base-django :/base-api"
      - "./contents/server :/code" 
    depends_on:
      - base_db
    ttytrue
        
  phpMyAdmin
    container_namebase_phpmyadmin
    imagephpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=base_mysql
      - PMA_USER=blog
      - PMA_PASSWORD=blog
    ports:
      - 8080:80
APIコンテナに新しくcommandを追加しました。
これでコンテナ起動時にサーバ起動まで行うようになります。
migrationとかは起動時に行わずに、コンテナに入る想定です。
これは開発していくなかで面倒だったりしたら追記すればいいと思います。
コマンドにsleepがある理由ですが、docker-compose upしたときにMySQLコンテナを先に起動するようにしてはありますが、
APIコンテナのコマンド実行が早すぎて起動に失敗するケースがあります。
なので実行を少し待つ必要があるのでこのようにしています。
 
追加したら
「docker-compose up」
(起動していたら一度「docker-compose down」で落としてください)
で立ち上げてください。
 

ホストOSのブラウザから

http://localhost:8000」でアクセスして先ほどの画面が見れれば終了です。

 

今日は長くなったのでここまでにします。