RaspberryPi3(ラズパイ)にDockerでPython+bottle+MySQL環境構築する!【簡単構築編】

  • 18
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

「優しいIT」という理念の基、ITコンサルタントをしている亀井亮介と申します!
現在、仕事では要求分析・要件定義を中心に上流工程をしていますが、主業務以外でプログラムも書いているので、技術的な記事を書きます!
優しいIT活動の一環として「教育用ようにプログラミング可能なPCを安価に提供する」理念の「Raspberry Pi 3(通称ラズパイ)」 で製作したモノ・サービス・プログラムを紹介します!

目的

ラズパイにDockerでPython-MySQL環境を構築します。
本当は、docker-composeで一発起動を目指したのですが、アプリケーションサーバ構築とSQL実行だけがうまくいきませんでした。まだまだインフラレベルが低いです。すいません。
とはいえ、多少なりともお役に立てると思います!
データベースに登録したデータは、ラズパイで検出した温度取得を想定しています。

前提

Raspberry PiにDockerとGitがインストールされている前提で、任意のフォルダで次のコマンドを順番に実行するとサンプルが構築できます。
DockerとGitのインストールは下記の記事をご覧ください。
RaspberryPi3(ラズパイ)にDockerとGitをインストール

とりあえず動かす

動いているものを見たい!という私のようなせっかちな方は、Raspberry Piの任意のフォルダで次の順番でコマンドを実行してください。

私は/home/pi/Workspaceフォルダで検証しました。

動いている様子

gitでクローンしファイルをダウンロード
$ git clone git@github.com:RyosukeKamei/rpi-python-bottle.git

※パスワードを求められたら、rsaキーを作成した時のパスワードを入力

クローンされたフォルダに移動
$ cd rpi-python-bottle
docker-composeでデータコンテナとデータベースコンテナをビルドし起動
$ docker-compose up -d

※私の環境で3分くらいでした。

イメージを確認
$ docker images
コンテナを確認
$ docker ps -a
データベースコンテナにログイン
$ docker exec -it rpi-python-bottle-db bash
サンプルのテーブルとデータを入力
# mysql -u bottle -pbottle measurement < /docker-entrypoint-initdb.d/create_table.sql

※SQLはサンプルのテーブルとデータを入力しています。

データーベースコンテナをログアウト
# (Contrl + p, Control + q)

※ exitを使うとコンテナも止めてしまいますので注意してください。

アプリケーションコンテナをビルド
$ docker build -t hypriot/rpi-python .

※私の環境で1時間くらいかかりました。のんびり待ちましょう

アプリケーションコンテナを起動しログイン
$ docker run --name rpi-python-bottle-app -it hypriot/rpi-python bash
サーバを起動
# /usr/local/bin/python3 /home/bottle/server.py

ブラウザで開くと、下記のように表示されます。
ブラウザで確認

では解説です!

目次

  1. 準備
  2. 一連のファイルをgitクローン
  3. docker-composeで起動
  4. データベースコンテナ(MySQL)にログインしデータを作成
  5. アプリケーションコンテナをビルド
  6. アプリケーションサーバの設定

1. 準備

Dockerや開発環境が揃っていない方は、下記を参照してください。
Dockerがインストールされていれば飛ばしてもOKです!

1-1. Dokcerをインストール

RaspberryPi3(ラズパイ)にDockerをインストールを参照してください!

1-2. 便利な機能(SSH・VNC・AFP)

Raspberry Pi 3インストール→無線LAN→日本語入出力→Macから操作(SSH・VNCサーバ・AFP)の下記章を実装すると便利です。

  1. SSHでアクセス
  2. VNC設定(MacからラズパイをGUIで操作)
  3. AFP設定(Macでラズパイのファイルシステムにアクセス)

2. 一連のファイルをgitクローン

gitクローン
pi@raspberrypi $ git clone git@github.com:RyosukeKamei/rpi-python-bottle.git
移動
pi@raspberrypi $ cd rpi-python-bottle

3. docker-composeでデータベースとデータコンテナを起動

3-1. docker-composeで起動

docker-composeで起動
pi@raspberrypi $ docker-compose up -d

3-2. docker-compose.yml

参考までにdocker-compose.ymlを記載しておきます。

docker-compose.yml
data:
  container_name: rpi-python-bottle-data
  image: hypriot/armhf-busybox
  stdin_open: true
  tty: false
  volumes:
    - ./docker/mysql:/etc/mysql/conf.d:ro
    - ./app:/home/bottle
  command: /bin/sh

