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

More than 1 year has passed since last update.

はじめに

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

目的

ラズパイにDockerでPython-MySQL環境を構築します。
ラズパイはアーキテクチャが、大きく異なるためイメージが少なく苦戦しました。
まずは、試行錯誤の過程を記録します。
うまくいったら、簡単構築編を記載します!

アーキテクチャの違い

ラズパイはarmv7lアーキテクチャベースなので、Dockerもarmv7lアーキテクチャベースのイメージを使う必要がありますが、少ないのが現状です。

ラズパイのイメージを探す時

ラズパイで使えるイメージは"rpi-"が付いているので、探す時に参考にしてください

目次

  1. 準備
  2. hypriot/rpi-python を立ち上げる
  3. Python3インストールに必要なライブラリなどをインストール
  4. Python3をインストール
  5. pip3をインストール
  6. Python開発に必要なツールをインストール
  7. bottleをインストールする準備
  8. サーバが動作しているかを確認
  9. MySQLドライバーをインストール
  10. データベースにデータを作成
  11. アプリケーションサーバにスクリプトを置く
  12. アプリケーションを起動

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. hypriot/rpi-python を立ち上げる

hypriotと名乗る海賊(笑)が、ラズパイ向けのイメージを提供しているので、ありがたく使います。

hypriot/rpi-pythonを起動し、bashでログイン
sudo docker run -it hypriot/rpi-python /bin/bash

…と思ったら、このイメージはPython2.7系なのね…(2016年9月4日現在)
Python3系にしたいので、インストールします。

3. Python3インストールに必要なライブラリなどをインストール

いつものおまじない(ライブラリの更新とアップデート)
# apt-get update
# apt-get upgrade -y
必要そうなライブラリをインストールしてみる
# apt-get install -y vim
# apt-get install -y sudo
# apt-get install -y wget
# apt-get install -y git

4. Python3をインストール

4-1. Python3インストールに必要なライブラリをインストールします。

Python3インストールに必要なライブラリをインストール
# apt-get install -y build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libbz2-dev libreadline-dev

4-2. Python3をインストール

Python3はソースからコンパイルします。
(Python3インストール絡みで、makeとmake installを10年振りに触ったりしています)

Python3のソースをダウンロード
# wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

圧縮されているPython-3.5.2.tgzをtarで展開します。

Python-3.5.2.tgzを展開
# tar xvf Python-3.5.2.tgz 

移動します。

移動
# cd Python-3.5.2

makeでインストールします。
(時間がかかります)

makeでインストール
# ./configure && make && make install

インストールが終わったら確認します。

Python3インストールを確認
# python3 -V

5. pip3をインストール

pip3をインストール
# apt-get install -y python3-pip
pip3をバージョンアップ
# pip3 install --upgrade pip
pip3インストールを確認
# pip3 -V

6. Python開発に必要なツールをインストール

詳細を知りたい方はグーグル先生に聞いてください。

仮装開発環境構築virtualenv
# pip3 install virtualenv
軽量フレームワークbottle
# pip3 install bottle
Pythonのインタラクティブモード拡張ipython
# pip3 install ipython
コーディングスタイル/シンタックスのチェックflake8
# pip3 install flake8

7. ユーザを作成

グループとユーザを作成
# groupadd web
# useradd -d /home/bottle -m bottle
作ったユーザでログイン
# su -m bottle
$ 

問題なし!

8. サーバが動作しているかを確認

vimでindex.htmlを作成(ユーザはbottle)
$ vim index.html
index.html
<html>
<body>
はろーわーるど
</body>
</html>
シンプルHTTPで起動
$ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 ...

ブラウザでアクセス
ラズパイとDocker.png

9. MySQLドライバーをインストール

git cloneでmysql-connector-pythonをダウンロード

gitクローン
# git clone https://github.com/mysql/mysql-connector-python.git
移動
# cd mysql-connector-python
ビルドしてインストール
# python3 ./setup.py build
# python3 ./setup.py install

10. データベースにデータを作成

一旦、アプリケーションサーバを抜けます。
Control + P, Control + Qと入力します。

データベースサーバにログインします。
すでに起動していれば次のコマンドでログインします。

データベースサーバにログイン
pi@raspberrypi $ sudo docker exec -it {データベースサーバのコンテナ名}
MySQLにログイン
mysql_server # mysql -u{ユーザ名} -p
(パスワードを入力)
データベースにアクセス(すでにある前提)
mysql> use sample;
テーブルを作成
mysql>
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
データをインサート
mysql>
INSERT INTO `users` (`id`, `name`) VALUES (1, 'pyhons');
MySQLを抜ける
mysql> quit;
データベースのコンテナを抜ける
mysql_server # (Contrl + p, Control + q)

11. アプリケーションサーバにスクリプトを置く

アプリケーションサーバにログイン
pi@raspberrypi $ sudo docker exec -it {アプリケーションサーバのコンテナ名}
適当な場所に移動
# cd /home/bottle
server.pyを作成
# vim server.py
server.py
from bottle import route, run
# MySQLドライバはmysql.connector
import mysql.connector
# hostのIPアドレスは、$ docker inspect {データベースのコンテナ名}で調べる
# MySQLのユーザやパスワード、データベースはdocker-compose.ymlで設定したもの
connector = mysql.connector.connect(
            user='python',
            password='python',
            host='178.10.0.3', # データベースサーバのIPアドレス
            database='sample'  # 作成したデータベース
)

cursor = connector.cursor()
cursor.execute("select * from users")

disp = ""
for row in cursor.fetchall():
    disp = "ID:" + str(row[0]) + "  名前:" + row[1]

cursor.close
connector.close

@route('/hello')
def hello():

    return "DBから取得 "+disp

run(host='0.0.0.0', port=8080, debug=True, reloader=True)

12. アプリケーションを起動

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

ブラウザで開くと
スクリーンショット 2016-09-04 14.18.55.png

次の記事では、Dockerfileとdokcer-compose.ymlで一発で起動を目論みます。
(でっきるかな?でっきるかな?)

サイトマップ

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のデータベースマイグレーション