Je m'appelle Ryosuke Kamei et je suis consultant en informatique basé sur l'idée du "doux IT"! Mon travail principal va du processus en amont d'analyse et de définition des exigences à la gestion du développement, mais je développe un système Web en privé! Présentation des programmes de biens et services créés avec «Raspberry Pi 3» (communément appelé «Raspberry Pi»), qui a pour philosophie de «fournir des PC bon marché pouvant être programmés pour l'éducation» dans le cadre d'activités informatiques conviviales!
Cette fois, je vais vous présenter un exemple d'utilisation de Docker qui a postulé pour Razpai Contest 2016! Ceci est un échantillon qui mesure automatiquement la température toutes les minutes, l'enregistre dans la base de données (MySQL) sur Docker, et vous permet de parcourir la température avec un navigateur!
Le fichier est posté sur Github, donc si vous êtes intéressé, veuillez l'utiliser!
Pour ceux qui aiment la tarte aux râpes "Je suis doué pour le travail électronique, mais je ne sais pas quand il sera publié en ligne ..." Je pense qu'il y a beaucoup de gens qui disent cela.
Il est possible de construire un serveur Web sur Raspai, mais installer un serveur d'application, un serveur de base de données, etc. est gênant, ennuyeux, et même si j'essaye, cela ne fonctionne pas ... La construction du serveur Web est-elle considérée comme un seuil élevé?
Afin de rendre la création d'un serveur Web aussi simple que possible pour quiconque, nous allons présenter un exemple de création d'un serveur Web avec moins d'effort en utilisant la technologie de conteneur Docker!
Comme le système d'exploitation de Raspai est un système d'exploitation basé sur Linux «Raspbian», vous pouvez installer Apache sur le serveur Web et MySQL sur le serveur de base de données, mais il existe également les problèmes suivants.
Je ne sais pas ce qui a causé le problème. Lors d'un travail électronique, il est difficile d'isoler le problème lorsqu'un problème survient car le système tel que l'acquisition de température et le mécanisme tel que le serveur Web sont construits sur la même machine.
Installation et configuration compliquées du serveur Web et de la base de données Vous pouvez installer le serveur Web Apache et le serveur de base de données MySQL, mais l'installation et la configuration prennent du temps. Je suis sûr que certains d'entre vous en ont fait l'expérience, mais si vous ne prenez pas de notes correctement, vous ne connaissez peut-être pas les paramètres corrects ou vous êtes peut-être en état de travailler.
Il est difficile de refaire les paramètres du serveur Web et du serveur de base de données. Si vous souhaitez reconfigurer votre serveur Web ou votre base de données, vous devrez vous demander quoi faire si cela ne fonctionne pas pour modifier votre environnement existant.
Je ne sais pas ce qui a causé le problème. Docker utilise une technologie appelée conteneurs. Lancez un "OS virtuel" sur le gâteau de la râpe. Les rôles sont clairement répartis entre le conteneur d'application et le conteneur de base de données, et le système d'exploitation de l'unité principale Raspeye est spécialisé dans la communication avec du matériel tel que les capteurs de température, les capteurs d'humidité et les capteurs d'éclairement. Lorsqu'un problème survient, il sera plus facile d'isoler le problème lors de la recherche de la cause!
Installation et configuration compliquées du serveur Web et de la base de données Avec Docker, vous pouvez utiliser gratuitement des fichiers image avec des paramètres difficiles, à partir d'une installation de middleware gênante! Les fichiers image vont des fichiers officiels aux fichiers finement personnalisés, et peuvent être utilisés en combinaison pour assembler un modèle en plastique!
Il est difficile de refaire les paramètres du serveur Web et du serveur de base de données. Docker vous permet de combiner les installations et les paramètres dans un seul fichier. Si vous faites une erreur dans les paramètres, expérimentez dans un autre environnement basé sur ce fichier. Même si cela ne fonctionne pas, il est possible de jeter le contenu et d'appeler à nouveau le fichier de configuration bien fait. Docker peut être parallélisé (créer le même environnement à tout moment, n'importe où) en utilisant des fichiers image, de sorte que le portage peut être effectué en douceur!
Docker a aussi ses défis. Les serveurs typiques ont l'architecture x86_64, et la plupart des images Docker Hub sont également des images d'architecture x86_64. Il existe peu d'images de l'architecture armv7l de Raspberry Pi, et il y a encore peu d'informations sur Raspberry Pi + Docker.
Dans ce numéro, nous présenterons un exemple d'utilisation de Docker sur Raspberry basé sur cette situation!
Observation en point fixe de la température, enregistrement dans la base de données et navigation sur le serveur web!
① Acquérir avec un capteur de température numérique sur le corps principal du Raspai
(2) La température acquise est enregistrée dans la base de données à partir du programme via l'API.
③ Le navigateur Web peut afficher la température enregistrée dans la base de données.
Ceux-ci sont sur mon Github et peuvent être construits avec des étapes relativement simples. C'est l'un des avantages de Docker.
La construction de l'environnement sera expliquée dans "3. Construire l'environnement"!
Si vous n'avez pas installé Docker et Git, veuillez consulter l'article ci-dessous. Installer Docker et Git sur RaspberryPi3
Utilisez immédiatement Docker pour créer des conteneurs d'application, des conteneurs de base de données et des conteneurs de données!
Voir l'article ci-dessous pour plus de détails! Créez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile]
Il existe également une version vidéo!
Cloner avec git et télécharger le fichier
$ git clone [email protected]:RyosukeKamei/rpi-python-bottle.git
Déplacer vers le dossier cloné
$ cd rpi-python-bottle
docker-Créer et démarrer un conteneur de données et un conteneur de base de données avec compose
$ docker-compose up -d
Vérifiez l'image
$ docker images
Vérifiez le conteneur
$ docker ps -a
Connectez-vous au conteneur de base de données
$ docker exec -it rpi-python-bottle-db bash
Entrez un exemple de table et de données
# mysql -u bottle -pbottle measurement < /docker-entrypoint-initdb.d/create_table.sql
Déconnexion du conteneur de base de données
# (Contrl + p, Control + q)
Créer un conteneur d'application
$ docker build -t hypriot/rpi-python .
Démarrez le conteneur d'applications et connectez-vous
$ docker run --name rpi-python-bottle-app -it hypriot/rpi-python bash
Démarrez le serveur
# /usr/local/bin/python3 /home/bottle/server.py
Lorsque vous l'ouvrez dans un navigateur, il s'affichera comme suit.
Lorsque vous clonez git, la structure des dossiers sera la suivante!
3-3. /app/server.py
Données de température enregistrées dans la base de données et API pour l'enregistrement des données.
@route('/list') Obtenez les données de température avec l'instruction SQL SELECT et affichez-les dans une liste.
@route('/input_temperature') Reçoit les données de température, génère et enregistre une instruction SQL INSERT. Exemple de format: http://172.17.0.4:8080/input_temperature?server_id=1&temperature=29&user_id=1
server_id: ID du serveur (valeur fixe dans l'exemple, compte tenu de l'évolutivité future) temperature: température acquise par le capteur de température user_id: ID utilisateur (valeur fixe dans l'exemple, compte tenu de l'évolutivité future)
Les détails sont donnés dans les commentaires commençant par #.
/app/server.py
#bibliothèque de bouteilles
from bottle import route, run, request
#Le pilote MySQL est mysql.connector
import mysql.connector
#Supplément
#En fait, si vous mettez un modèle, le HTML sera beau.
#Cette zone sera plus tard ...
#L'adresse IP de l'hôte est$ docker inspect {Nom du conteneur de base de données}Découvrez dans
#Les utilisateurs, mots de passe et bases de données MySQL sont docker-compose.Ce qui a été défini avec 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():
#Afficher la température
cursor = connector.cursor()
cursor.execute("select `id`, `temperature`, `careted_at` from temperatures")
disp = "<table>"
#entête
disp += "<tr><th>ID</th><th>Température</th><th>Date d'inscription</th></tr>"
#Partie de liste
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 "Obtenu de DB"+disp
@route('/input_temperature')
def input_temperature():
#Entrer la température
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 + ")")
#commettre
connector.commit();
cursor.close
return "OK"
#Fermer le connecteur
connector.close
#Démarrage du serveur
run(host='0.0.0.0', port=8080, debug=True, reloader=True)
3-4. digital_temperature_sensor_for_api.py Chaque minute, la température est obtenue à partir du capteur de température via I2C et l'API d'enregistrement des données est accessible.
Exemple de valeur d'API http://172.17.0.4:8080/input_temperature?server_id=1&temperature=29&user_id=1
digital_temperature_sensor_for_api.py
#Préparation
# $ sudo apt-get install libi2c-dev
# $ sudo sh -c 'echo "options i2c_bcm2708 combined=1" >> /etc/modprobe.d/i2c.conf'
#Bibliothèque qui contrôle GPIO
import wiringpi
#Bibliothèque de minuterie
import time
#Appelez les bibliothèques nécessaires pour lire à partir du périphérique I2C
import os
import struct
#Accès URL
import urllib.request
#Créer une instance d'I2C
wiringpi.wiringPiSetup()
i2c = wiringpi.I2C()
#Paramètres I2C
#Spécifiez l'adresse I2C de l'appareil à communiquer
temperture_dev = i2c.setup(0x48)
#Obtenez des données 16 bits pour la température
#Autres Défini pour enregistrer 0x03
i2c.writeReg8(temperture_dev, 0x03, 0x80)
while True:
#Lire 2 octets de capteur de température
temperture_data = struct.unpack('2B', os.read(temperture_dev, 2))
#La valeur est divisée en 2 octets, alors combinez-les en un seul.
temperture = ( ( temperture_data[0] << 8 ) + temperture_data[1] )
#Convertir les nombres en valeurs négatives
if ( temperture_data[0] >= 0x80 ):
temperture = temperture - 65536
#Calculez la température en divisant la valeur acquise par 128
temperture = temperture / 128
#Affichage de la température
print ( "Température" , temperture , "C" )
response = urllib.request.urlopen('http://172.17.0.4:8080/input_temperature?server_id=1&temperature=' + str(temperture) + '&user_id=1')
data = response.read()
print ( "Réponse du serveur: ", data )
#Chaque minute
time.sleep(60)
3-5. /docker/mysql/my.cnf Ceci est un fichier japonais pour MySQL. Puisqu'il est défini dynamiquement, je vais omettre une explication approfondie.
/docker/mysql/my.cnf
[mysqld]
innodb_strict_mode
innodb_file_format = Barracuda
innodb_file_per_table
innodb_large_prefix = 1
character-set-server=utf8mb4
skip-character-set-client-handshake
max_allowed_packet = 32m
skip-networking = 0
[client]
default-character-set=utf8mb4
3-6. docker-compose.yml Gérez de manière centralisée les conteneurs de base de données et les conteneurs de données.
Voir l'article ci-dessous pour plus de détails! Construisez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile]
3-7. Dockerfile Il s'agit du fichier de configuration du conteneur d'application.
Voir l'article ci-dessous pour plus de détails! Construisez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile]
3-8. /initdb.d/create_table.sql SQL pour enregistrer la définition de table et les données initiales pour la vérification de l'opération. Au moment de la construction, il est exécuté à l'aide de commandes.
sql:/initdb.d/create_table.sql
USE measurement;
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;
INSERT INTO `temperatures`
(`id`, `server_id`, `temperature`, `careted_at`, `careted_user`, `updated_at`, `updated_user`)
VALUES
(1, 1, 29, NOW(), 1, NOW(), 1);
3-9. README.md Il s'agit d'un fichier README généré automatiquement par Git. Cela n'a rien à voir avec l'opération. (Ce serait bien de l'écrire un peu plus attentivement ...)
3-10. /vim/python.vim Lorsque vous utilisez vim dans le conteneur d'application, il dispose de paramètres pratiques pour écrire Python. Cela crée également automatiquement l'image de l'application lors de sa création.
C'est enfin un contrôle de fonctionnement.
Dans Raspeye, il y a un fichier appelé "digital_temperature_sensor_for_api.py" dans le dossier créé par git clone, alors démarrez-le.
Obtenez la température
$ cd {dossier cloné git}/rpi-python-bottle
$ sudo python3 digital_temperature_sensor_for_api.py
La température est obtenue comme suit (l'image a un argument, mais il est ignoré).
La température acquise est enregistrée dans la base de données à partir du programme via l'API.
Si vous accédez à "http://172.17.0.4:8080/list" avec le navigateur de Raspeye, vous pouvez voir l'affichage suivant!
/vim/python.vim
setl expandtab
setl tabstop=4
setl shiftwidth=4
setl softtabstop=0
autocmd BufWritePre * :%s/\s\+$//ge
setlocal textwidth=80
J'ai utilisé un capteur de température cette fois, mais si vous utilisez un capteur d'éclairement qui mesure la luminosité et un capteur d'humidité qui mesure l'humidité, vous pouvez mesurer l'éclairement et l'humidité!
Si vous avez besoin de voir la température, l'éclairement et l'humidité à partir d'un endroit éloigné, vous pouvez le faire! S'il y a autre chose qui me semble utile, j'aimerais l'appliquer!
Installation du Raspberry Pi 3 → LAN sans fil → Entrée / sortie japonaise → opération depuis Mac
Installer Docker sur RaspberryPi3 Créez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile] Créez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Essai et erreur]
Faire un climatiseur intégré PC "airpi" avec Raspberry Pi 3!
Le moteur se déplace en appuyant sur le bouton Le moteur se déplace tout en rapprochant l'aimant Le moteur se déplace lorsque l'aimant est rapproché et s'arrête automatiquement
Programmation avec programmation Node-RED avec Raspberry Pi 3 et programmation normale Allumez la LED avec python sur Raspberry Pi 3 (Hello World) Détecter l'état du commutateur avec Raspberry Pi 3 Exécutez un servomoteur en utilisant python sur Raspberry Pi 3 Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3! Détectez l'interrupteur à glissière à l'aide de python sur Raspberry Pi 3! Détectez les commutateurs magnétiques à l'aide de python sur Raspberry Pi 3! Détectez la température en utilisant python sur Raspberry Pi 3! Raspberry Pi 3 utilise python pour faire sonner le buzzer! Détectez les signaux analogiques avec un convertisseur A / N en utilisant python sur Raspberry Pi 3! Détectez la "luminosité" en utilisant python sur Raspberry Pi 3! Détectez la "température (en utilisant le convertisseur A / N)" en utilisant python sur Raspberry Pi 3! Sortie vers "7 segments LED" en utilisant python sur Raspberry Pi 3! Utilisez python sur Raspberry Pi 3 pour éclairer la LED avec le contrôle du commutateur! Utilisez python sur Raspberry Pi 3 et allumez la LED quand il fait noir!
Règles de codage "Écrivons du code doux" (FuelPHP) Règles de dénomination "Membres sympathiques pour vous-même, conviviaux pour l'équipe et invisibles après 3 mois"
Lier l'environnement PHP + Eclipse à Apache à l'aide de Docker Création d'un environnement de développement Fuel PHP à l'aide de Docker Création d'un squelette CRUD à l'aide des paramètres initiaux de l'environnement de développement FuelPHP à l'aide de Docker et de l'échafaudage Migration de la base de données FuelPHP
Recommended Posts