mysql:
  container_name: rpi-python-bottle-db
  image: hypriot/rpi-mysql
  volumes:
   - ./initdb.d:/docker-entrypoint-initdb.d
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_USER: bottle
    MYSQL_PASSWORD: bottle
    MYSQL_DATABASE: measurement
  ports:
    - "3306:3306"
  volumes_from:
    - data

4. データベースコンテナ(MySQL)にログインしデータを作成

docker-compose.ymlのvolumes: で
./initdb.d:/docker-entrypoint-initdb.d
と設定すると、ローカルにおいた"initdb.d"フォルダ直下のファイルが、コンテナ上の"/docker-entrypoint-initdb.d"フォルダ以下に置かれ、SQLが記載したファイルを自動的に実行してくれるはずですが、機能していないらしいです…
仕方がないので、手動でデータを作成します。

4-1. 手順

データベースサーバにログイン
pi@raspberrypi $ docker exec -it rpi-python-bottle-db bash
SQLを書いたファイルを実行
root@{コンテナID}:/# mysql -u bottle -pbottle measurement < /docker-entrypoint-initdb.d/create_table.sql

注意
-pの後はスペースを入れないでください。
MySQLのユーザ名、パスワード、データベース名はdocker-compose.ymlで設定しています。仮のものなので、セキュリティ上変更してください。

データベースのコンテナを抜ける
root@{コンテナID}:/# (Contrl + p, Control + q)

4-2. SQL

参考までにSQLを載せておきます。

