web-dev-qa-db-fra.com

Quelle est la différence entre docker-machine et docker-compose?

Je pense que je ne comprends pas. Tout d'abord, j'ai créé docker-machine:

$ docker-machine create -d virtualbox dev
$ eval $(docker-machine env dev)

Puis j'ai écrit Dockerfile et docker-compose.yml:

FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/


version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    restart: always
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - db

Enfin, j'ai construit et commencé l'image:

$ docker-compose build --no-cache
$ docker-compose start

J'ai vérifié l'ip de ma machine virtuelle

$ docker-machine ip dev

et a réussi à ouvrir le site dans mon navigateur. Mais quand j'ai fait quelques changements dans mon code - rien ne s'est produit. Je me suis donc connecté à la machine "dev":

$ docker-machine ssh dev

et je n'ai pas trouvé mon code! Je me suis donc connecté à l'image "web" du docker:

$ docker exec -it project_web_1 bash

et il y avait un code, mais inchangé.

À quoi sert la docker-machine? Quel est le sens? Pourquoi Docker ne synchronise pas les fichiers après les modifications? On dirait que docker + docker-machine + docker-compose sont des problèmes pour le développement local :-)

Merci.

24
User

Docker est l'outil de ligne de commande qui utilise conteneurisation pour gérer plusieurs images et conteneurs et volumes et ainsi de suite - un conteneur est essentiellement une machine virtuelle légère. Voir https://docs.docker.com/ pour une documentation complète.

Jusqu'à récemment, Docker ne fonctionnait pas sur Mac ou OS natif, donc un autre outil a été créé, Docker-Machine , qui crée une machine virtuelle (en utilisant encore un autre outil, par exemple Oracle VirtualBox ), exécute Docker sur cette machine virtuelle et facilite la coordination entre le système d'exploitation hôte et la machine virtuelle Docker.

Puisque Docker ne fonctionne pas sur votre OS hôte réel, docker-machine doit gérer les adresses IP, les ports et les volumes, etc. Et ses paramètres sont enregistrés dans des variables d'environnement, ce qui signifie que vous devez exécuter des commandes comme celle-ci chaque fois que vous ouvrez un nouveau shell:

eval $(docker-machine env default)
docker-machine ip default

Docker-Compose est essentiellement une interface de script de niveau supérieur au-dessus de Docker lui-même, ce qui facilite (ostensiblement) la gestion du lancement de plusieurs conteneurs simultanément. Son fichier de configuration (docker-compose.yml) est source de confusion car certains de ses paramètres sont transmis au processus de docker de niveau inférieur, et certains ne sont utilisés qu'au niveau supérieur.

Je suis d'accord que c'est un gâchis; mon conseil est de commencer avec un seul Dockerfile et de le faire fonctionner soit avec docker-machine ou avec le nouveau Docker natif Mac/Windows bêta , et ignorer docker-compose jusqu'à ce que vous vous sentiez plus à l'aise avec les outils de niveau inférieur.

55
AlexChaffee