Dockerを使ってReact+Flask+MariaDBの環境を構築する(第ニ回)

web

DockerをつかってReact+Flask+MariaDBの環境をつくります。

今回は第二回目になります。

環境構築の手順の流れは大きく分けて以下のとおりです。

  • 1.React環境構築
  • 2.Flask環境構築
  • 3.MariaDB環境構築
  • 4.Flask-MariaDB接続
  • 5.React-Flask接続

第二回では「4.Flask-MariaDB接続」、「5.React-Flask接続」の手順について紹介します。

前回の内容は以下を参照してください。

Dockerを使ってReact+Flask+MariaDBの環境を構築する(第一回)

Flask-MariaDB接続

Flask-MariaDB接続設定を行います。

設定の手順は以下のとおりです。

  • 1.MariaDBのディレクトリ再作成
  • 2.MariaDBのDockerfile作成
  • 3.init.sqlの作成
  • 4.MariaDBのdocker-compse.yml更新
  • 5.FlaskのDockerfile更新
  • 6.Flaskのapp.py更新
  • 7.Flaskのdocker-compse.yml更新
  • 8.docker-compse起動

MariaDBのディレクトリ再作成

MariaDBのディレクトリを再作成します。

再作成前にdocker-composeを停止します。

    
docker-compose down
    
  

docker-composeを停止したあと、「database」ディレクトリを削除します。

「project」の配下に「db」のディレクトリを作成します。

「db」の配下に「init」「dabatbase」のディレクトリを作成します。

以下のファイル構成になっていれば大丈夫です。

    
project/
  api/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ app.py
  db/
 ┃ ┣ init/
 ┃ ┗ database/
  web/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ react-project/
  docker-compose.yml
    
  

MariaDBのDockerfile作成

MariaDBはDockerfileを使用せずに使っていましたが、今回はDockerfileを使用します。

このDockerfileの中ででMariaDBが起動時に初期データを登録できるようにinitファイルをコピーしておきます。

「db」の配下に「Dockerfile」のファイルを作成します。

    
project/
  api/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ app.py
  db/
 ┃ ┣ Dockerfile
 ┃ ┣ init/
 ┃ ┗ database/
  web/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ react-project/
  docker-compose.yml
    
  

Dockerfileの内容は以下のとおりです。

  1. FROM mariadb
  2. COPY ./init/init.sql /docker-entrypoint-initdb.d/

後述するinit.sqlに初期データベースの作成、テーブルの作成、データの作成を行うSQLを記載します。

COPYコマンドで /docker-entrypoint-initdb.d/にinit.sqlファイルに配置します。

コンテナ起動時にinit.sqlのファイルがよみこまれてSQLが実行されます。

これにより、Databaseやテーブルが起動時に作成されます。

init.sqlの作成

init.sqlを作成します。

「db/init/」の配下に「init.sql」のファイルを作成します。

    
project/
  api/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ app.py
  db/
 ┃ ┣ Dockerfile
 ┃ ┣ init/
 ┃ ┃ ┗ init.sql
 ┃ ┗ database/
  web/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ react-project/
  docker-compose.yml
    
  
  1. CREATE DATABASE IF NOT EXISTS test;
  2. CREATE TABLE IF NOT EXISTS test.user (id int, name varchar(10));
  3. REPLACE INTO test.user VALUES (1, 'TAROU');

testのデーターベースにuserのテーブルを作成します。また、1件データを登録しておきます。

MariaDBのdocker-compse.yml更新

MariaDBのdocker-compse.ymlの内容を更新します。

  1. version: '3'
  2. services:
  3. web:
  4. build: ./web
  5. volumes:
  6. - ./web/src:/usr/src
  7. command: sh -c "cd react-project && yarn start"
  8. ports:
  9. - "3000:3000"
  10. flask:
  11. build: api/
  12. volumes:
  13. - ./api/src:/usr/src
  14. command: flask run --host 0.0.0.0 --port 5000
  15. ports:
  16. - "5000:5000"
  17. db:
  18. container_name: db
  19. build: ./db
  20. volumes:
  21. - ./db/database:/var/lib/mysql
  22. environment:
  23. - MYSQL_ROOT_PASSWORD=test
  24. - MYSQL_DATABASE=test
  25. - MYSQL_USER=test
  26. - MYSQL_PASSWORD=test
  27. ports:
  28. - "3306:3306"

「container_name: db」を追加しました。

FlaskがDBを参照する際にコンテナ名を使います。明示的にdbと記載します。

「build: ./db」とDockerfileを参照するように変更しています。

ここまでで、MariaDBの設定は完了です。

FlaskのDockerfile更新

FlaskのDockerfileの内容を更新します。

DBと接続するためのライブラリをインストールします。

PyMySQLを使用します。

pip installの記述をします。

  1. FROM python:3.10-alpine
  2. RUN pip install flask
  3. RUN pip install flask-cors
  4. RUN pip install PyMySQL
  5. WORKDIR /usr/src
メモ
  • requirements.txtをつかった書き方もありますが、ここでは紹介しません。

Flaskのapp.py更新

Flaskのapp.pyファイルを更新します

    
import os

from flask import Flask, request
from flask_cors import CORS

import pymysql.cursors

app = Flask(__name__)
CORS(app) 

@app.route("/", methods=["GET"])
def test():  
    return "Hello World"


