Ich habe Docker gelesen und gelernt und versuche, das zu verwendende Django-Setup richtig auszuwählen. Bisher gibt es entweder:
Docker Compose oder Dockerfile
Ich verstehe, dass Dockerfiles
in verwendet werden Docker Compose
, aber ich bin nicht sicher, ob es eine gute Praxis ist, alles in einer großen Docker-Datei mit mehreren FROM
Befehlen für die verschiedenen Bilder zu speichern ?
Ich möchte verschiedene Bilder verwenden, darunter:
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
Bitte geben Sie an, welche Best Practices beim Einrichten dieser Art von Umgebung mit Docker angewendet werden .
Wenn es hilft, bin ich auf einem Mac, also benutze boot2docker .
Einige Probleme, die ich hatte:
- Docker Compose ist nicht mit Python3 kompatibel
- Ich möchte mein Projekt containerisieren. Wenn also eine große Docker-Datei nicht ideal ist, muss ich sie mit Docker Compose auflösen
- Ich bin in Ordnung, um das Projekt Py2 & Py3 kompatibel zu machen, also neige ich zu Django-Compose
docker
docker-compose
dockerfile
development-environment
boot2docker
Aaron Lelevier
quelle
quelle
Antworten:
Die Antwort ist weder.
Docker Compose (hier als Compose bezeichnet) verwendet die Docker-Datei, wenn Sie den Befehl build zu Ihrem Projekt hinzufügen
docker-compose.yml
.Ihr Docker-Workflow sollte darin bestehen,
Dockerfile
für jedes Bild, das Sie erstellen möchten , ein geeignetes Bild zu erstellen und dann mit compose die Bilder mit dembuild
Befehl zusammenzusetzen.Sie können den Pfad zu Ihrem individuellen Dockerfiles angeben mit
build /path/to/dockerfiles/blah
dem ,/path/to/dockerfiles/blah
wo blah der istDockerfile
Leben.quelle
docker-compose
in der Produktion oder nur Entwickler? Danke für Ihre Hilfe.docker-compose.yml
nur ein öffentliches Image verwendet (Image aus dem Internet / Docker-Hub ziehen), kein benötigt Docker-Datei zum Ausführen des Befehlsdocker-compose up
.Dockerfile
Eine Docker-Datei ist eine einfache Textdatei, die die Befehle enthält, die ein Benutzer zum Zusammenstellen eines Bildes aufrufen kann.
Beispiel Dockerfile
Docker Compose
Docker Compose
ist ein Tool zum Definieren und Ausführen von Docker-Anwendungen mit mehreren Containern.
Definieren Sie die Dienste, aus denen Ihre App besteht,
docker-compose.yml
damit sie zusammen in einer isolierten Umgebung ausgeführt werden können.Starten Sie eine App in einem Befehl, indem Sie sie einfach ausführen
docker-compose up
Beispiel: docker-compose.yml
quelle
image: redis
aber ist das von Dockerhub? lokales Verzeichnis? etc ... das macht es für einen Neuling wie mich verwirrend zu verstehen, was wirklich los istEs scheint auch, dass Compose ab 1.11 als produktionssicher gilt , da https://docs.docker.com/v1.11/compose/production/ keine Warnung mehr enthält, es nicht in der Produktion wie https: // docs zu verwenden .docker.com / v1.10 / komponieren / Produktion / tut.
quelle
Docker-Compose ist vorhanden, damit Sie nicht jede Menge Befehle schreiben müssen, die Sie mit Docker-CLI ausführen müssten.
Docker-Compose macht es auch einfach, mehrere Container gleichzeitig zu starten und sie automatisch mit einer Art Netzwerk zu verbinden.
Der Zweck von Docker-Compose besteht darin, als Docker-CLI zu fungieren, aber mehrere Befehle viel schneller auszugeben.
Um Docker-Compose verwenden zu können, müssen Sie die zuvor ausgeführten Befehle in eine
docker-compose.yml
Datei codieren .Sie werden sie nicht nur kopieren, sondern in die yaml-Datei einfügen, es gibt eine spezielle Syntax.
Einmal erstellt, müssen Sie es der Docker-Compose-CLI zuführen. Es liegt an der CLI, die Datei zu analysieren und alle verschiedenen Container mit der von uns angegebenen korrekten Konfiguration zu erstellen.
Sie haben also separate Container, zum Beispiel einen
redis-server
und den zweiten,node-app
und Sie möchten, dass diese mit demDockerfile
in Ihrem aktuellen Verzeichnis erstellt werden.Nachdem Sie diesen Container erstellt haben, ordnen Sie außerdem einen Port vom Container dem lokalen Computer zu, um auf alles zuzugreifen, was darin ausgeführt wird.
Für Ihre
docker-compose.yml
Datei möchten Sie also die erste Zeile folgendermaßen beginnen:version: '3'
Dadurch wird Docker mitgeteilt, welche Version
docker-compose
Sie verwenden möchten. Danach müssen Sie hinzufügen:Bitte beachten Sie die Einrückung, sehr wichtig. Beachten Sie auch, dass ich für einen Dienst ein Bild greife, für einen anderen Dienst jedoch
docker-compose
in das aktuelle Verzeichnis schaue, um das Bild zu erstellen, das für den zweiten Container verwendet wird.Anschließend möchten Sie alle verschiedenen Ports angeben, die für diesen Container geöffnet werden sollen.
Bitte beachten Sie den Bindestrich. Ein Bindestrich in einer Yaml-Datei gibt an, wie wir ein Array angeben. In diesem Beispiel ordne ich
8081
auf meinem lokalen Computer8081
dem Container Folgendes zu:Der erste Port ist also Ihr lokaler Computer, und der andere ist der Port auf dem Container. Sie können auch zwischen den beiden unterscheiden, um Verwechslungen wie folgt zu vermeiden:
Wenn Sie Ihre
docker-compose.yml
Datei so entwickeln, werden diese Container im Wesentlichen im selben Netzwerk erstellt und sie haben freien Zugriff, um nach Belieben miteinander zu kommunizieren und so viele Informationen auszutauschen, wie sie möchten.Wenn die beiden Container mit erstellt werden
docker-compose
, benötigen wir keine Portdeklarationen.In meinem Beispiel müssen wir eine Codekonfiguration in der Nodejs-App vornehmen, die ungefähr so aussieht:
Ich verwende dieses Beispiel oben, um Sie darauf aufmerksam zu machen, dass Sie möglicherweise zusätzlich zu der
docker-compose.yml
für Ihr Projekt spezifischen Datei eine bestimmte Konfiguration vornehmen müssen .Wenn Sie jemals mit einer Nodejs-App und Redis arbeiten, möchten Sie sicherstellen, dass Sie über den Standardport informiert sind, den Nodejs verwendet, und ich werde Folgendes hinzufügen:
Docker wird also feststellen, dass die Node-App
redis-server
diese Verbindung sucht, und diese Verbindung zu diesem laufenden Container umleiten.Die ganze Zeit
Dockerfile
enthält das einzige Folgendes:Während Sie also zuvor ausführen müssen
docker run myimage
, um eine Instanz aller Container oder Dienste in der Datei zu erstellen, können Sie diese stattdessen ausführen,docker-compose up
und Sie müssen kein Image angeben, da Docker im aktuellen Arbeitsverzeichnis nach einem suchtdocker-compose.yml
Datei innerhalb von dort.Früher
docker-compose.yml
mussten wir uns mit zwei separaten Befehlen vondocker build .
und befassendocker run myimage
, aber in derdocker-compose
Welt, wenn Sie Ihre Bilder neu erstellen möchten, schreiben Siedocker-compose up --build
. Dadurch wird Docker angewiesen, die Container erneut zu starten, sie jedoch neu zu erstellen, um die neuesten Änderungen zu erhalten.Dies
docker-compose
erleichtert das Arbeiten mit mehreren Containern. Wenn Sie das nächste Mal diese Gruppe von Containern im Hintergrund starten müssen, können Sie dies tundocker-compose up -d
und sie stoppendocker-compose down
.quelle
docker-compose up
nur einen Dienst in meiner Situation zu nutzen. Ein anderes Wort, vergleiche mitdocker run xxx
, irgendeinen Vorteil, wenn ich benutzedocker-compose up
?docker-compose
für einzelne Container6379
ist der Standardport von Redis).In meinem Workflow füge ich für jeden Teil meines Systems eine Docker-Datei hinzu und konfiguriere sie so, dass jeder Teil einzeln ausgeführt werden kann. Dann füge ich eine docker-compose.yml hinzu, um sie zusammenzuführen und zu verknüpfen.
Größter Vorteil (meiner Meinung nach): Wenn Sie die Container verknüpfen , können Sie einen Namen definieren und Ihre Container mit diesem Namen pingen. Daher ist Ihre Datenbank möglicherweise mit dem Namen
db
und nicht mehr über die IP- Adresse zugänglich .quelle
"besser" ist relativ. Es hängt alles davon ab, was Ihre Bedürfnisse sind. Docker Compose dient zum Orchestrieren mehrerer Container. Wenn diese Bilder bereits in der Docker-Registrierung vorhanden sind, ist es besser, sie in der Erstellungsdatei aufzulisten. Wenn diese oder einige andere Bilder aus Dateien auf Ihrem Computer erstellt werden müssen, können Sie die Prozesse zum Erstellen dieser Bilder in einer Docker-Datei beschreiben.
Die Verwendung mehrerer FROM in einer einzelnen Docker-Datei ist keine sehr gute Idee, da vorgeschlagen wird, die Funktion zu entfernen. 13026
Wenn Sie beispielsweise eine Anwendung andocken möchten, die eine Datenbank verwendet und die Anwendungsdateien auf Ihrem Computer hat, können Sie eine Erstellungsdatei zusammen mit einer Docker-Datei wie folgt verwenden
docker-compose.yml
Dockerfile
quelle
Dockerfile und Docker Compose sind zwei verschiedene Konzepte in Dockerland. Wenn wir über Docker sprechen, fallen uns als Erstes Orchestrierung, Virtualisierung auf Betriebssystemebene, Bilder, Container usw. ein. Ich werde versuchen, diese wie folgt zu erklären:
Bild: Ein Bild ist eine unveränderliche, gemeinsam nutzbare Datei, die in einer Docker-vertrauenswürdigen Registrierung gespeichert ist. Ein Docker-Image besteht aus einer Reihe von schreibgeschützten Ebenen. Jede Ebene stellt eine Anweisung dar, die in der Docker-Datei des Bildes gegeben wird. Ein Image enthält alle erforderlichen Binärdateien, die ausgeführt werden sollen.
Container: Eine Instanz eines Bildes wird als Container bezeichnet . Ein Container ist nur eine ausführbare Image-Binärdatei, die vom Host-Betriebssystem ausgeführt werden soll. Ein laufendes Image ist ein Container.
Docker-Datei: Eine Docker-Datei ist ein Textdokument, das alle Befehle / Erstellungsanweisungen enthält, die ein Benutzer über die Befehlszeile aufrufen kann, um ein Bild zusammenzustellen. Dies wird als gespeichert
Dockerfile
. (Beachten Sie das Kleinbuchstaben 'f'.)Docker-Compose: Compose ist ein Tool zum Definieren und Ausführen von Docker-Anwendungen mit mehreren Containern. Mit Compose verwenden Sie eine YAML-Datei, um die Dienste (Container) Ihrer Anwendung zu konfigurieren. Anschließend erstellen und starten Sie mit einem einzigen Befehl alle Dienste in Ihrer Konfiguration. Die Compose-Datei wird als gespeichert
docker-compose.yml
.quelle
Stellen Sie sich vor, Sie sind der Manager eines Softwareunternehmens und haben gerade einen brandneuen Server gekauft. Nur die Hardware.
Denken Sie an ,
Dockerfile
wie eine Reihe von Anweisungen , die Sie Ihrem System sagen würde adminstrator was installieren auf diesem brandneuen Server. Zum Beispiel:/var/www
)Stellen Sie sich im Gegensatz dazu
docker-compose.yml
eine Reihe von Anweisungen vor, die Sie Ihrem Systemadministrator mitteilen würden, wie der Server mit dem Rest der Welt interagieren kann . Zum Beispiel,(Dies ist keine genaue Erklärung, aber zunächst gut genug.)
quelle
Dockerfiles sind ein Bild zum Beispiel aus einem blanken Knochen Ubuntu zu bauen, können Sie hinzufügen
mysql
genanntmySQL
auf ein Bild undmywordpress
auf einem zweiten Bild genanntmywordpress
.Beim Erstellen von YAML-Dateien sollen diese Bilder aufgenommen und zusammenhängend ausgeführt werden. Wenn Sie beispielsweise
docker-compose.yml
einen Serviceabruf in Ihrer Datei habendb
:und ein Dienst namens worpress wie:
Anschließend können Sie im mywordpress-Container
db
eine Verbindung zu Ihrem mySQL-Container herstellen. Diese Magie ist möglich, weil Ihr Docker-Host eine Netzwerkbrücke erstellt (Netzwerk-Overlay).quelle
In der Microservices-Welt (mit einer gemeinsamen Codebasis) würde jeder Microservice eine haben,
Dockerfile
während Sie auf der Root-Ebene (im Allgemeinen außerhalb aller Microservices und wo sich Ihr übergeordnetes POM befindet) eine definieren würden, umdocker-compose.yml
alle Microservices in einer vollständigen App zu gruppieren.In Ihrem Fall wird "Docker Compose" gegenüber "Dockerfile" bevorzugt. Denken Sie "App" Denken Sie "Verfassen".
quelle
Dockerfile ist eine Datei, die Textbefehle zum Zusammenstellen eines Bildes enthält.
Docker Compose wird zum Ausführen einer Umgebung mit mehreren Containern verwendet.
Wenn Sie in Ihrem speziellen Szenario mehrere Dienste für jede von Ihnen erwähnte Technologie haben (Dienst 1 mit reddis, Dienst 2 mit rabbit mq usw.), können Sie für jeden der Dienste eine Docker-Datei und eine gemeinsame docker-compose.yml ausführen alle "Dockerfile" als Container.
Wenn Sie alle in einem einzigen Dienst haben möchten, ist Docker-Compose eine praktikable Option.
quelle