J'ai lu et appris sur Docker et j'essaie de choisir correctement la configuration de Django à utiliser. Jusqu'à présent, il y a soit:
Je comprends que ce Dockerfiles
soit utilisé dans Docker Compose
, mais je ne sais pas si c'est une bonne pratique de tout mettre dans un grand Dockerfile avec plusieurs FROM
commandes pour les différentes images?
Je souhaite utiliser plusieurs images différentes, notamment:
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
Veuillez indiquer les meilleures pratiques de configuration de ce type d'environnement à l'aide de Docker .
Si cela aide, je suis sur un Mac, donc j'utilise boot2docker .
Quelques problèmes que j'ai rencontrés:
- Docker Compose n'est pas compatible avec Python3
- Je souhaite conteneuriser mon projet, donc si un grand Dockerfile n'est pas idéal, je pense que je devrai le décomposer à l'aide de Docker Compose
- Je suis d'accord pour rendre le projet Py2 & Py3 compatible, donc je me tourne vers django-compose
docker
docker-compose
dockerfile
development-environment
boot2docker
Aaron Lelevier
la source
la source
Réponses:
La réponse n'est ni l'un ni l'autre.
Docker Compose (ici appelé composer) utilisera le Dockerfile si vous ajoutez la commande build à celle de votre projet
docker-compose.yml
.Votre flux de travail Docker devrait être de créer une
Dockerfile
image adaptée à chaque image que vous souhaitez créer, puis d'utiliser la composition pour assembler les images à l'aide de labuild
commande.Vous pouvez spécifier le chemin d'accès à vos Dockerfiles individuels en utilisant
build /path/to/dockerfiles/blah
où/path/to/dockerfiles/blah
se trouve laDockerfile
vie de blah .la source
docker-compose
en production ou uniquement en dev? Merci de votre aide.docker-compose.yml
utiliser uniquement l' image publique (tirant image à partir du hub Internet / docker), alors on ne ont pas besoin Dockerfile pour exécuter la commandedocker-compose up
.Dockerfile
Un Dockerfile est un simple fichier texte qui contient les commandes qu'un utilisateur peut appeler pour assembler une image.
Exemple, Dockerfile
Docker Compose
Docker Compose
est un outil pour définir et exécuter des applications Docker multi-conteneurs.
définir les services qui composent votre application
docker-compose.yml
afin qu'ils puissent être exécutés ensemble dans un environnement isolé.obtenir une application en cours d'exécution en une seule commande en exécutant simplement
docker-compose up
Exemple, docker-compose.yml
la source
image: redis
mais est-ce de Dockerhub? répertoire local? etc ... cela rend confus pour un nouveau comme moi de comprendre ce qui se passe vraimentIl semble également que Compose soit considéré comme sûr pour la production à partir du 1.11 , car https://docs.docker.com/v1.11/compose/production/ n'a plus d'avertissement de ne pas l'utiliser en production comme https: // docs .docker.com / v1.10 / compose / production / does.
la source
docker-compose existe pour vous éviter d'avoir à écrire une tonne de commandes avec docker-cli.
docker-compose permet également de démarrer facilement plusieurs conteneurs en même temps et de les connecter automatiquement avec une certaine forme de mise en réseau.
Le but de docker-compose est de fonctionner comme docker cli mais d'émettre plusieurs commandes beaucoup plus rapidement.
Pour utiliser docker-compose, vous devez encoder les commandes que vous exécutiez auparavant dans un
docker-compose.yml
fichier.Vous n'allez pas simplement les copier coller dans le fichier yaml, il y a une syntaxe spéciale.
Une fois créé, vous devez le nourrir à la cli docker-compose et ce sera à la cli d'analyser le fichier et de créer tous les différents conteneurs avec la configuration correcte que nous spécifions.
Vous aurez donc des conteneurs séparés, disons par exemple, un est
redis-server
et le second estnode-app
et vous voulez que créé à l'aide deDockerfile
dans votre répertoire actuel.De plus, après avoir créé ce conteneur, vous devez mapper un port du conteneur à la machine locale pour accéder à tout ce qui s'y trouve.
Donc, pour votre
docker-compose.yml
fichier, vous voudriez commencer la première ligne comme ceci:version: '3'
Cela indique à Docker la version que
docker-compose
vous souhaitez utiliser. Après cela, vous devez ajouter:Veuillez noter l'indentation, très importante. Aussi, remarquez pour un service que je saisis une image, mais pour un autre service que je dis
docker-compose
de regarder à l'intérieur du répertoire courant pour construire l'image qui sera utilisée pour le deuxième conteneur.Ensuite, vous souhaitez spécifier tous les différents ports que vous souhaitez ouvrir sur ce conteneur.
Veuillez noter le tiret, un tiret dans un fichier yaml est la façon dont nous spécifions un tableau. Dans cet exemple, je mappe
8081
sur ma machine locale8081
sur le conteneur comme ceci:Ainsi, le premier port est votre machine locale, et l'autre est le port sur le conteneur, vous pouvez également faire la distinction entre les deux pour éviter toute confusion comme ceci:
En développant votre
docker-compose.yml
fichier comme celui-ci, il créera ces conteneurs sur essentiellement le même réseau et ils auront un accès gratuit pour communiquer entre eux comme bon leur semble et échanger autant d'informations qu'ils le souhaitent.Lorsque les deux conteneurs sont créés à l'aide de
docker-compose
nous n'avons besoin d'aucune déclaration de port.Maintenant, dans mon exemple, nous devons faire une configuration de code dans l'application Nodejs qui ressemble à ceci:
J'utilise cet exemple ci-dessus pour vous faire savoir qu'il peut y avoir une configuration spécifique que vous auriez à faire en plus du
docker-compose.yml
fichier qui peut être spécifique à votre projet.Maintenant, si vous vous retrouvez à travailler avec une application Nodejs et redis, vous voulez vous assurer que vous êtes au courant du port par défaut que Nodejs utilise, donc j'ajouterai ceci:
Docker va donc voir que l'application Node recherche
redis-server
et redirige cette connexion vers ce conteneur en cours d'exécution.Tout le temps, le
Dockerfile
seul contient ceci:Donc, alors qu'avant, vous devriez exécuter
docker run myimage
pour créer une instance de tous les conteneurs ou services à l'intérieur du fichier, vous pouvez exécuter à la place,docker-compose up
et vous n'avez pas besoin de spécifier une image car Docker recherchera dans le répertoire de travail actuel et recherchera undocker-compose.yml
déposer à l'intérieur de là.Avant
docker-compose.yml
, nous devions traiter deux commandes distinctes dedocker build .
etdocker run myimage
, mais dans ledocker-compose
monde si vous voulez reconstruire vos images, vous écrivezdocker-compose up --build
. Cela indique à Docker de redémarrer les conteneurs mais de le reconstruire pour obtenir les dernières modifications.Il
docker-compose
est donc plus facile de travailler avec plusieurs conteneurs. La prochaine fois que vous devez démarrer ce groupe de conteneurs en arrière-plan, vous pouvez le fairedocker-compose up -d
et les arrêter, vous pouvez le fairedocker-compose down
.la source
docker-compose up
un seul service dans ma situation? Un autre mot, comparer avecdocker run xxx
, tout avantage si j'utilisedocker-compose up
?docker-compose
pour les conteneurs simples6379
est le port par défaut de Redis).Dans mon flux de travail, j'ajoute un Dockerfile pour chaque partie de mon système et je le configure pour que chaque partie puisse s'exécuter individuellement. Ensuite, j'ajoute un docker-compose.yml pour les rassembler et les lier.
Le plus grand avantage (à mon avis): lors de la liaison des conteneurs , vous pouvez définir un nom et envoyer une requête ping à vos conteneurs avec ce nom. Par conséquent, votre base de données peut être accessible avec le nom
db
et non plus par son IP.la source
"mieux" est relatif. Tout dépend de vos besoins. Docker compose sert à orchestrer plusieurs conteneurs. Si ces images existent déjà dans le registre Docker, il est préférable de les répertorier dans le fichier de composition. Si ces images ou d'autres images doivent être créées à partir de fichiers sur votre ordinateur, vous pouvez décrire les processus de création de ces images dans un Dockerfile.
L'utilisation de plusieurs FROM dans un seul dockerfile n'est pas une très bonne idée car il est proposé de supprimer la fonctionnalité. 13026
Si, par exemple, vous souhaitez ancrer une application qui utilise une base de données et avoir les fichiers d'application sur votre ordinateur, vous pouvez utiliser un fichier de composition avec un dockerfile comme suit
docker-compose.yml
Dockerfile
la source
Dockerfile et Docker Compose sont deux concepts différents dans Dockerland. Lorsque nous parlons de Docker, les premières choses qui me viennent à l'esprit sont l'orchestration, la virtualisation au niveau du système d'exploitation, les images, les conteneurs, etc. Je vais essayer de les expliquer comme suit:
Image: une image est un fichier immuable et partageable qui est stocké dans un registre approuvé par Docker. Une image Docker est constituée d'une série de couches en lecture seule. Chaque couche représente une instruction donnée dans le Dockerfile de l'image. Une image contient tous les fichiers binaires nécessaires à l'exécution.
Conteneur: une instance d'une image est appelée conteneur . Un conteneur est juste un binaire d'image exécutable qui doit être exécuté par le système d'exploitation hôte. Une image en cours d'exécution est un conteneur.
Dockerfile: Un Dockerfile est un document texte qui contient toutes les commandes / instructions de construction, un utilisateur peut appeler sur la ligne de commande pour assembler une image. Cela sera enregistré en tant que
Dockerfile
. (Notez le «f» en minuscule.)Docker-Compose: Compose est un outil pour définir et exécuter des applications Docker multi-conteneurs. Avec Compose, vous utilisez un fichier YAML pour configurer les services de votre application (conteneurs). Ensuite, avec une seule commande, vous créez et démarrez tous les services à partir de votre configuration. Le fichier de composition serait enregistré sous
docker-compose.yml
.la source
Imaginez que vous êtes le directeur d'une société de logiciels et que vous venez d'acheter un tout nouveau serveur. Juste le matériel.
Considérez
Dockerfile
comme un ensemble d'instructions que vous diriez à votre administrateur système ce qu'il faut installer sur ce nouveau serveur. Par exemple:/var/www
)En revanche, pensez
docker-compose.yml
à un ensemble d'instructions que vous diriez à votre administrateur système comment le serveur peut interagir avec le reste du monde. Par exemple,(Ce n'est pas une explication précise mais assez bonne pour commencer.)
la source
Les Dockerfiles sont pour construire une image par exemple à partir d'un Ubuntu sans os, vous pouvez ajouter
mysql
appelémySQL
sur une image etmywordpress
sur une deuxième image appeléemywordpress
.Composer des fichiers YAML consiste à prendre ces images et à les exécuter de manière cohérente. par exemple si vous avez dans votre
docker-compose.yml
dossier un appel de servicedb
:et un service appelé worpress tel que:
puis à l'intérieur du conteneur mywordpress, vous pouvez utiliser
db
pour vous connecter à votre conteneur mySQL. Cette magie est possible car votre hôte docker crée un pont réseau (superposition réseau).la source
Dans le monde des microservices (ayant une base de code partagée commune), chaque microservice aurait un
Dockerfile
alors qu'au niveau racine (généralement en dehors de tous les microservices et où réside votre POM parent), vous définiriez undocker-compose.yml
pour regrouper tous les microservices dans une application à part entière.Dans votre cas, "Docker Compose" est préféré à "Dockerfile". Pensez «App» Pensez «Composer».
la source
Dockerfile est un fichier qui contient des commandes de texte pour assembler une image.
Docker compose est utilisé pour exécuter un environnement multi-conteneurs.
Dans votre scénario spécifique, si vous avez plusieurs services pour chaque technologie que vous avez mentionnée (service 1 en utilisant reddis, service 2 en utilisant rabbit mq, etc.), vous pouvez avoir un Dockerfile pour chacun des services et un docker-compose.yml commun à exécuter tous les "Dockerfile" comme conteneurs.
Si vous les voulez tous dans un seul service, docker-compose sera une option viable.
la source