使用Docker Machine和本地VM开始

估计阅读时间: 11分钟

让我们来看看使用docker-machine在本地虚拟机中创建、使用和管理Docker宿主机。

先决条件

随着Docker for MacDocker for Windows作为替代Docker Toolbox的出现,我们建议你使用它们作为Docker的主要工作流程。你可以使用这些应用程序在你的本地系统上本地运行Docker,而不使用Docker Machine。(有关Mac端的说明,请参阅Docker for Mac vs. Docker Toolbox)。

但是,如果你想创建多个本地宿主机,你需要Docker Machine,它还可以为高级用户或多节点实验创建和管理宿主机 。Docker for Mac和Docker for Windows都包含最新版本的Docker Machine,所以当你安装这两个版本时,你即得到docker-machine

新解决方案具有自己的本机虚拟化解决方案,而不是Oracle VirtualBox,因此在使用Machine创建本地VM时,请记住以下注意事项。

  • Docker for Mac —— 你可以使用docker-machine --createvirtualbox驱动程序来创建其他本地machines。

  • Docker for Windows —— 你可以使用docker-machine --createhyperv驱动程序来创建其他本地machines。

如果你正在使用Docker for Windows

Docker for Windows使用Microsoft Hyper-V进行虚拟化,Hyper-V与Oracle VirtualBox不兼容。因此,你不能同时运行两个解决方案。但你仍然可以使用docker-machine利用Microsoft Hyper-V驱动程序创建更多的本地VM。

如果你使用Docker for Mac

Docker for Mac使用HyperKit,这是一个轻量级的macOS虚拟化解决方案,建立在Hypervisor.framework之上的macOS 10.10 Yosemite及更高版本。

目前,没有针对HyperKit的docker-machine create驱动程序,因此你将使用virtualbox驱动程序创建本地machines。(请参阅Oracle VirtualBox的Docker Machine驱动程序。)注意,你可以在同一个系统上运行HyperKit和Oracle VirtualBox。要了解详情,请参阅Docker for Mac vs. Docker Toolbox

  • 确保你在你的系统上正确安装了最新的VirtualBox(作为早期Toolbox安装的一部分或手动安装)。

如果你使用Docker Toolbox

