【问题标题】:How do I create a docker machine with a specific URL using docker-machine and VirtualBox?如何使用 docker-machine 和 VirtualBox 创建具有特定 URL 的 docker 机器?
【发布时间】:2015-12-14 21:06:49
【问题描述】:

我可以使用 VirtualBox 驱动程序创建一个 Docker 实例,但我不知道如何指定 URL。

创建命令:

docker-machine create --driver virtualbox myBox

docker-machine ls:

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
myBox     *        virtualbox   Running   tcp://192.168.99.100:2376   

我希望 URL 是一个特定的 URL。如何强制 Docker 实例使用特定 URL(例如:192.168.99.113)?

详情: Mac 10.10.5 使用 Docker 工具箱

更新

我尝试使用--virtualbox-hostonly-cidr命令设置docker机器的IP范围;我指定了一个 IP 地址的范围(“192.168.99.113/32”),但创建的机器的 IP 为 192.168.99.100,超出了我提供的范围。

甚至可以设置具有特定 IP 地址的 docker 机器吗?

【问题讨论】:

  • 我使用$(docker-machine ip myBox)获取IP地址,所以不需要关心ip不断变化。

标签: docker virtual-machine containers virtualbox docker-machine


【解决方案1】:

我们前段时间遇到了同样的问题,尝试在docker机器中更改默认docker IP,我们发现只有2种方法,怎么做。

  1. 您可以调用 docker machine 的 create 命令来创建带有 flag 的 Docker 实例

    --virtualbox-hostonly-cidr "192.168.99.1/24"

    这个标志设置了一个地址范围,可以为一个 Docker 实例设置。不保证,你得到你想要的地址

  2. 您可以更改虚拟机的网络设置,为其保留 NAT 和端口转发,使您的 Docker 实例像安装在主机操作系统上一样运行。

当然,第一个是标准方法,似乎更可取。但在某些情况下,第二个也可能有用。

更新: 有一个开放的feature request 用于为 docker 机器指定静态 IP。所以,不幸的是,现在不可能做到这一点。只有--virtualbox-hostonly-cidr 属性,但您必须提供低于 29 的 CIDR 前缀才能使其正常工作(已针对 Win 版本进行测试)。或者看看this comment,在哪里显示,你如何通过配置Virtual Box为OS X做到这一点,比如:

$ VBoxManage dhcpserver modify --ifname vboxnet0 --disable
$ VBoxManage dhcpserver modify --ifname vboxnet0 --ip 192.168.59.3 --netmask 255.255.255.0 --lowerip 192.168.59.103 --upperip 192.168.59.203
$ VBoxManage dhcpserver modify --ifname vboxnet0 --enable
$ docker-machine create --driver "virtualbox" --virtualbox-cpu-count "-1" --virtualbox-disk-size "30000" --virtualbox-memory "2560" --virtualbox-hostonly-cidr "192.168.59.3/24" dev

【讨论】:

    【解决方案2】:

    等待issue 1709 的分辨率,我使用以下脚本(Windows 脚本,适用于mac)。
    (来源:imranraja85micheletedeschicomment

    dmvbf.bat:
    
    @echo off
    setlocal enabledelayedexpansion
    set machine=%1
    if "%machine%" == "" (
        echo dmvbf expects a machine name
        exit /b 1
    )
    set ipx=%2
    if "%ipx%" == "" (
        echo dmvbf x missing ^(for 192.168.x.y^)
        exit /b 2
    )
    set ipy=%3
    if "%ipy%" == "" (
        echo dmvbf y missing ^(for 192.168.x.y^)
        exit /b 3
    )
    
    echo kill $(more /var/run/udhcpc.eth1.pid) | docker-machine ssh %machine% sudo tee /var/lib/boot2docker/bootsync.sh >NUL
    echo ifconfig eth1 192.168.%ipx%.%ipy% netmask 255.255.255.0 broadcast 192.168.%ipx%.255 up | docker-machine ssh %machine% sudo tee -a /var/lib/boot2docker/bootsync.sh >NUL
    
    docker-machine ssh %machine% "sudo cat /var/run/udhcpc.eth1.pid | xargs sudo kill"
    
    docker-machine ssh %machine% "sudo ifconfig eth1 192.168.%ipx%.%ipy% netmask 255.255.255.0 broadcast 192.168.%ipx%.255 up"
    

    我启动虚拟机(docker-machine start <machine-name>),然后:

    dmvbf <machine-name> 99 101
    

    我只这样做一次。

    在下一个docker-machine start &lt;machine-name&gt;,IP 将是 192.168.99.101。

    【讨论】:

      【解决方案3】:

      基于 docker/machine feature request thread 的讨论,我们写了following script

      Usage: docker-machine-ipconfig <command> args...
      
      Commands:
          ls                             List running docker-machines' ip addresses
      
          static <machine> [ip-address]  Configure <machine> to use a static IP address
                                         (default is current address)
      
          dhcp <machine>                 Configure <machine> to use DHCP client to gather IP address
      
          hosts                          Update /etc/hosts file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        相关资源
        最近更新 更多