[PYTHON] J'ai commencé Docker

J'ai entendu dire qu'il serait pratique de mettre tous les outils que j'ai créés dans un conteneur, j'ai donc décidé de commencer à utiliser Docker, qui m'intéressait depuis longtemps. Cette fois, je vais créer un serveur Web créé avec python flask dans un conteneur afin que je puisse gérer le serveur Web simplement en démarrant et en arrêtant le conteneur.

Cliquez ici pour l'environnement utilisé

$ cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.2 (Ootpa)
$ docker --version
Docker version 19.03.12, build 48a66213fe

Examen de Docker

Tout d'abord, résumons brièvement comment utiliser Docker (comment créer un conteneur). Il y a 4 étapes pour créer un conteneur Docker.

  1. Tirez l'image de base
  2. Créez Dockerfile
  3. Créez l'image Docker
  4. Créez et démarrez le conteneur Docker à partir de l'image

Personnellement, je pense que la première chose que je ne comprends pas vraiment est de créer un Dockerfile. Ainsi, la première étape consiste à créer un script python simple à l'intérieur du conteneur, et la deuxième étape consiste à l'améliorer pour exécuter le serveur Web de flask.

Exécuter le script python dans le conteneur

La première étape consiste à exécuter le prochain myapp.py dans le conteneur.

myapp.py


print("hello Docker!")

Tirez l'image de base

Tout d'abord, préparez une image qui sera l'environnement d'exécution de python3. Recherchez les images de la série python3 enregistrées dans Docker Hub.

$ sudo docker search python3
NAME                                                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
rackspacedot/python37                                                                                                   11                                      
sellpy/python3-jupyter-sklearn                                          python3-jupyter-sklearn                         5                                       [OK]
openwhisk/python3action                                                 Apache OpenWhisk runtime for Python 3 Actions   5                                       
sellpy/python3-jupyter-sklearn-java                                     python3-jupyter-sklearn-java                    2                                       [OK]
quoinedev/python3.6-pandas-alpine                                       Python 3.7 on alpine with numpy and pandas i…   2                                       
(Omis)

Cette fois, nous utiliserons rackspacedot / python37, qui a le plus de STARS. Tirons ceci.

$ sudo docker pull rackspacedot/python37

rackspacedot / python37 est également une image Docker, vous pouvez donc la vérifier avec les images docker après avoir tiré.

$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
rackspacedot/python37   latest              3d51361ee118        7 weeks ago         1.06GB

Si vous avez cette image, vous pouvez utiliser python dans le conteneur, c'est donc OK si vous ajoutez d'autres parties nécessaires (telles que le placement de script) en fonction de cela.

Créer Dockerfile

Créez ensuite un fichier nommé Dockerfile.

FROM rackspacedot/python37

WORKDIR /usr/local/script
COPY myapp.py .

CMD python myapp.py

Pour expliquer brièvement,

Les fichiers préparés jusqu'à présent sont les suivants.

$ ls -l
total 8
-rw-r--r--. 1 user developer 146 Sep 11 16:39 Dockerfile
-rw-r--r--. 1 user developer 173 Sep 11 17:04 myapp.py

Démarrer le conteneur de création d'image Docker

Maintenant que nous avons créé un Dockerfile, nous allons construire l'image → démarrer le conteneur. Tout d'abord, construisez l'image.

$ sudo docker build -t myapp:test .

Le -t name: tag définit le nom et la balise de l'image (il peut être différent du nom du script). . Spécifie le chemin du répertoire dans lequel se trouve le Dockerfile. Si vous obtenez Valeur de hachage construite avec succès, l'image est générée et vous pouvez la vérifier avec images de menu fixe.

$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
myapp                   test                e577339515a7        10 seconds ago      1.06GB
rackspacedot/python37   latest              3d51361ee118        7 weeks ago         1.06GB

Maintenant que l'image est créée, créez et démarrez le conteneur.

$ sudo docker run myapp:test
hello Docker!

