[PYTHON] Bis die von Flask + MySQL erstellte API in Docker konvertiert wird

das ist?

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.

Dinge die zu tun sind

  1. Erstellen Sie eine einfache API nur mit Flask.
  2. Konvertieren Sie 1 in Docker.
  3. Bereiten Sie MySQL vor.
  4. Aktivieren Sie die Integration von Flask und MySQL, die von Docker-Compose ausgeführt werden soll.

1. Erstellen Sie eine einfache API nur mit Flask.

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.

スクリーンショット 2020-01-02 20.43.38.png スクリーンショット 2020-01-02 20.43.26.png スクリーンショット 2020-01-02 20.43.51.png

Erstellen Sie als Nächstes diesen API-Docker.

2. Konvertieren Sie 1 in 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.

2-1 Geben Sie das Basisbild an

Ich möchte nur in der Lage sein, flask in Python auszuführen, also werde ich es auf dem Python-Image basieren.

2-2 Beschreiben Sie die Containereinstellungen

Um den Kolbencode auszuführen, benötigen Sie Folgendes:

2-3 Führen Sie den Befehl im Container aus.

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.

スクリーンショット 2020-01-03 11.01.41.png

Ü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.

3. Bereiten Sie MySQL vor.

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.

3-1 Geben Sie das Basisbild an

Ich möchte MySQL verwenden, daher werde ich es auf dem MySQL-Image basieren.

3-2 Beschreiben Sie die Containereinstellungen

Initialisieren Sie die MySQL-Konfigurationsdatei und -Datenbank.

3-3 Führen Sie den Befehl im Container aus.

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. ..

[Bemerkungen] Tipps rund um MySQL

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.

4. Aktivieren Sie die Integration von Flask und MySQL, die von Docker-Compose ausgeführt werden soll.

Kombinieren Sie die beiden in 2 und 4 erstellten Docker-Container. Alles, was Sie tun müssen, um sie zu kombinieren, ist:

4-1 Kolben wird auch in docker-compose.yaml gegeben

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.

4-2 Erlaube eine Verbindung von der Flasche zu MySQL (Netzwerk).

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.

4-3 --- Lassen Sie eine Flasche eine Verbindung zu MySQL (Code) herstellen.

Ä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

Bis die von Flask + MySQL erstellte API in Docker konvertiert wird
[Mit Bilddiagramm] Nginx + Gunicorn + Flask konvertiert zu Docker [Teil 2]
[Mit Bilddiagramm] Nginx + Gunicorn + Flask konvertiert zu Docker [Teil 1]
Stellen Sie mit Python in Docker eine Verbindung zu MySQL her
Ausgabeprotokoll an die Konsole mit Flask + Nginx auf Docker
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
So stellen Sie eine mit Flask erstellte Web-App für Heroku bereit
API mit Flask + uWSGI + Nginx
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Vom Umgebungsaufbau bis zum Einsatz für Kolben + Heroku mit Docker
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Konvertieren Sie in PyTorch geschriebenes Python-Skript mit PyInstaller in exe
Mit Flask erstellte SNS Python-Grundlagen
Bis Sie Jupyter in Docker starten
Erstellen eines Flask-Servers mit Docker
Behalten Sie den Flask API-Server für immer bei
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Anwendungsentwicklung mit Docker + Python + Flask
Stellen Sie mit Flask SQL Alchemy eine Verbindung zu MySQL her
Ich habe einen Musik-Bot mit discord.py und der Google Drive-API erstellt (getestet mit Docker → bereitgestellt für Heroku).
Mit Docker durchgeführte Umgebungswartung (Ich möchte GrADS in Python nachbearbeiten
Stellen Sie von Flask aus eine Verbindung zum MySQL-Container von Docker her
Einfacher Slack API-Client mit Python
Senden Sie CSS mit Flask komprimiert an Gzip
Senden Sie Daten mit Vue.js an die DRF-API
[Python] Erstellen Sie schnell eine API mit Flask
Serverlose Gesichtserkennungs-API mit Python
Erstellen Sie einen Webdienst mit Docker + Flask
Starten Sie die Flask-Anwendung mit Docker auf Heroku
So installieren Sie Python3 mit Docker Centos
Erstellen Sie eine API zum Konvertieren von PDF-Dateien in TIF-Bilder mit FastAPI und Docker
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Erstellen Sie eine Kolben-App mit Tensorflow und Dlib für Centos7