开始使用Docker Machine和本地VM

预计阅读时间:11分钟

让我们看一下用于在docker-machine本地虚拟机内部创建,使用和管理Docker主机的方法。

笔记

Docker Machine不再包含在Docker Desktop安装程序中。您可以从GitHub上的docker / machine版本页面单独下载它。

先决条件信息

随着的到来泊坞Mac版桌面码头工人Windows版桌面,我们建议您使用这些为您的主码头工人的工作流程。您可以使用这些应用程序在本地系统上本地运行Docker,而无需使用Docker Machine。

但是,目前,如果要创建多个本地计算机,则仍需要Docker Machine来创建和管理用于多节点实验的计算机。

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

  • Mac的Docker桌面-您可以docker-machine createvirtualbox驱动程序一起使用来创建其他本地计算机。

  • 适用于Windows的Docker桌面-您可以docker-machine createhyperv驱动程序一起使用来创建其他本地计算机。

如果您正在使用Windows的Docker桌面

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

前提条件是:

如果您使用的是Mac的Docker桌面

用于Mac的Docker桌面使用HyperKitHyperKit是在Hypervisor.framework之上构建的轻量级macOS虚拟化解决方案 。

当前,没有docker-machine create用于HyperKit的virtualbox驱动程序,因此请使用该驱动程序来创建本地计算机。(请参阅适用于Oracle VirtualBoxDocker Machine驱动程序。)您可以在同一系统上运行HyperKit和Oracle VirtualBox。

使用Machine运行Docker容器

要运行Docker容器,您需要:

  • 创建一个新的(或启动一个现有的)Docker虚拟机
  • 将您的环境切换到新的VM
  • 使用Docker客户端创建,加载和管理容器

创建机器后,您可以随意重复使用它。像任何VirtualBox VM一样,它在使用之间保持其配置。

此处的示例显示了如何创建和启动机器,运行Docker命令以及如何使用容器。

创建一台机器

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

    这些命令示例显示了一个Bash shell。对于其他Shell(例如C Shell),除非另有说明,否则相同的命令是相同的。

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

    在此示例中,尚未创建任何计算机。

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

    运行docker-machine create命令,将适当的驱动程序传递给 --driver标志并提供计算机名称。如果这是您的第一台计算机,请default按示例中所示对其进行命名。如果您已经有一台“默认”计算机,请为此新计算机选择另一个名称。

    在支持Hyper-V的Windows系统的Docker桌面上,使用Docker Machine Microsoft Hyper-V驱动程序参考中hyperv所示的驱动程序,并按照示例进行说明,该示例显示如何使用外部网络交换机并提供full命令的标志。(请参阅上面的先决条件以了解更多信息。)

         $ 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. 再次列出可用的机器以查看您新铸造的机器。

     $ 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与新机器对话。您可以使用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. 将您的外壳连接到新计算机。

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

    注意:如果使用的fish是Windows外壳,例如Powershell / cmd.exe,则上述方法将无法按上述方法工作。相反,看看env命令的文档 ,以了解如何设置环境变量的外壳。

    这将为Docker客户端读取的当前shell设置环境变量,以指定TLS设置。每次打开新的外壳程序或重新启动计算机时,都需要执行此操作。(另请参见,如何 在当前shell中取消设置环境变量。)

    现在,您可以在此主机上运行Docker命令。

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

运行一个容器docker run以验证您的设置。

  1. 使用docker run下载并运行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. 使用以下命令在容器中运行Nginx Web服务器:

     $ docker run -d -p 8000:80 nginx
    

    映像完成提取后,您可以通过分配给您的IP地址在端口8000上访问服务器docker-machine 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, refer to
         <a href="https://nginx.org">nginx.org</a>.<br/>
         Commercial support is available at
         <a href="https://www.nginx.com">www.nginx.com</a>.</p>
    
         <p><em>Thank you for using nginx.</em></p>
         </body>
         </html>
    

您可以在本地资源允许的情况下创建和管理运行Docker的本地虚拟机。docker-machine create再次运行。所有创建的机器都出现在的输出中docker-machine ls

启动和停止机器

如果暂时无法使用主机,则可以通过停止使用docker-machine stop,然后再通过重新启动docker-machine start

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

在不指定名称的情况下在机器上操作

如果未指定计算机名称,则某些docker-machine命令假定给定的操作应在名为default(如果存在)的计算机上运行。因为使用名为的本地VMdefault是一种常见的模式,所以这使您可以节省一些最常用的“计算机”命令的类型。

例如:

      $ 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以及上述机器以外的命令,您必须始终将名称明确指定为参数。

在当前shell中取消设置环境变量

您可能要使用当前的Shell连接到其他Docker Engine。在这种情况下,您可以选择切换当前Shell的环境以与其他Docker引擎进行通信。

  1. 运行env|grep DOCKER以检查是否设置了DOCKER环境变量。

    $ env | grep DOCKER
    DOCKER_HOST=tcp://192.168.99.100:2376
    DOCKER_MACHINE_NAME=default
    DOCKER_TLS_VERIFY=1
    DOCKER_CERT_PATH=/Users/<your_username>/.docker/machine/machines/default
    

    如果它返回输出(如示例中所示),则可以取消设置DOCKER环境变量。

  2. 使用以下两种方法之一在当前shell中取消设置DOCKER环境变量。

    • unset在以下DOCKER环境变量上运行命令。

      unset DOCKER_TLS_VERIFY
      unset DOCKER_CERT_PATH
      unset DOCKER_MACHINE_NAME
      unset DOCKER_HOST
      
    • 或者,运行快捷方式命令docker-machine env -u以显示需要运行以取消设置所有DOCKER变量的命令:

      $ docker-machine env -u
      unset DOCKER_TLS_VERIFY
      unset DOCKER_HOST
      unset DOCKER_CERT_PATH
      unset DOCKER_MACHINE_NAME
      # Run this command to configure your shell:
      # eval $(docker-machine env -u)
      

      运行eval $(docker-machine env -u)以取消设置当前外壳程序中的所有DOCKER变量。

  3. 现在,在运行以上任何一个命令之后,该命令将不返回任何输出。

     $ env | grep DOCKER
    

    如果您正在运行适用于Mac的Docker桌面,则可以运行Docker命令来与随该应用程序一起安装的Docker Engine进行对话。

在启动时启动本地计算机

为了确保在每个Shell会话开始时自动配置Docker客户端,您可以eval $(docker-machine env default)通过将其添加到该~/.bash_profile文件或与您的Shell等效的配置文件中,来嵌入到您的Shell配置文件中。但是,如果default未运行被调用的计算机,则此操作将失败 。您可以将系统配置为default 自动启动机器。以下示例显示了如何在macOS中执行此操作。

com.docker.machine.default.plist~/Library/LaunchAgents/目录中创建一个名为的 文件,内容如下:

<?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启动其他计算机。

接下来要去哪里

VirtualBox的