Docker for Mac和Docker for Windows都需要更新版本的相应操作系统,因此具有较旧操作系统版本的用户必须使用Docker Toolbox。

  • 如果你在Mac或旧版本的Windows系统(没有Hyper-V)上使用Docker Toolbox,你将使用virtualbox驱动程序创建基于Oracle VirtualBox的本地机器(请参阅Oracle VirtualBox的Docker Machine驱动程序
  • 如果你在使用Hyper-V但不能运行Docker for Windows(例如Windows 8 Pro)的Windows系统上使用Docker Toolbox,则必须使用hyperv驱动程序创建本地机器。(请参阅用于Microsoft Hyper-V的Docker Machine驱动程序。)
  • 确保你在你的系统上正确安装了最新的VirtualBox如果你使用Toolbox来安装MacWindows来安装Docker Machine,VirtualBox会自动安装。
  • 如果你使用快速启动终端启动你的第一台machine并设置你的终端环境指向它,一个default machine将被自动创建。如果是这样,你仍然可以按照这些步骤操作,但创建的是另一台名称除“default”之外的machine(例如,staging或sandbox)。

使用Machine运行Docker容器

要运行Docker容器,你需要:

  • 创建一个新的(或启动一个已存在的)Docker虚拟machine
  • 将你的环境切换到你的新VM
  • 使用docker客户端创建、加载和管理容器

一旦你创建一个machine,你可以任意重复使用它。像任何VirtualBox VM,它维护每次使用之间的配置。

下面的示例演示如何创建和启动一个machine、运行Docker命令、以及使用容器。

创建machine

  1. 打开命令shell或终端窗口。

    下面的这些示例命令显示的是Bash shell。对于不同的shell,例如C Shell,命令是相同的,除非另有说明。

  2. 使用docker-machine ls列出可用的machines。

    在下面的示例中,尚未创建任何计算机。

     $ docker-machine ls
     NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
    
  3. 创建一台machine。

    运行docker-machine create命令,将相应的驱动程序传递到--driver标志并提供machine名称。如果这是你的第一台machine,将它命名为default,如示例所示。如果你已经有一个“default” machine,为这台新machine选择另一个名称。

    • 如果你在使用Mac上的Toolbox、没有Hyper-V的旧版本的Windows系统上的Toolbox、或者Docker for Mac,请使用virtualbox作为驱动程序,如本例所示。(Docker Machine VirtualBox驱动程序的参考在这里。)(有关详情,请参阅上述先决条件)。

    • 在支持Hyper-V的Windows系统的Docker上,使用Docker Machine Microsoft Hyper-V驱动程序参考中所示的hyperv驱动程序。(有关详情,请参阅上述先决条件)。

        $ docker-machine create --driver virtualbox default
        Running pre-create checks...
        Creating machine...
        (staging) Copying /Users/ripley/.docker/machine/cache/boot2docker.iso to /Users/ripley/.docker/machine/machines/default/boot2docker.iso...
        (staging) Creating VirtualBox VM...
        (staging) Creating SSH key...
        (staging) Starting the VM...
        (staging) Waiting for an IP...
        Waiting for machine to be running, this may take a few minutes...
        Machine is running, waiting for SSH to be available...
        Detecting operating system of created instance...
        Detecting the provisioner...
        Provisioning with boot2docker...
        Copying certs to the local machine directory...
        Copying certs to the remote machine...
        Setting Docker configuration on the remote daemon...
        Checking connection to Docker...
        Docker is up and running!
        To see how to connect Docker to this machine, run: docker-machine env default
      

      此命令下载一个安装了Docker守护程序的轻量级Linux发行版(boot2docker),并使用Docker创建并启动一个VirtualBox VM。

  4. 再次列出可用的machines,可以看到你新创建machine。

     $ docker-machine ls
     NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER   ERRORS
     default   *        virtualbox   Running   tcp://192.168.99.187:2376           v1.9.1
    
  5. 获取你的新VM的环境的命令。

    docker-machine create命令的输出中所述,你需要告诉Docker来与新machine通信。你可以用docker-machine env命令来做到这一点。

     $ docker-machine env default
     export DOCKER_TLS_VERIFY="1"
     export DOCKER_HOST="tcp://172.16.62.130:2376"
     export DOCKER_CERT_PATH="/Users/<yourusername>/.docker/machine/machines/default"
     export DOCKER_MACHINE_NAME="default"
     # Run this command to configure your shell:
     # eval "$(docker-machine env default)"
    
  6. 将你的shell连接到新机器。

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

    注意:如果你使用fish或Powershell/cmd.exe等Windows Shell,上述方法将无法正常工作。请参阅env命令的文档,了解如何为你的shell设置环境变量。

    这为Docker客户端将读取的指定TLS设置的当前shell设置环境变量。每次你打开一个新的shell或重新启动你的machine,你都需要做这个。

    你现在可以在宿主机上运行Docker命令。

运行容器并使用Machine命令进行实验

使用docker run运行容器以验证你的设置。

  1. 使用docker run下载并使用简单的“echo”命令运行busybox

     $ docker run busybox echo hello world
     Unable to find image 'busybox' locally
     Pulling repository busybox
     e72ac664f4f0: Download complete
     511136ea3c5a: Download complete
     df7546f9f060: Download complete
     e433a6c5b276: Download complete
     hello world
    
  2. 获取宿主机IP地址。

    任何开放的端口都可以在Docker宿主机的IP地址中访问,你可以使用docker-machine ip命令获得:

     $ docker-machine ip default
     192.168.99.100
    
  3. 使用以下命令在容器中运行Web服务器(nginx):

     $ docker run -d -p 8000:80 nginx
    

    当镜像完成拉取时,你可以在端口8000处访问由docker-machine ip提供给你的IP地址的服务器。例如:

         $ curl $(docker-machine ip default):8000
         <!DOCTYPE html>
         <html>
         <head>
         <title>Welcome to nginx!</title>
         <style>
             body {
                 width: 35em;
                 margin: 0 auto;
                 font-family: Tahoma, Verdana, Arial, sans-serif;
             }
         </style>
         </head>
         <body>
         <h1>Welcome to nginx!</h1>
         <p>If you see this page, the nginx web server is successfully installed and
         working. Further configuration is required.</p>
    
         <p>For online documentation and support please refer to
         <a href="http://nginx.org/">nginx.org</a>.<br/>
         Commercial support is available at
         <a href="http://nginx.com/">nginx.com</a>.</p>
    
         <p><em>Thank you for using nginx.</em></p>
         </body>
         </html>
    

你可以创建和管理尽可能多的运行Docker的本地VM;只要再次运行docker-machine create所有创建的machines将显示在docker-machine ls的输出中。

启动和停止机器

如果你暂时使用宿主机,你可以用docker-machine stop停止它,稍后再用docker-machine start启动它。

    $ docker-machine stop default
    $ docker-machine start default

在没有指定名称的机器上操作

如果没有指定机器名,某些docker-machine命令将假定给定的操作应在名为default的机器上运行(如果存在)。因为使用名为default的本地VM是如此常见的模式,因此允许你在最常用的Machine 命令上省去一些输入。

例如:

      $ docker-machine stop
      Stopping "default"....
      Machine "default" was stopped.

      $ docker-machine start
      Starting "default"...
      (default) Waiting for an IP...
      Machine "default" was started.
      Started machines may have new IP addresses.  You may need to re-run the `docker-machine env` command.

      $ eval $(docker-machine env)

      $ docker-machine ip
        192.168.99.100

遵循此风格的命令如下:

    - `docker-machine config`
    - `docker-machine env`
    - `docker-machine inspect`
    - `docker-machine ip`
    - `docker-machine kill`
    - `docker-machine provision`
    - `docker-machine regenerate-certs`
    - `docker-machine restart`
    - `docker-machine ssh`
    - `docker-machine start`
    - `docker-machine status`
    - `docker-machine stop`
    - `docker-machine upgrade`
    - `docker-machine url`

对于除default以外的计算机以及除上述命令以外的命令,你必须始终将名称显式指定为参数。

在启动时启动本地machines

为了确保Docker客户端在每个shell会话开始时自动配置,一些用户喜欢在它们的shell配置文件中(例如~/.bash_profile文件)嵌入eval $(docker-machine env default)但是,如果default机器未运行,则此操作将失败。如果需要,你可以配置你的系统自动启动default machine。

下面是如何在macOS上配置的一个示例。

使用以下内容在~/Library/LaunchAgents下创建名为com.docker.machine.default.plist的文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PATH</key>
            <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
        </dict>
        <key>Label</key>
        <string>com.docker.machine.default</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/docker-machine</string>
            <string>start</string>
            <string>default</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

你可以更改上面的default字符串,使LaunchAgent启动任何你想要的machine。

下一步去哪里

="TableOfContentsSection">