はじめに
「優しい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 clone git@github.com:RyosukeKamei/rpi-python-bottle.git
※パスワードを求められたら、rsaキーを作成した時のパスワードを入力
$ cd rpi-python-bottle
$ 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
では解説です!
目次
- 準備
- 一連のファイルをgitクローン
- docker-composeで起動
- データベースコンテナ(MySQL)にログインしデータを作成
- アプリケーションコンテナをビルド
- アプリケーションサーバの設定
1. 準備
Dockerや開発環境が揃っていない方は、下記を参照してください。
Dockerがインストールされていれば飛ばしてもOKです!
1-1. Dockerをインストール
RaspberryPi3(ラズパイ)にDockerをインストールを参照してください!
1-2. 便利な機能(SSH・VNC・AFP)
Raspberry Pi 3インストール→無線LAN→日本語入出力→Macから操作(SSH・VNCサーバ・AFP)の下記章を実装すると便利です。
- SSHでアクセス
- VNC設定(MacからラズパイをGUIで操作)
- AFP設定(Macでラズパイのファイルシステムにアクセス)
2. 一連のファイルを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で起動
pi@raspberrypi $ docker-compose up -d
3-2. 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
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を載せておきます。
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
参考までにプログラムを記載します。
# vim 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+PHP)
Dockerを利用しApacheにPHP環境 + Eclipseを連携
Dockerを利用したFuelPHP開発環境構築
Docker利用したFuelPHP開発環境の初期設定とscaffoldを利用してCRUDスケルトン作成
FuelPHPのデータベースマイグレーション