docker-machine和docker-compose有什么区别?

36

我认为我不理解。首先,我创建了Docker机器:

$ 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 对于本地开发来说很麻烦 :-)

谢谢。

1个回答

81

Docker 是使用容器化技术来管理多个镜像、容器和卷等的命令行工具,一个容器基本上是一个轻量级虚拟机。请参见https://docs.docker.com/获取详细文档。

直到最近,Docker 无法在原生的 Mac 或 Windows 操作系统上运行,因此另一个工具 Docker-Machine 应运而生。它创建一个虚拟机(使用另一个工具,例如 Oracle VirtualBox),在该 VM 上运行 Docker,并帮助协调主机操作系统和 Docker VM 之间的通信。

由于 Docker 并没有直接运行在主机操作系统上,Docker-Machine 需要处理 IP 地址、端口和卷等问题。其设置保存在环境变量中,这意味着每次打开新 shell 都必须运行像这样的命令:

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

Docker-Compose 本质上是在 Docker 之上的一种更高级别的脚本接口,它使同时启动多个容器变得更加容易(表面上如此)。它的配置文件(docker-compose.yml)有些令人困惑,因为其中一些设置会传递到较低级别的 Docker 进程中,而另一些则仅在较高级别使用。

我同意这很混乱;我的建议是从单个 Dockerfile 开始,并使用 docker-machine新的 beta 版本本地 Mac/Windows Docker 运行它,直到您对这些较低级别的工具感到更加舒适,然后再考虑 docker-compose


1
我通常在Linux上工作,所以我放弃了docker-machine,现在看起来更好了 :-) - User
我觉得使用 docker-machine use default 比起 eval $(...) 更加方便。 - steppo
2
如果 Docker Machine 是为 OSX/Windows 设计的,为什么会有 Linux 版本呢?https://docs.docker.com/machine/install-machine/#installing-machine-directly - Alston
1
@Alston 因为 (a) 为什么不呢?你可以在 Linux 上运行虚拟机,那为什么不用 Docker-Machine 在这些虚拟机上运行 Docker 呢?(b) 它现在具有远程配置和管理功能,因此您可以使用 Linux 作为客户端来管理远程 docker-machine 实例(或集群或群集等)。 - AlexChaffee
@AlexChaffee非常简洁的回答。你能否也请提一下什么是Docker Swarm? :P - Prakhar Agrawal
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接