J'ai pu exécuter avec succès le script python dans le conteneur. Le conteneur démarré ici reste, vous pouvez donc l'exécuter à nouveau avec la même commande. Vous pouvez également voir le conteneur créé avec docker ps -a.

Exécuter un serveur Flask dans un conteneur

Maintenant que vous pouvez exécuter des scripts python à l'intérieur du conteneur, créons un serveur avec flask comme deuxième étape. Réécrivez myapp.py comme suit:

from flask import Flask

app = Flask("myapp")

@app.route("/")
def main():
    return "hello Docker!!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

Pour le moment, j'ai réduit le nombre de ! À 2 pour que vous puissiez voir le changement. Rendons cela utilisable en tant que serveur Web dans le conteneur.

Modification du fichier Docker

Puisque nous utilisons flask, nous devons installer flask à l'intérieur du conteneur. Puisque rackspacedot / python37 contient pip par défaut, ajoutez la partie quipip install au Dockerfile lors de la construction de l'image.

FROM rackspacedot/python37

RUN pip install flask

RUN useradd docker
USER docker

WORKDIR /usr/local/script
COPY myapp.py .

CMD python myapp.py

Pour expliquer le montant ajouté,

Démarrer le conteneur de création d'image Docker

Puisque le fichier a été réécrit, reconstruisez l'image → démarrez le conteneur. Tout d'abord, de la reconstruction.

$ sudo docker build -t myapp .

Puisque nous avons omis la balise cette fois, la balise «latest» est automatiquement attribuée. Vérifions avec les images docker.

$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
myapp                   latest              6c747be5d597        3 seconds ago       1.06GB
myapp                   test                e577339515a7        50 minutes ago      1.06GB
rackspacedot/python37   latest              3d51361ee118        7 weeks ago         1.06GB

Maintenant, commençons le conteneur. Puisqu'il s'agit d'un serveur Web, j'ajoute des options.

$ sudo docker run -d -p 8080:8080 myapp

Bien qu'il s'agisse d'un numéro de port, il s'écrit -p numéro de port de réception: numéro côté conteneur. Le numéro de port de réception peut être n'importe quel nombre, mais le numéro du côté du conteneur doit être le numéro spécifié dans myapp.py dans le conteneur (8080 dans ce cas).

S'il démarre sans problème, vous pouvez vérifier le conteneur en cours d'exécution avec docker ps.

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
00d1ab6fc24a        myapp               "/bin/sh -c 'python …"   3 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   thirsty_mccarthy

Accédons-y réellement.

$ curl http://localhost:8080
hello Docker!!

Ça m'a l'air bien. Ceci termine la conteneurisation du serveur Web. Si vous souhaitez arrêter le conteneur

$ sudo docker stop thirsty_mccarthy

Si vous souhaitez redémarrer après l'arrêt

$ sudo docker start thirsty_mccarthy

Pour thirsty_mccarthy, spécifiez le nom du conteneur (celui affiché dans NAME lorsque docker ps est exécuté). Si vous le démarrez avec docker start, il s'exécutera automatiquement sur le port spécifié au moment de docker run. De plus, si vous en faites un conteneur, vous pouvez l'exécuter dans un autre environnement en construisant l'image → en démarrant le conteneur, ce qui est très pratique.

C'est tout pour cette fois. Si Docker Compose peut exécuter plusieurs conteneurs avec une seule commande, la plage s'étendra davantage, donc je pense que je vais également étudier cela.

Recommended Posts

J'ai commencé Docker
J'ai commencé Python
J'ai commencé à analyser
J'ai commencé PYNQ (2) -Overlay self-made-
J'ai commencé, mais ça ne démarre pas!
Premiers pas sur Docker Apache Hadoop
J'ai vérifié le contenu du volume du docker
Installer Docker
J'ai essayé de commencer avec Hy
J'ai créé un environnement Anaconda à l'aide de Docker!
Django + Docker
J'ai fait des recherches sur Docker, donc je vais le résumer
a commencé python
Démarrage de Node.js dans un environnement virtuel
Ce que j'ai fait avant d'installer Docker pour Windows
J'ai commencé l'apprentissage automatique avec le prétraitement des données Python