Ich möchte eine API erstellen. Ich möchte es mit Flask + MySQL schaffen. Und ich möchte es Docker machen. Notieren Sie sich diesen Vorgang. Ich persönlich weiß nicht, wie ich es zu Docker machen soll, also werde ich mich darauf konzentrieren.
Erstellen Sie zunächst eine einfache API, da alles in Ordnung ist. Dieses Mal habe ich beschlossen, eine Liste zu erstellen, die nur die Daten zurückgibt, die die Bedingungen aus der Mitgliederliste erfüllen (vorläufig).
Erstellen Sie aus der folgenden Datei eine Funktion, bei der die Präfektur eine Liste von Mail-Adressen zurückgibt, die den Parametern der Anforderung entsprechen.
{personal_info.csv}
mail_address,sex,age,name,prefecture
[email protected],male,18,itirou,tokyo
[email protected],male,23,zirou,osaka
[email protected],male,31,saburou,tokyo
[email protected],female,29,itiko,tokyo
[email protected],mail,11,shirou,osaka
[email protected],female,42,fumiko,tokyo
Der Code, der Flask verwendet, lautet hier.
Es ist super einfach, führen Sie app.py aus, fügen Sie? Pref = xxx zu http: //127.0.0.1: 5000 /
hinzu, und mail_address, das pref = xxx entspricht, wird in der Liste zurückgegeben.
Erstellen Sie als Nächstes diesen API-Docker.
"Making Docker" zielt darauf ab, eine Docker-Datei zu erstellen, ein Docker zu erstellen, um ein Docker-Image zu erstellen, und app.py im Container mit Docker auszuführen, um einen Status zu erstellen, in dem API-Anforderungen ausgelöst werden.
Eine Docker-Datei beschreibt den Vorgang "Angeben des Basisabbilds, Beschreiben der Einstellungen des zu erstellenden Containers und Ausführen des Befehls im Container" für den Container, den Sie erstellen möchten.
Ich möchte nur in der Lage sein, flask in Python auszuführen, also werde ich es auf dem Python-Image basieren.
Um den Kolbencode auszuführen, benötigen Sie Folgendes:
Führen Sie die erstellte app.py aus.
Die Docker-Datei, die unter Berücksichtigung dieser 2-1 bis 2-3 erstellt wurde, lautet wie folgt.
# 2-1 Geben Sie das Basisbild an
FROM python:3.6
# 2-2 Beschreiben Sie die Containereinstellungen
ARG work_dir=/work #Erstellen von Variablen für Dockerfile
ADD pure_flask $work_dir/pure_flask #der Code/work/Kopieren nach(Beachten Sie, dass Sie beim Kopieren eines Verzeichnisses den Verzeichnisnamen auf die rechte Seite schreiben müssen.)
WORKDIR $work_dir/pure_flask # cd work_Bild des Verzeichnisses
RUN pip install -r requirements.txt # requirements.Installieren Sie die erforderlichen Bibliotheken mit txt
# 2-3 Führen Sie den Befehl im Container aus
CMD ["python", "/work/pure_flask/app.py"] #Grundsätzlich gibt es nur eine CMD in der Docker-Datei.
Anforderungen.txt ist super einfach nur Kolben zu beschreiben.
{requirements.txt}
flask
Führen Sie "Docker Build -t Flask: Ver1." In dem Verzeichnis aus, das die Docker-Datei in diesem Status enthält. Der Befehl. Im obigen Befehl verweist auf das Erstellen eines Images mithilfe der Docker-Datei im aktuellen Verzeichnis.
Führen Sie als Nächstes docker run -it -d -p 5000: 5000 flask: ver1
aus.
-d zeigt auf die Hintergrundausführung, -p 5000: 5000 Punkte, um den lokalen Port 5000 und die Portweiterleitung für den Containerport 5000 anzugeben.
Wenn Sie in diesem Status mit einem Browser unter localhost: 5000 auf dem lokalen Computer prüfen, können Sie die Rückgabe der API überprüfen.
Übrigens sind in diesem Zustand "Docker ps" und "Docker-Bilder" wie folgt. Wenn in Docker ps nichts angezeigt wird, kann es sich um einen Fehler handeln. Sie können den Grund verstehen, indem Sie Docker-Protokolle [Container-ID] unter Verwendung der von Docker ps -a angezeigten Container-ID ausführen. ..
$ docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
> dc371c597cef flask:ver1 "python /work/pure_f…" 9 minutes ago Up 9 minutes 0.0.0.0:5000->5000/tcp quizzical_margulis
$ docker images
> REPOSITORY TAG IMAGE ID CREATED SIZE
> flask ver1 b4cda0e56563 9 minutes ago 923MB
> python 3.6 138869855e44 5 days ago 913MB
Sicher, 1. Ich konnte denselben Vorgang auf Docker bestätigen, als ich eine einfache API nur mit Flask erstellt habe.
Machen Sie sich als Nächstes bereit, MySQL zu verwenden.
MySQL wird auch von Docker vorbereitet. Dieses Mal werden wir gleichzeitig auch Docker-compose.yaml verwenden.
Docker-compose.yaml ähnelt Dockerfile, beschreibt jedoch die Verknüpfung mehrerer Container. Da davon ausgegangen wird, dass die Datenbank verbunden sein wird, halte ich es für selbstverständlich, sie in Docker-compose zu schreiben.
Ich möchte MySQL verwenden, daher werde ich es auf dem MySQL-Image basieren.
Initialisieren Sie die MySQL-Konfigurationsdatei und -Datenbank.
Starten Sie einen MySQL-Prozess.
Die Docker-Datei befindet sich unten.
# 3-1 Festlegen des Basisbilds
FROM mysql:5.7
# 3-2 Beschreiben Sie die Containereinstellungen
COPY conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf #Satz von Zeichencode-Einstellungen
COPY initdb.d/init.sql /docker-entrypoint-initdb.d/init.sql #Satz von SQL-Dateien zur Initialisierung
Die Konfigurationsdatei und die in die Docker-Datei kopierte Datei init.sql lauten wie folgt.
{mysql.cnf}
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
{init.sql}
CREATE TABLE `personal_info` (
mail_address VARCHAR(100) NOT NULL,
sex VARCHAR(6) NOT NULL,
age INT NOT NULL,
name VARCHAR(50) NOT NULL,
prefecture VARCHAR(50) NOT NULL,
createdAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updatedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (mail_address)
);
INSERT INTO `personal_info` (mail_address, sex, age, name, prefecture, createdAt, updatedAt)
VALUES
('[email protected]', 'male', 18, 'ichirou1' , 'tokyo', current_timestamp(), current_timestamp()),
('[email protected]', 'male', 23, 'zirou2', 'osaka', current_timestamp(), current_timestamp()),
('[email protected]', 'male', 31, 'saburou', 'tokyo', current_timestamp(), current_timestamp()),
('[email protected]', 'female', 29, 'itiko', 'tokyo', current_timestamp(), current_timestamp()),
('[email protected]', 'mail', 11, 'shirou', 'osaka', current_timestamp(), current_timestamp()),
('[email protected]', 'female', 42, 'fumiko', 'tokyo', current_timestamp(), current_timestamp());
docker-compose.yaml ist unten.
version: '3' # docker-compose.Beschreibung Version von Yaml
services:
db:
build: mysql #Geben Sie die Docker-Datei im MySQL-Verzeichnis an
container_name: db_server #Der Name des Docker-Containers
ports:
- '3306:3306' #Portweiterleitungsspezifikation
environment: #Umgebungsvariablen einstellen
MYSQL_ROOT_PASSWORD: pass #MySQL-Root-Benutzerpasswort
MYSQL_DATABASE: testdb #MySQL-Schema
TZ: Asia/Tokyo #Angabe der Zeitzone
volumes: #Volume Mount für die Persistenz von MySQL-Daten
- db-data/:/var/lib/mysql
# 3-3 Führen Sie den Befehl im Container aus
command: mysqld #Führen Sie den Befehl mysqld aus
volumes:
db-data:
Sobald Sie die oben genannten Schritte ausgeführt haben, starten Sie den Datenbankcontainer mit docker-compose up -d
.
Melden Sie sich danach mit docker exec -it [Container-ID] / bin / bash
an, geben Sie das Passwort von mysql -u root -p
ein, um die Tabelle zu überprüfen, und wenn der Inhalt von init.sql enthalten ist, ist es OK. ..
Wenn die Daten nicht auf dem Volume gespeichert sind, um die MySQL-Daten beizubehalten, überprüfen Sie das Volume mit dem Docker-Volume ls auf dem Docker-Host, löschen Sie es und docker-compose up -d.
Init.sql wird fest nach /docker-entrypoint-initdb.d/ kopiert.
Als nächstes verbinden Sie Kolben und MySQL.
Kombinieren Sie die beiden in 2 und 4 erstellten Docker-Container. Alles, was Sie tun müssen, um sie zu kombinieren, ist:
Das Folgende ist der Flaschenbehälter, der zu MySQL docker-compose.yaml hinzugefügt wurde.
version: '3'
services:
api:
build: python
container_name: api_server
ports:
- "5000:5000"
tty: yes
environment:
TZ: Asia/Tokyo
FLASK_APP: app.py
depends_on: #Der API-Server wird nach dem Start des Datenbankservers gestartet.
- db
networks: #Allgemeine Netzwerkspezifikation für die Verbindung von API und DB
- app_net
db:
build: mysql
container_name: db_server
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: testdb
TZ: Asia/Tokyo
volumes:
- ./db-data:/var/lib/mysql
command: mysqld
networks:
- app_net
volumes:
db-data:
networks:
app_net:
driver: bridge
Beschreiben Sie in der Hierarchie direkt unter services api als dieselbe Hierarchie wie db.
Wenn Sie zwei Container starten und zwischen ihnen verbinden, müssen Sie die beiden Container im selben Netzwerk verwalten. Fügen Sie jedem Dienst in 4-1 docker-compose.yaml Folgendes hinzu.
networks:
- app_net
Auf diese Weise können Sie angeben, welches Netzwerk jeder Container verwendet. Dies bedeutet, dass sich die beiden im selben Netzwerk befinden. Schreiben Sie dann Folgendes in die Hierarchie der obersten Ebene von docker-compose.yaml.
networks:
app_net:
driver: bridge
Dies bedeutet das Erstellen eines Docker-Netzwerks und eine Spezifikation zum Erstellen eines Treibers mit der Bridge-Spezifikation. Jetzt, da sich die API- und DB-Container im selben Netzwerk befinden, ist es möglich, eine Verbindung von API zu DB herzustellen.
Änderung von Code und Modul auf der Kolbenseite. Es scheint viele Möglichkeiten zu geben, von Python aus eine Verbindung zu MySQL herzustellen, aber diesmal habe ich mysqlclient verwendet.
Installieren Sie mysqlclient mit pip install mysqlclient
und stellen Sie eine Verbindung mit dem folgenden Code her, um es zu verwenden.
import MySQLdb
conn = MySQLdb.connect(user='root', passwd='pass', host='db_server', db='testdb')
cur = conn.cursor()
sql = "select * from personal_info;"
cur.execute(sql)
rows = cur.fetchall()
In diese Zeilen werden Taples zurückgegeben, und es können Tapples mit der Länge der Anzahl von Datensätzen erhalten werden.
{Bild von Zeilen.}
(
(Wert in der ersten Spalte des ersten Datensatzes,Wert in der zweiten Spalte des ersten Datensatzes, ...),
(Wert in der ersten Spalte des zweiten Datensatzes,Wert in der zweiten Spalte des zweiten Datensatzes, ...),
(Wert in der ersten Spalte des dritten Datensatzes,Wert in der zweiten Spalte des dritten Datensatzes, ...)
)
Ein Bild, das dies mit Python empfängt, in einer Liste speichert und mit json zurückgibt.
Die geänderte Quelle ist hier. Die Verzeichnisstruktur und den Speicherort der Docker-Datei finden Sie hier.
Fügen Sie danach mysqlclient zu require.txt hinzu, da die Anzahl der Module, die ich mit Python verarbeiten möchte, gestiegen ist.
Das ist es. Nachdem Sie alles mit "docker-compose up -d" gestartet haben, können Sie das Ergebnis überprüfen, indem Sie lokal "http: //0.0.0.0: 5000 /? Pref = osaka" usw. eingeben.
das ist alles.
Recommended Posts