/docker-entrypoint-initdb.d/create_table.sql
mysql>
CREATE TABLE `temperatures` (
  `id`           int(11) NOT NULL AUTO_INCREMENT,
  `server_id`    int(11) NOT NULL,
  `temperature`  int(11) NOT NULL,
  `careted_at`   datetime NOT NULL,
  `careted_user` int(11) NOT NULL,
  `updated_at`   datetime NOT NULL,
  `updated_user` int(11) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
データをインサート
mysql>
INSERT INTO `temperatures` 
  (`id`, `server_id`, `temperature`, `careted_at`, `careted_user`, `updated_at`, `updated_user`) 
  VALUES 
  (1, 1, 29, NOW(), 1, NOW(), 1);

5. アプリケーションコンテナをビルド

詳細は別の記事で解説します。

5-1. Dockerfileからアプリケーションコンテナをビルド

アプリケーションコンテナをビルド
pi@raspberrypi $ docker build -t hypriot/rpi-python .

5-2. インストールしたもの

下記をapt-getでインストールしました。
- vim
- sudo
- wget
- git
- Python3をインストールするためのライブラリ
- Python3
- pip3

pip3でインストールするPythonライブラリ
- virtualenv
- bottle
- ipython
- flake8
- mysql-connector-python(Python3のMySQLドライバ)

後は、ユーザを作成したり、Python向けにvimの設定をしています。

6. アプリケーションサーバの設定

本来であれば、アプリケーションサーバも起動して欲しいのですが、こちらは起動していませんでした。

6-1. server.pyを確認

server.pyは"/home/bottle"にローカルからコピーされます。

アプリケーションサーバに起動してログイン
pi@raspberrypi: $ docker run --name rpi-python-bottle-app -it hypriot/rpi-python bash
ログインした場所を確認
# pwd
/home/bottle

6-2. アプリケーションを起動

アプリケーション起動
# /usr/local/bin/python3 /home/bottle/server.py

6-3. ブラウザで確認

ブラウザで開くと、下記のように表示されます。
ブラウザで確認

6-4. プラグラム server.py

参考までにプログラムを記載します。

server.pyを確認(もし、不具合があればこのファイルを修正します。)
# vim server.py
server.py
# bottleのライブラリ
from bottle import route, run, request

# MySQLドライバはmysql.connector
import mysql.connector

# 補足
# 本当はテンプレートを入れるとHTMLが綺麗になります。
# その辺は後日…

# hostのIPアドレスは、$ docker inspect {データベースのコンテナ名}で調べる
# MySQLのユーザやパスワード、データベースはdocker-compose.ymlで設定したもの
# user     : MYSQL_USER
# password : MYSQL_PASSWORD
# database : MYSQL_DATABASE
connector = mysql.connector.connect (
            user     = 'bottle',
            password = 'bottle',
            host     = '172.17.0.3',
            database = 'measurement'
)



@route('/list')
def list():
    # 温度を表示
    cursor = connector.cursor()
    cursor.execute("select `id`, `temperature`, `careted_at` from temperatures")

    disp  = "<table>"
    # ヘッダー
    disp += "<tr><th>ID</th><th>温度</th><th>登録日</th></tr>"

    # 一覧部分
    for row in cursor.fetchall():
        disp += "<tr><td>" + str(row[0]) + "</td><td>" + str(row[1]) + "</td><td>" + str(row[2]) + "</td></tr>"

    disp += "</table>"

    cursor.close

    return "DBから取得 "+disp

@route('/input_temperature')
def input_temperature():
    # 温度を入力
    cursor = connector.cursor()
    cursor.execute("INSERT INTO `temperatures` (`server_id`, `temperature`, `careted_at`, `careted_user`, `updated_at`, `updated_user`) VALUES (" + request.query.server_id + ", " + request.query.temperature + ", NOW(), " + request.query.user_id + ", NOW(), " + request.query.user_id + ")")

    # コミット
    connector.commit();

    cursor.close

    return "OK"


# コネクターをクローズ
connector.close

# サーバ起動
run(host='0.0.0.0', port=8080, debug=True, reloader=True)

6-5. 表示されない場合

順番を変えたり、環境によっては、アプリケーションサーバやデータベースサーバのIPアドレスが異なる場合があります。コンテナを抜けて、ラズパイに戻り、IPアドレスを確認します。
bash:IPアドレス確認
$ docker inspect {コンテナ名かコンテナID}

IPアドレスがあるはずですので、その通りにブラウザからアクセスしてください!
データベースエラーが出たら、server.pyのデータベースのIPアドレスを変更してください!

データがない場合は、MySQLエラーが、コンテナに表示されているはずです。
4. データベースコンテナ(MySQL)にログインしデータを作成
をもう一度みてください!

最後に

docker-compose 一発でとはいきませんでしたが…
ラズパイにDocker+Python+bottle+MySQL環境は構築できるようです!

サイトマップ

Raspberry Pi 3 (ラズパイ)セットアップ

Raspberry Pi 3インストール→無線LAN→日本語入出力→Macから操作

Raspberry Pi 3 にDockerを乗せてPython+MySQL環境を構築!

RaspberryPi3(ラズパイ)にDockerをインストール
RaspberryPi3(ラズパイ)にDockerでPython+bottle+MySQL環境構築する!【簡単構築編】
RaspberryPi3(ラズパイ)にDockerでPython+bottle+MySQL環境構築する!【試行錯誤編】

Raspberry Pi 3でエアコン一体型パソコン「airpi」を作る!

Raspberry Pi 3でエアコン一体型パソコン「airpi」を作る!

ついに…Raspberry Pi 3でpythonを使いラジコンを作る!

ボタン押している間モーターが動く
磁石を近づけている間モータが動く
磁石を近づけるとモータが動き、自動で止まる

Raspberry Pi 3 (ラズパイ)とpythonで遊ぼう ラズパイ奮闘の記録

Raspberry Pi 3でプログラミングをする Node-REDと普通にプログラミング
Raspberry Pi 3でpythonを使いLEDを光らせる(Hello World)
Raspberry Pi 3でスイッチの状態を検出する
Raspberry Pi 3でpythonを使いサーボモータを動かす
Raspberry Pi 3でpythonを使いモータードライバーを使いモータを制御する!
Raspberry Pi 3でpythonを使いスライドスイッチを検出する!
Raspberry Pi 3でpythonを使い磁石スイッチを検出する!
Raspberry Pi 3でpythonを使い温度を検出する!
Raspberry Pi 3でpythonを使いブザーを鳴らす!
Raspberry Pi 3でpythonを使いA/Dコンバーターでアナログ信号を検出する!
Raspberry Pi 3でpythonを使い「明るさ」を検出する!
Raspberry Pi 3でpythonを使い「温度(A/Dコンバーターを利用)」を検出する!
Raspberry Pi 3でpythonを使い「7セグメントLED」に出力する!
Raspberry Pi 3でpythonを使いスイッチ制御でLEDを光らせる!
Raspberry Pi 3でpythonを使い暗くなったらLEDを光らせる!

テスト駆動開発を重点においた規則

コーディング規則「優しいコードを書こう」(FuelPHP)
命名規則「3ヶ月後の自分自身に優しく、チームに優しく、まだ見ぬメンバーに優しく」

Docker+PythonでWebアプリケーション開発

Docker上のCentOSにPython3と、関連ライブラリpip, virtualenvとフレームワークDjango, bottle, Flaskのインストール!これらをまとめたDockerfile付き!

開発しやすい環境構築(Docker+PHP)

Dockerを利用しApacheにPHP環境 + Eclipseを連携
Dockerを利用したFuelPHP開発環境構築
Docker利用したFuelPHP開発環境の初期設定とscaffoldを利用してCRUDスケルトン作成
FuelPHPのデータベースマイグレーション