web-dev-qa-db-ja.com

docker-machineとdocker-composeの違いは何ですか?

理解できないと思う。最初に、docker-machineを作成しました。

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

次に、Dockerfileと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

最後に、イメージを作成して開始しました。

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

仮想マシンのIPを確認しました

$ docker-machine ip dev

ブラウザでサイトを正常に開きました。しかし、コードに変更を加えたところ、何も起こりませんでした。そこで、「dev」マシンにログインしました。

$ docker-machine ssh dev

そして、コードが見つかりませんでした!だから私はdocker "web"画像にログインしました:

$ docker exec -it project_web_1 bash

コードはありましたが、変更はありませんでした。

Docker-machineは何のためですか?意味は何ですか? Dockerが変更後にファイルを同期しないのはなぜですか? docker + docker-machine + docker-composeはローカル開発の苦痛のようです:-)

ありがとう。

24
User

Dockercontainerization を使用して複数のイメージとコンテナーおよびボリュームなどを管理するコマンドラインツールです-コンテナーは基本的に軽量の仮想マシン。詳細なドキュメントについては、 https://docs.docker.com/ を参照してください。

最近まで、DockerはネイティブMacまたはWindows OSで実行されなかったため、別のツールDocker-Machineが作成されました。別のツール、たとえばOracle VirtualBox)は、そのVMでDockerを実行し、ホストOSとDocker VM間の調整を支援します。

Dockerは実際のホストOSで実行されていないため、docker-machineはIPアドレス、ポート、ボリュームなどを処理する必要があります。また、その設定は環境変数に保存されます。つまり、新しいシェルを開くたびに次のようなコマンドを実行する必要があります。

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

Docker-Composeは、本質的にDocker自体の上にある高レベルのスクリプトインターフェースであり、複数のコンテナーの同時起動を(表面上)簡単に管理できるようにします。その構成ファイル(docker-compose.yml)は、設定の一部が下位レベルのdockerプロセスに渡され、一部は上位レベルでのみ使用されるため、混乱を招きます。

私はそれが混乱であることに同意します。私のアドバイスは、単一のDockerfileから始めて、docker-machineまたは 新しいベータネイティブMac/Windows Docker で実行し、快適になるまでdocker-composeを無視することです。下位レベルのツールで。

55
AlexChaffee