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
containerd.io
n'existe pas. Dans mon cas [ici](https://vexpose.blog/2020/04/02/installation-of-docker-fails-on-centos-8-with-error-package-containerd-io-1-2- 10-3-2-el7-x86-64-is-exclusive /) a pu le résoudre en toute sécurité, donc pour référence.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.
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.
La première étape consiste à exécuter le prochain myapp.py
dans le conteneur.
myapp.py
print("hello Docker!")
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éez ensuite un fichier nommé Dockerfile
.
FROM rackspacedot/python37
WORKDIR /usr/local/script
COPY myapp.py .
CMD python myapp.py
Pour expliquer brièvement,
FROM rackspacedot/python37
--C'est la partie qui spécifie l'image de base. Spécifiez l'image que vous venez de tirer.WORKDIR /usr/local/script
COPY myapp.py .
.
cette fois, il sera copié dans le répertoire spécifié par WORKDIR
.CMD python myapp.py
--Cette commande est exécutée au démarrage du conteneur.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
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
.
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.
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é,
RUN pip install flask
--Installez le flacon à l'intérieur du récipient.RUN useradd docker / USER docker
docker
et effectuer les opérations suivantes en tant qu'utilisateur docker
.
――Cela fonctionne sans cette heure, mais je l'ai ajouté pour des raisons de sécurité.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