@app.route('/mariadb')
def mariadb():
    conn = pymysql.connect(
        host='db',
        port=3306,
        user=os.environ.get('MYSQL_USER'),
        password=os.environ.get('MYSQL_PASSWORD'),
        db=os.environ.get('MYSQL_DATABASE'),
        cursorclass=pymysql.cursors.DictCursor
    )

    with conn.cursor() as cur:
        sql = "SELECT * FROM user"
        cur.execute(sql)
        results = cur.fetchall()

    return results[0]

    
  

「/mariadb」のURLを指定した時にSELECT文を発行してデータを取得し、その内容を返却するようにしました。

Flaskのdocker-compse.yml更新

Flaskのdocker-compse.ymlの内容を更新します。

    
version: '3'

services:
  web:
    build: ./web
    volumes:
      - ./web/src:/usr/src
    command: sh -c "cd react-project && yarn start"
    ports:
      - "3000:3000"

  flask:
    container_name: api
    build: api/
    volumes:
      - ./api/src:/usr/src
    command: flask run --host 0.0.0.0 --port 5000
    ports:
      - "5000:5000"
    environment:
      - MYSQL_ROOT_PASSWORD=test
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
    depends_on:
      - db

  db:
    container_name: db
    build: ./db
    volumes:
      - ./db/database:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=test
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
    ports:
      - "3306:3306"

    
  

「container_name: api」を追加しました。

MaruaDBと同様にコンテナ名を使います。明示的にapiと記載します。

「environment」でDB接続に関する環境変数を追加しています。

docker-compse起動

docker-compose upを使って各コンテナを起動します。

docker-compose.ymlファイルがある場所で以下のコマンドを実行します。

  1. docker-compose up

起動したら以下のURLをブラウザに入力します。

http://localhost:5000

"Hello World"が表示されます。

次に、FlaskとMariaDBの接続を確認します。

http://localhost:5000/mariadb

「{"id":1,"name":"TAROU"}」が表示されたら成功です。

注意
  • 各コンポーネントの起動には時間がかかります。少し時間をおいてからブラウザのアクセスを確認してください。

ここまでが、FlaskとMariaDBの接続設定になります。

React-Flask接続

React-Flask接続の設定を行います。

設定の手順は以下のとおりです。

  • 1.axiosインストール
  • 2.Reactのapp.js更新
  • 3.Reactのdocker-compse.yml更新
  • 4.docker-compse起動

axiosインストール

axiosをインストール。

インストール前にdocker-composeを停止します。

    
docker-compose down
    
  

インストールを行います。cd コマンドでnode.jsで作成したアプリのディレクトリに移動します。そのあとnpmインストールを使ってパッケージをインストールします。

    
docker-compose run --rm web sh -c "cd react-project && npm install axios" 
    
  

Reactのapp.js更新

Reactのapp.jsの内容を更新します。

更新するファイルは以下のファイルです。

    
project/
  web/
    Dockerfile
    src/
      react-project/
        src/
         app.js
    
  

下記のように書き換えます。

  1. import {useState, useEffect} from 'react'
  2. import axios from 'axios'
  3. function App() {
  4. const [getData, setGetData] = useState([])
  5. useEffect(() => {
  6. axios.get('http://localhost:5000/mariadb')
  7. .then(res => {
  8. console.log(res.data)
  9. setGetData(res.data)
  10. })
  11. }, [])
  12. return (
  13. {getData.name}
  14. );
  15. }
  16. export default App;

Reactのdocker-compse.yml更新

Ractのdocker-compse.ymlの内容を更新します。

  1. version: '3'
  2. services:
  3. web:
  4. container_name: web
  5. build: ./web
  6. volumes:
  7. - ./web/src:/usr/src
  8. command: sh -c "cd react-project && yarn start"
  9. ports:
  10. - "3000:3000"
  11. flask:
  12. container_name: api
  13. build: api/
  14. volumes:
  15. - ./api/src:/usr/src
  16. command: flask run --host 0.0.0.0 --port 5000
  17. ports:
  18. - "5000:5000"
  19. environment:
  20. - MYSQL_ROOT_PASSWORD=test
  21. - MYSQL_DATABASE=test
  22. - MYSQL_USER=test
  23. - MYSQL_PASSWORD=test
  24. depends_on:
  25. - db
  26. db:
  27. container_name: db
  28. build: ./db
  29. volumes:
  30. - ./db/database:/var/lib/mysql
  31. environment:
  32. - MYSQL_ROOT_PASSWORD=test
  33. - MYSQL_DATABASE=test
  34. - MYSQL_USER=test
  35. - MYSQL_PASSWORD=test
  36. ports:
  37. - "3306:3306"

「container_name: web」を追加します。

docker-compse起動

docker-compose upを使って各コンテナを起動します。

docker-compose.ymlファイルがある場所で以下のコマンドを実行します。

  1. docker-compose up

起動したら以下のURLをブラウザに入力します。

http://localhost:3000

"TAROU"が表示されます。

メモ
  • ここでも各コンポーネントの起動には時間がかかります。docker-compose restart webなど特定のコンポーネントのみを再起動できる方法もあります。

まとめ

今回は「4.Flask-MariaDB接続」、「5.React-Flask接続」の手順を紹介したことで「Dockerを使ってReact+Flask+MariaDBの環境を構築する」手順の紹介は終わりです。

今後はこの環境を使ってアプリをつくっていきたいと思います。

コメント

0 件のコメント:

コメントを投稿

コメントをお待ちしています。