Ich hörte, dass es praktisch wäre, alle von mir hergestellten Werkzeuge in einen Container zu packen, und beschloss daher, Docker zu verwenden, an dem ich mich schon lange interessiert hatte. Dieses Mal werde ich einen mit Python Flask erstellten Webserver in einen Container verwandeln, damit ich den Webserver einfach durch Starten und Stoppen des Containers verwalten kann.
Klicken Sie hier für die verwendete Umgebung
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
$ docker --version
Docker version 19.03.12, build 48a66213fe
containerd.io
nicht existiert. In meinem Fall [hier](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-ausgeschlossen /) konnte es sicher lösen, also als Referenz.Lassen Sie uns zunächst kurz zusammenfassen, wie Docker verwendet wird (wie ein Container erstellt wird). Es gibt 4 Schritte, um einen Docker-Container zu erstellen.
Persönlich denke ich, dass das erste, was ich nicht wirklich verstehe, das Erstellen einer Docker-Datei ist. Der erste Schritt besteht also darin, ein einfaches Python-Skript im Container zu erstellen, und der zweite Schritt besteht darin, es zu verbessern, um den Flask-Webserver auszuführen.
Der erste Schritt besteht darin, die nächste "myapp.py" im Container auszuführen.
myapp.py
print("hello Docker!")
Bereiten Sie zunächst ein Image vor, das die Ausführungsumgebung für Python3 sein soll. Suchen Sie nach Bildern der Python3-Serie, die in Docker Hub registriert sind.
$ 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
(Weggelassen)
Dieses Mal werden wir ackspacedot / python37
verwenden, das die meisten STERNE hat. Lassen Sie uns das ziehen.
$ sudo docker pull rackspacedot/python37
ackspacedot / python37
ist auch ein Docker-Image, sodass Sie es nach dem Ziehen mit Docker-Images
überprüfen können.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rackspacedot/python37 latest 3d51361ee118 7 weeks ago 1.06GB
Wenn Sie dieses Bild haben, können Sie Python im Container verwenden. Es ist also in Ordnung, wenn Sie basierend darauf andere erforderliche Teile (z. B. die Platzierung von Skripten) hinzufügen.
Erstellen Sie dann eine Datei mit dem Namen "Dockerfile".
FROM rackspacedot/python37
WORKDIR /usr/local/script
COPY myapp.py .
CMD python myapp.py
Um es kurz zu erklären,
FROM rackspacedot/python37
WORKDIR /usr/local/script
COPY myapp.py .
--Kopieren Sie myapp.py in das Verzeichnis, das durch das zweite Argument im Container angegeben wird. Dieses Mal wird es durch "." Angegeben, sodass es in das von "WORKDIR" angegebene Verzeichnis kopiert wird.CMD python myapp.py
--Dieser Befehl wird ausgeführt, wenn der Container gestartet wird.Die bisher vorbereiteten Dateien lauten wie folgt.
$ 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
Nachdem wir eine Docker-Datei erstellt haben, erstellen wir das Image → Starten Sie den Container. Erstellen Sie zunächst das Image.
$ sudo docker build -t myapp:test .
Das -t name: tag
legt den Namen und das Tag des Bildes fest (es kann sich vom Skriptnamen unterscheiden). .
Gibt den Pfad des Verzeichnisses an, in dem sich die Docker-Datei befindet.
Wenn Sie "Erfolgreich erstellter Hash-Wert" erhalten, wird das Bild generiert und Sie können es mit "Docker-Bildern" überprüfen.
$ 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
Nachdem das Bild erstellt wurde, erstellen und starten Sie den Container.
$ sudo docker run myapp:test
hello Docker!
Ich konnte das Python-Skript im Container erfolgreich ausführen. Der hier gestartete Container bleibt erhalten, sodass Sie ihn mit demselben Befehl erneut ausführen können. Sie können auch den mit "Docker ps -a" erstellten Container sehen.
Nachdem Sie nun Python-Skripte im Container ausführen können, erstellen wir als zweiten Schritt einen Server mit flask.
Schreiben Sie myapp.py
wie folgt um:
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)
Vorerst habe ich die Anzahl von !
Auf 2 reduziert, damit Sie die Änderung sehen können.
Lassen Sie uns dies als Webserver im Container verwenden.
Da wir einen Kolben verwenden, müssen wir den Kolben im Behälter installieren. Da rampspacedot / python37
standardmäßig pip enthält, fügen Sie beim Erstellen des Images den Teil hinzu, der pip install
zur Docker-Datei enthält.
FROM rackspacedot/python37
RUN pip install flask
RUN useradd docker
USER docker
WORKDIR /usr/local/script
COPY myapp.py .
CMD python myapp.py
Um die hinzugefügte Menge zu erklären,
RUN pip install flask
RUN useradd docker / USER docker
Da die Datei neu geschrieben wurde, erstellen Sie das Image neu → starten Sie den Container. Zuallererst vom Wiederaufbau.
$ sudo docker build -t myapp .
Da wir das Tag dieses Mal weggelassen haben, wird das Tag "Neueste" automatisch zugewiesen. Lassen Sie uns mit "Docker-Bildern" überprüfen.
$ 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
Nun starten wir den Container. Da es sich um einen Webserver handelt, füge ich Optionen hinzu.
$ sudo docker run -d -p 8080:8080 myapp
Obwohl es sich um eine Portnummer handelt, wird sie als "-p Empfangsportnummer: Nummer auf der Containerseite" geschrieben. Die Empfangsportnummer kann eine beliebige Nummer sein, aber die Nummer auf der Containerseite sollte die Nummer sein, die in "myapp.py" im Container angegeben ist (in diesem Fall 8080).
Wenn es ohne Probleme startet, können Sie den laufenden Container mit "Docker ps" überprüfen.
$ 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
Lassen Sie uns tatsächlich darauf zugreifen.
$ curl http://localhost:8080
hello Docker!!
Hört sich gut an. Damit ist die Containerisierung des Webservers abgeschlossen. Wenn Sie den Container stoppen möchten
$ sudo docker stop thirsty_mccarthy
Wenn Sie nach dem Stoppen neu starten möchten
$ sudo docker start thirsty_mccarthy
Geben Sie für "dursty_mccarthy" den Containernamen an (der in "NAME" angezeigt wird, wenn "Docker ps" ausgeführt wird). Wenn Sie es mit "Docker-Start" starten, wird es automatisch auf dem Port ausgeführt, der zum Zeitpunkt des "Docker-Laufs" angegeben wurde. Wenn Sie es in einen Container verwandeln, können Sie es sofort verschieben, indem Sie das Image erstellen → den Container starten, wenn Sie ihn in einer anderen Umgebung ausführen, was sehr praktisch ist.
Das ist alles für diese Zeit. Wenn Docker Compose mehrere Container mit einem einzigen Befehl ausführen kann, wird der Bereich weiter erweitert. Ich denke, ich werde dies auch untersuchen.
Recommended Posts