Machine: [功能请求] 为 VirtualBox 虚拟机指定一个静态 IP

创建于 2015-08-16  ·  212评论  ·  资料来源: docker/machine

嗨,我一直在搜索文档和问题来解决这个问题,但找不到答案。

基本上,当我使用docker-machine create创建 VM 时,我希望能够指定 VM 的 IP 地址(即docker-machine ls “URL”下列出的值)。

我想要这个是因为我一直依赖于 boot2docker 的默认地址 192.168.59.103,但现在它因机器而异。

谢谢!

drivevirtualbox kinenhancement

最有用的评论

伙计们,来吧。 我们能否在一个明显长期存在的问题上停止 +1? 出于这个特殊原因,我们实现了一个“赞”按钮。 无需向订阅者发送垃圾邮件。

所有212条评论

+1,需要这个功能

+1

+1

+1

这是一个很好的解决方法。 将以下内容添加到您的~/.bash_profile

eval `docker-machine env <docker-machine name>`
export <some variable>=$(docker-machine ip <docker-machine name>)

@letsgolesco您可以--virtualbox-hostonly-cidr选项,这将选择正确的vboxnetX仅主机适配器。

默认情况下,似乎 docker-machine 随机选择一个,因此强制将其用于vboxnet0192.168.59.3/24 ,boot2docker 使用的那个)似乎解决了这个问题:

$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.59.3/24" dev
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env dev

$ docker-machine ip dev
192.168.59.103

干杯。

@luislavena - 不幸的是这不起作用。

+1

不过肯定需要这个功能!

@krinkere不确定您的环境,但这对我的 OSX 安装有效,但在 Linux 上使用机器时失败,这需要调整vboxnet0 dhcpserver 配置:

$ 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

正如你所看到的,这是一个巨大的 hack :smile_cat:,但现在有效 :smile:

很想看到这个功能!!

@luislavena - 感谢您的回复

这是我在 Mac 上得到的。

$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.99.3/24" dev
正在创建 VirtualBox 虚拟机...
正在创建 SSH 密钥...
正在启动 VirtualBox 虚拟机...
启动虚拟机...
要查看如何将 Docker 连接到这台机器,请运行:docker-machine env dev

$ docker-machine ip dev
192.168.99.100

虽然我在正确的子网中有 ip,但它不是我想要使用的 IP...Def 很想看到这个功能

+1 有用的功能

+1 这个功能真的可以帮到我们!

我们使用 docker-machine 运行本地 Elasticsearch 集群,我们有/etc/hosts条目用于192.168.59.103映射到elastic-local.mycompany.com 。 由于我们已经从 boot2docker 转移到 docker-machine,我们不得不不断地手动更新这个 hosts 文件条目到分配给我们的 docker VM 的任何新 IP。 我们可以编写一些自动化来为我们更新这个 hosts 文件条目,但如果 docker-machine 只是让我们为新机器使用可配置的 IP 地址,那会简单得多。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1(和)

+1

+1

+1

暂时我正在使用一些 bash 脚本来更新主机文件,但很麻烦,因为您必须通过 sudo 脚本更新 /etc/hosts 但因为您可以从 docker-machine 获取 ip 它可以工作。 我可以分享一个要点。

ianlintner-wf,请分享脚本。 我即将自己写一个完全一样的,但如果我不能重新发明轮子那会很棒......是的......

这是我正在使用的主要脚本。 我稍微清理了一下,但它缺少更正式的默认参数和其他东西。

https://gist.github.com/ianlintner-wf/a2b917158aaf100d9fb3

+1 请!

感谢@ianlintner-wf 的脚本。 我写了一个动态添加任何正在运行的 docker 机器的主机/IP。 已在 OS X El Capitan 上进行测试。

https://gist.github.com/cookandy/f14fadd31721dc6e136e

IP 增量由 VirtualBox DHCP 服务器缓存。 停止并重新启动 VirtualBox 将重置 IP 增量。

+1,我们的 OSX 开发人员仍在使用 boot2docker,因为我们的 env 依赖于静态 /etc/hosts 条目。 (顺便说一句,感谢@ianlintner-wf 的脚本)

+1

+1

+1

+1

+2

我的 hacky-hack 解决方案,绝对不适合所有人:我在 docker 机器上运行 Cassandra,我希望能够从我正在开发的 node.js 应用程序中访问它。 我没有为 docker 机器使用固定 IP,而是:

docker-machine stop dockervm
VBoxManage modifyvm "dockervm" --natpf1 "tcp-port9160,tcp,,9160,,9160"
VBoxManage modifyvm "dockervm" --natpf1 "tcp-port9042,tcp,,9042,,9042"
docker-machine start dockervm
eval "$(docker-machine env dockervm)"

它为从本地主机到 docker VM 的端口隧道启用端口转发。 现在我可以连接到localhost:9042。 (如果有人要修复 https://github.com/docker/machine/issues/41,这会容易得多。:D)

@luislavena谢谢,刚刚用这些选项重新创建了默认机器,现在一切正常

+1

+1,我将尝试使用自动更新主机文件的脚本,但我绝对想要这个功能!

基于@cookandy和@ianlintner-wf 脚本,我创建了我的脚本。

您可以使用 docker-machine-name 和主机名之间的映射对其进行配置。

它将通过删除旧的 docker 机器 ips 和新的来更新您的主机

https://gist.github.com/juliengarcia/9a208ca5cf6590b25150

+1

:+1:

+1

+1

:+1:

+1

+1

+1

如果 IP 发生变化,Docker 会告诉我重新生成证书,我需要设置一个静态 IP 来避免这个问题,还是有其他解决方案?

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

Error running connection boilerplate: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.101:2376": x509: certificate is valid for 192.168.99.108, not 192.168.99.101
You can attempt to regenerate them using 'docker-machine regenerate-certs name'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.

+1 关于此功能的任何预计到达时间?

某些用例的解决方法可能是创建这样的机器:

192.168.98.100

docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.98.1/24" m98

192.168.97.100

docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.97.1/24" m97

192.168.96.100

docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.96.1/24" m96

如果没有其他机器具有相同的cidr ,则机器在启动时应始终获得.100 IP。

@schmunk42很好的解决方法:+1:

我的虚拟机的 dhcp 范围是 192.168.99.100 - 255,我想在 100 之前设置一个 IP。

我发现了一个设置静态 IP 的简单技巧:创建机器后,我运行此命令并重新启动机器:

echo "ifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh prova-discovery sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null

此命令创建一个文件 bootsync.sh,由 boot2docker 启动脚本搜索并执行。

现在在机器启动期间执行命令并设置静态 IP。

docker-machine ls
NAME              ACTIVE   DRIVER       STATE     URL                                      SWARM
test-1                      -        virtualbox     Running   tcp://192.168.99.50:2376      test-1 (master)

这也是一个很好的技巧@micheletedeschi :+1:

我喜欢@micheletedeschi解决这个问题的方式。 似乎是一种简单而标准的方法,不涉及修改 docker-machine。 也许这应该在某处记录?

您可以在此处此处找到一些文档

+1
我正在使用 3 个 VM,但在通过 ssh 连接和配置我的工具、主机文件等时总是遇到问题。

+1

:+1:

+1

+1

+1

+1

+1 我正在尝试自动创建机器,并且不能期望有权限一遍又一遍地向/etc/hosts添加条目。 拥有稳定的 ip 意味着只需设置一次。

我最终设置了一个脚本,该脚本使用 docker-machine ip 在主机上预填充 dnsmasq

在2015年12月19日,在12:18,佩德罗Cattori [email protected]写道:

+1


直接回复此邮件或在 GitHub 上查看。

一个非常有用的功能:+1:

喜欢@micheletedeschi的修复,尽管我最终将 IP 放在虚拟接口上(在上面的命令中将eth1替换eth1:1 ),因为 eth1 接口正在运行 DHCP 并且最终将恢复为DHCP 分配的 IP 地址。

不确定 dhcp 租约刷新时间有多长(在我突然收到“您需要重新生成 TLS 证书”错误并意识到发生了什么之前,使用初始修复运行了一天)。 如果将 IP 放在虚拟接口上没有坚持,将报告

@drags我已经用以下命令更新了命令:

echo "kill `more /var/run/udhcpc.eth1.pid`\nifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh prova-discovery sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null

然后运行命令(仅第一次)

docker-machine regenerate-certs prova-discovery

现在IP不会被DHCP改变

:+1:

+1

:+1:

+1

+1

+1

有没有人幸运地编写了@micheletedeschi的解决方法? 我想要团队中的每个人都可以运行的单个命令来启动开发虚拟机。 我尝试了以下方法:

docker-machine create -d virtualbox dev
echo "ifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh dev sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null
sleep 30
docker-machine restart dev
sleep 30
docker-machine regenerate-certs -f dev

当我手动运行命令时,它可以工作。 在脚本中,我必须输入 sleep 30 否则重启命令就会挂起。 现在脚本成功完成,但在运行后,虚拟机仍在使用旧 IP 运行。

你可以使用 vagrant 来启动 docker 机器,然后使用像 vagrant-hostmanager 这样的插件。 但是当然,如​​果您希望它成为跨平台启动 VM 的单个命令,那么您还有其他问题需要处理。

目前还没有完美的解决方案(afact)。

是的,我想我现在会坚持使用 Vagrant。

我正在构建一个带有DOCKER_OPTS="-H 0.0.0.0:2375"运行的 docker 的 Vagrant 框图像。 然后我可以创建一个带有专用网络硬编码 IP 的 vagrant vm,并使用该 IP 设置 DOCKER_HOST 和 /etc/hosts,我认为这将是一个非常理想的设置。

+1,尤其是使用机器驱动程序 vmwarevsphere

+1

+1

+1

+1,只能设置机器的 IP 地址。 目前 CLI 只支持获取它。 使用 AWS 弹性 IP 需要这样做。 否则机器的 config.json 必须手动更新。

~/.docker/machine/machines/my-machine-with-aws-elastic-ip/config.json

@dcosson编写脚本。

我只是启动 docker-machine 然后运行以下 2 个命令(一个杀死 dhcp 客户端,两个设置静态 ip)。 我选择不运行“docker restart”来触发 bootsync.sh。 也许那个启动脚本不起作用? 也有可能是 dhcp 客户端把你搞砸了并重置了你的 eth1 IP。

echo "kill `more /var/run/udhcpc.eth1.pid`\nifconfig eth1 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh <machine-name> sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null
docker-machine ssh <machine-name> "sudo ifconfig eth1 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255 up"

+1

+1

我不得不稍微修改@roocell的代码段以立即

echo "kill `more /var/run/udhcpc.eth1.pid`\nifconfig eth1 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh <machine-name> sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null

docker-machine ssh <machine-name> "sudo cat /var/run/udhcpc.eth1.pid | xargs sudo kill"

docker-machine ssh <machine-name> "sudo ifconfig eth1 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255 up"

我有一种感觉,没有在运行 consul 的机器上设置静态 ip 会给我的 swarm 集群带来问题。 +1 为此

+1

+1

+1

+1

+1

+1_000000 :)

+1

根据@micheletedeschi评论,这是我的脚本,用于为 docker-machine VM 设置固定 IP:
http://stackoverflow.com/a/35367277/6309

+1

+1

+1

+1

我所做的是在任何地方创建主机文件的副本。

为要动态更改的部分设置占位符

<docker-machine-ip> doctify.local.com
<docker-machine-ip> doctify.local.co.uk
<docker-machine-ip> www.doctify.local.com
<docker-machine-ip> www.doctify.local.co.uk

仅供参考:我使用 gnu-sed 作为我的默认 sed,所以它不会是你 mac 上的那个
brew install gnu-sed --with-default-names

在我的启动脚本中,我只是用 sed 替换它们,然后切换出主机文件。 现在,如果您拥有与以前相同的主机文件副本。 它不应影响您的任何其他服务

#!/bin/bash

echo
echo "########################################################"
echo "####              Update Docker Dev Hosts           ####"
echo "########################################################"
echo

machine_name="doctify-dev"

update_hosts() {
    echo
    # Copy over default hosts file
    echo "Copy Default Hosts..."
    cp -fv nginx/hosts docker/hosts

    echo
    # Replace with actual ip address
    echo "Replace hosts file..."
    echo "$machine_name IP ($machine_ip)"
    sed -i -e "s|<docker-machine-ip>|$machine_ip|g" docker/hosts

    echo
    # Move to /etc/hosts
    echo "Move hosts to correct location..."
    sudo mv -fv docker/hosts /etc/hosts

    echo
    # Remove copied hosts file
    echo "Clean up hosts file if it still remains..."
    rm -rfv docker/hosts
}

echo
# Get Current IP
echo "Retrieving Current IP Address..."
ip=($(cat /etc/hosts | grep doctify.local.com | sed -n '1p'))
echo "Current IP: $ip"

echo
# Get IP address of docker machine
echo "Get Current Machine IP address..."
machine_ip=$(docker-machine ip $machine_name)
echo "Machine IP: $machine_ip"

echo
if [ "$ip" = "$machine_ip" ]; then
    echo "IP Addresses are matching. Exiting..."
else
    echo "IP Addresses differ. Updating..."
    update_hosts
fi

启动脚本:

#!/bin/bash

echo
echo "########################################################"
echo "####            Start Docker Dev Environment        ####"
echo "########################################################"
echo

$machine_name=doctify-dev

echo
echo "Start Machine..."
docker-machine start $machine_name

echo
echo "Attach Machine to Terminal..."
eval $(docker-machine env --shell bash $machine_name)

echo
echo "Update hosts IP..."
source docker/update-hosts

echo
echo "Set Machine IP as Hostname..."
export DOCKER_HOST_IP=$(docker-machine ip $machine_name)

echo
echo "Clean Docker Images..."
source docker/clean

echo
echo "Build Docker Images..."
docker-compose build

echo
echo "Start Docker Images..."
sh docker/bin/osx-dev -r "docker-compose up" -i ".rsyncignore"

+1

+1

+1

+1

+1

+1

+1

+1

这是我用来创建具有一致 IP 的 docker-machine 环境的内容:

#--- Usage: d-machine-static new_dm_name new_dm_ip [new_dm_memory]
function d-machine-static {
    new_dm_name="${1}"
    new_dm_ip="${2:-192.168.90.100}"
    new_dm_memory="${3:-1024}"
    docker-machine create -d virtualbox --virtualbox-hostonly-cidr "${new_dm_ip}/24" --virtualbox-memory "${new_dm_memory}" "${new_dm_name}"
    echo -e "\033[1;34m${new_dm_name}\033[0m = \033[0;32m$(/usr/local/bin/docker-machine ip ${new_dm_name})\033[0m"
}

一些 IP 往往比其他 IP 更频繁地成功,我对192.168.x.100形式的那些 IP 运气最好,

这是我用来在它们之间快速切换的内容:

#--- Switch to a different docker-machine environment.
function d-env () {
    target_environment="${1}"
    if [[ $(/usr/local/bin/docker-machine status ${target_environment}) = "Stopped" ]]; then
        docker-machine start "${target_environment}"
        sleep 1
    fi
    eval "$(/usr/local/bin/docker-machine env ${target_environment})"
    echo -e "\033[1;34m${target_environment}\033[0m = \033[0;32m$(/usr/local/bin/docker-machine ip ${target_environment})\033[0m"
}

随意使用、修改和分发您心中的内容。

+1

我还必须添加默认网关...

这是我在 Windows 10 上使用 PowerShell 和 Hyper-V(使用用于 NAT 而不是 ICS 的 VMNat.dll 服务)执行此操作的方法。

  • 子网是 192.168.233.0/24
  • DHCP 服务器在 .1 上运行
  • .2 上的 DNS 和 NAT
  • 新的 docker-machine 采用 .10 静态 IP

`````` PowerShell
docker-machine create --driver hyperv --hyperv-virtual-switch "VMWare NAT" --hyperv-memory "512" consul0

尚未测试默认网关在重启后是否工作....

echo "kill ``more /var/runudhcpc.eth0.id```nifconfig eth0 192.168.233.10 网络掩码 255.255.255.0 广播 192.168.233.255 up" | docker-machine ssh consul0“sudo tee /var/lib/boot2docker/bootsync.sh”> $null

立即杀死 eth0 接口上的 dhcp

docker-machine ssh consul0 "sudo cat /var/run/udhcpc.eth0.pid | xargs sudo kill"

使用新的静态 IP 启动 eth0..

以下命令挂起...我必须在一段时间后按 CTRL+C...

docker-machine ssh consul0“sudo ifconfig eth0 192.168.233.10 网络掩码 255.255.255.0 广播 192.168.233.255 up”

修复旧动态 IP 的 tls 证书

docker-machine regenerate-certs consul0

通过重新添加默认网关确保互联网仍然有效(在我的情况下它丢失了)

docker-machine ssh consul0“路由添加默认gw 192.168.233.2”
``````

很高兴知道:

#get the ip
$(Get-VM consul0).NetworkAdapters[0].IPAddresses[0]

#open vmconnect
$vm=Get-VM consul0

vmconnect $env:COMPUTERNAME $vm.Name -G $vm.Id

注意:有时 boot2docker init 似乎失败并且 Hyper-V 无法获取适配器 IP...

+1

+1

我们还处于加一模式吗? :)

它一直在搞砸我的设置,并且提供固定的 ip 是完全有意义的,尤其是当您在本地为不同项目运行多个开发环境时

我们正在等待确认上述策略适用于在 Mac OSX 上使用 docker-machine 的其他人。 这是一个更简洁的形式:

1) 将变量x设置为 1 到 98 之间的任意整数。例如:
x='42'

2) 将变量new_dm_name设置为新
new_dm_name='magic'

3)运行这个命令:
docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.$x.100/24" "$new_dm_name"

您的新静态 IP 现在应该是 192.168.x.100,并且只要您不将该 IP 分配给其他任何内容,就应该在会话之间保持不变。 为了确认是这种情况,我建议运行以下命令:

docker-machine ip "$new_dm_name"
docker-machine stop "$new_dm_name"
docker-machine start "$new_dm_name"
docker-machine ip "$new_dm_name"

幸运的话,这也将适用于 Windows。

+1

好吧,我注定了。 我的公司使用192.168.99.x作为我们自己的本地 IP,所以请允许更改。

@xbeta - 您可以重新配置 VBox 网络吗? 我无法告诉您如何执行此操作,因为我使用的是 Hyper-V,但是如果您使用默认的 VBox 驱动程序,请查看由它创建的虚拟网卡, docker-machine是只是环绕 VBox

+1

请大家不要再发表 +1 评论了吗? Github 现在有 +1 功能。 只需点击右上角的 + 笑脸,然后点击大拇指图标。 它传达了您的支持,而无需向在此处发表评论的每个人发送电子邮件。 #kthxbye

https://blog.docker.com/2016/03/docker-for-mac-windows-beta/

更快更可靠:不再有 VirtualBox!

看起来 Docker 正在放弃 VirtualBox。 您可能想要调整您对这个问题的期望,直到得到修复。

+1

+1

+1

:+1:

+1

+1

+1

是的,请成为书呆子,继续加分。 它灌输了如此多的信心。

@everett-toews VirtualBox 对于 Swarm、Kubernetes、Nomad 等多主机 docker 解决方案仍然很有用。Mac 版 Docker 相当于一个主机设置(你的 mac 是主机)。
另一个本地解决方案是 VmwareFusion,它会在重新启动时保留主机的 ip。 顺便说一句,这是最近的修复。
所以是的,我们需要一种更简单的方法来为 VirtualBox 指定静态 ip。

@gittycat 是的。 这就是我仍然运行 Docker Toolbox 的原因。 只是为了我可以创建一个 Swarm。 即便如此,我还是更愿意看到这个功能请求: Docker for Mac/Windows 中的

+1

+1

+1

+1

+1

如果您需要为 boot2docker 机器设置静态 ip,只需编辑/var/lib/boot2docker/profile并添加

sudo cat /var/run/udhcpc.eth1.pid | xargs sudo kill 
sudo ifconfig eth1 <ip address to assign> netmask <subnet mask> broadcast <broadcast address> up

之后,您需要重新生成证书
docker-machine regenerate-certs rancher -f

+1

我认为是时候关闭这个无关紧要的请求了,至少对于 Mac n Windows 是这样。 我所有关于 docker-machine ip 的问题都被 docker for Mac 解决了。 大家觉得呢?

@caledhwa同意,

@caledhwa Docker for Mac 仅支持一台机器 - 如果您有多台机器设置,这仍然相关。

@caledhwa正如@davidolrik所说,Docker for Mac/Windows/AWS/Azure 仅支持 1 个主机,这将其排除在多节点 Swarm/Kubernete/Mesos/etc 开发、演示和测试之外。

👍

+1

还是没有动静? 这是使用 docker-machine 的阻止程序,因为我无法更改来宾的冲突网络地址。

能够修复 virtualbox 的 docker 机器 IP 是必要的功能。

我设置了几个 docker 主机作为 swarm 示例,重启后,几乎每个主机的 IP 都发生了变化,并且会出现错误:

x509: certificate is valid for 192.168.99.103, not 192.168.99.100

是的,我也许可以使用docker-machine regenerate-certs来解决证书问题,但是,键值存储的 IP 也发生了变化,结果是我的 swarm 停止工作,直到我在配置中手动更改它们再一次。

也许删除它们并再次创建这些主机会更好。 但是,这些主机中的每个图像/容器都将丢失。

所以,请尽可能指定主机的IP,或者只是为virtualbox docker主机自动分配固定IP,不要让它在重新启动时改变。

+1
我有一个案例,我将 dnsmaq 用于 DHCP 和 DNS,根据上面的评论,我尝试禁用虚拟框接口的 DHCP 服务器,在我的情况下,它的vboxnet4就像VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet4 ,需要重新启动从dnsmasq选择 DHCP 范围的机器,我面临的问题是,在每台新机器创建时,docker-machine 都在vboxnet4上启用 dhcp 服务器,而其他使用 dnsmasq 的服务器则无法查找 docker-machine(s),我必须重复删除 vnet,然后重新启动 docker-machines。 如果我们可以在 docker-machine-create 中添加一个标志来帮助不启用 dhcp 之类的东西,那就太好了。

+1

+1

+1

+1

这里有一个命令封装了@micheletedeschi的工作,并为在 DHCP 和静态配置之间切换提供了一些便利。 如果需要,它还会更新您的/etc/hosts文件。

https://github.com/fivestars/docker-machine-ipconfig

过去几周我们一直在使用它,并取得了巨大的成功。 在创建 docker 机器后立即运行它。

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

每个人都在考虑更“通用”的解决方案(docker-machine 本机功能),因为这个选项在 Vsphere、Azure 和其他部署环境中也很有趣。 但它真的很受欢迎。

+1

+1

+1

+1

+1

+1

@micheletedeschi的解决方法或多或少对我

+1,今天使用 ZooKeeper 和 VirtualBox 遇到了同样的问题

@micheletedeschi的解决方法或多或少对我

你在杀死 DHCP 客户端吗? 恢复后,您能否确认 DHCP 客户端仍未运行?

我找到了另一种最终对我有用的解决方法:我只需使用 _advertise=$(ifconfig eth1 | grep -Eo "192.168.99.1[0-9]{2}"):2376_ 在每台机器上启动 swarm 代理并发布当前到 ZooKeeper(或任何其他发现服务)的 IP。 在我的情况下这是可以的,因为我可以依靠每台机器分配一个 192.168.99.1** 地址(这只是一个实验设置)。 认为有更高级的正则表达式可以应用于任意 IP 范围。 这不是很好,可能有点hacky,但它可以完成工作。

+1

+1

随意更改 VM IP 和 TLS 证书在重新启动时突然变得无效导致了很多问题和浪费了工时

这甚至是优先考虑的吗? 这个案子已经开了整整13个月了。 +10000

我的猜测是 docker 机器团队中的一些人与世界其他地方在这个问题上存在哲学分歧。 对于我的所有用例,使用 DHCP 并拥有非确定性 IP 几乎毫无价值。

去年我一直在使用这种解决方法。 它改编自上述的一些单行解决方法。

SSH 到 docker 机器
docker-machine ssh 默认

添加/编辑 boot2docker 启动脚本
须藤 vi /var/lib/boot2docker/bootsync.sh

#!/bin/sh
/etc/init.d/services/dhcp stop
ifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up

须藤 chmod 755 /var/lib/boot2docker/bootsync.sh
出口

重新启动机器并重新生成证书
docker-machine 重启默认
docker-machine regenerate-certs 默认

+1

+1

+1(用于 docker-machine 和 jimmidyson/minishift)

+1

@eytanhanig不幸的是,你的方法对我不起作用。 我在 OS X 10.11.6 上。 机器获得所需的 IP,但连接到它们时出错。 Docker 建议重新生成密钥,但这并没有解决问题。

+1

+1

人们一直为此 +1 太荒谬了。

+1

我喜欢有这个功能,但是,我没有找到任何优雅的方法来实现它。

该问题是由 Virtualbox 中的 DHCP 引起的,如果系统重新启动,DHCP 服务器将丢失所有已分配的 IP 数据,并尝试为那些上一次不太可能具有相同 IP 的 VM 重新分配 IP。

我不确定让 Virtualbox 保留 DHCP 数据是否正确。 而且 Boot2docker 不会持久化 DHCP 分配的 IP,这实际上是正确的行为。

恕我直言,我不认为尝试解决 DHCP 是正确的方法,我认为添加为 Boot2docker 和 docker-machine 虚拟机驱动程序指定静态 IP 的功能应该可以解决问题。

最好先在https://github.com/boot2docker/boot2docker项目中实现静态IP,比如增加指定静态IP的能力,而不是使用DHCP。

这是触发 DHCP 调用的代码:

https://github.com/boot2docker/boot2docker/blob/master/rootfs/rootfs/bootscript.sh#L16

# Trigger the DHCP request sooner (the x64 bit userspace appears to be a second slower)
echo "$(date) dhcp -------------------------------"
/etc/rc.d/dhcp.sh
echo "$(date) dhcp -------------------------------"

我们可以通过在/var/lib/boot2docker/profile添加一组 IP 配置来使其有条件,如果已经配置了静态 IP,则使用静态 IP 而不是从 DHCP 请求 IP。

然后,我们可以为virtualbox驱动程序添加一个或多个选项来指定静态 IP 配置,例如--virtualbox-boot2docker-cidr , --virtualbox-boot2docker-gateway , --virtualbox-boot2docker-dns ...

+1

+1

+1

伙计们,来吧。 我们能否在一个明显长期存在的问题上停止 +1? 出于这个特殊原因,我们实现了一个“赞”按钮。 无需向订阅者发送垃圾邮件。

无需向订阅者发送垃圾邮件。

您可以取消订阅。
1

我完全赞成向订阅者发送垃圾邮件。

其中一些订阅者是项目团队的一部分。

2017 年 1 月 26 日 14:20,“Sergey Nevmerzhitsky”通知@github.com
写道:

无需向订阅者发送垃圾邮件。

您可以取消订阅。
[图像:1]
https://cloud.githubusercontent.com/assets/1006042/22332699/4cf1a8b4-e3e3-11e6-8bad-52406c3b8055.png


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/docker/machine/issues/1709#issuecomment-275386350
或静音线程
https://github.com/notifications/unsubscribe-auth/AG44NZ2KdnsH6JTU6iI_5Uieh9WZxWXBks5rWJ2RgaJpZM4FsQYg
.

我完全赞成向订阅者发送垃圾邮件。
其中一些订阅者是项目团队的一部分。

维护者签入。请_不要_使用 +1 评论对该问题进行垃圾邮件处理。 这是一个众所周知的问题,向该线程发送垃圾邮件没有任何好处。 如果您愿意,请通过“+1”表情符号反应表示支持。 与往常一样,我们很乐意评估拉取请求或详细提案。 谢谢大家。

(作为旁注, @twang2218似乎总体上有正确的想法——静态 IP 比他们看起来正确并击中该线程订阅者可能想到的用例更棘手——也许问题可以在boot2docker repo 来讨论。)

我真的不想要一个静态 ip。 但是一旦在创建过程中选择了 ip 地址,它应该在后续重新启动时保留它。 这已经可用了吗?

我有一个带 VPN 的 docker,标准 192.168.99.100 没有加载。 我认为这是因为 VPN 连接,所以我在 Virtualbox 内设置了一个桥接网络,以通过 192.168.1.159 访问 docker。 我希望它显示在 Kitematic 已发布的 IP 地址上。 有什么办法吗?

对于那些迫不及待实现此功能的人,可以使用Vagrant VirtualBox 提供程序docker-machine 通用驱动程序分配自定义 ip 以及自定义 cpu/内存。

例如在 Windows 中,放置这个 Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "AlbanMontaigu/boot2docker"
  config.vm.provider "virtualbox" do |v|
    v.memory = 8192
    v.cpus = 8
  end
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder "C:/Users", "/c/Users"
  config.vm.network "private_network", ip: "192.168.99.103"
end

并放置名称vagrant.pem vagrant 默认 ssh 私钥

并运行

vagrant up
docker-machine create --driver generic --generic-ip-address=192.168.99.103 --generic-ssh-user=docker --generic-ssh-key=vagrant.pem default
docker-machine ls

并且您将获得通过 vagrant 配置的具有自定义 ip、cpu、内存等的 docker 主机,同时可通过 docker-machine 访问。

您可以在https://github.com/joelhandwell/dockerhost 中找到适用于 Windows 的工作文件集

@jcwilson嗨,Josh 等人,非常感谢……我分叉了你的脚本以解决同样的问题(参见 https://github.com/minishift/minishift/issues/343、https://github.com/minishift /minishift/issues/598) 与 minishift 结合使用:

https://github.com/ahilbig/docker-machine-ipconfig

任何新闻?

目前,我正在为 Minishift 试验这个: https :
虽然,另一种方法是使用诸如 cloud-init 之类的东西(这对于这种方法来说可能很繁重,或者在基于 Go 的二进制文件中嵌入一个 DHCP 服务器并使用它来强制分配的 IP 地址)

+1。
目前拥有不止一台机器是可怕的痛苦。 如果您使用其他证书(例如,用于自定义 docker 存储库)并更改启动机器的顺序,则必须执行以下操作:

Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376"
: x509: certificate is valid for 192.168.99.101, not 192.168.99.100

这会迫使您重新生成证书或禁用所有机器并恢复执行顺序(有时也会很痛苦)。

此外,如果您可以假设创建的机器始终具有相同的 IP(例如,将其添加到主机文件并且您可以忘记 IP),那么使用 Chef 配置基于 Docker 的项目也会好得多。

+1

+1

+1
thx jcwilson,脚本docker-machine-ipconfig 非常好! 我需要将脚本中的 eth1 更改为 eth0,此后,该脚本对我来说非常适合。 我正在使用 vmware vsphere。

再见。

+1

作为 minishift 的一部分,我们已经实施了https://github.com/minishift/minishift/issues/1316并且到目前为止运行良好。 随着时间的推移,我们正在寻找替代方案来为其他管理程序做同样的事情,但首先我们将使用https://github.com/minishift/minishift/issues/1457修复地址(以防止分配新地址) . 我们还没有能够预留时间,我们也将在 minikube 上登陆。

+1

我发现的最简单的解决方法是依靠 doker-machine 启动虚拟机的顺序。

VirtualBox 有 DHCP 服务器,它从 192.168.99.100 开始分配 IP 地址。

  1. 停止所有虚拟机
    docker-machine stop ${docker-machine ls -q}
    此步骤将释放所有分配的地址给 VirtualBox DHCP

  2. 按顺序启动虚拟机
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    此步骤分配 IP 如下:
    192.168.99.100:vbox1
    192.168.99.101:vbox2
    192.168.99.102:vbox3

请注意docker-machine start vbox1 vbox2 vbox3不起作用,但我不知道为什么。

+1

当我运行docker-machine.exe start ,DHCP waiting for an IP需要超过 15 秒(如果互联网坏了,需要超过 2 分钟),我认为如果可以设置静态 ip,它可以快速启动.

此功能已被添加到 Minishift spome 之前,但它
需要修改 ISO 才能运行。
在 Hyper-V 上,我们遇到了 boot2docker 镜像没有的问题
玩得很好......所以它只适用于基于 CentOS 和 Fedora 的图像。
此外,这不适用于当前的 KVM 驱动程序,因为它依赖于 DHCP。

这需要稍微重新设计...

在Sun,2019年2月3日在下午11时08 fcying [email protected]写道:
>

当我运行 docker-machine.exe start 时,DHCP 等待 IP 需要超过 15 秒(如果互联网坏了,需要超过 2 分钟),我认为如果可以设置静态 ip,它可以快速启动。


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看,或将线程静音。

——

杰拉德·布拉德 | http://gbraad.nl
[ 做开源事项 ]

我发现的最简单的解决方法是依靠 doker-machine 启动虚拟机的顺序。

VirtualBox 有 DHCP 服务器,它从 192.168.99.100 开始分配 IP 地址。

  1. 停止所有虚拟机
    docker-machine stop ${docker-machine ls -q}
    此步骤将释放所有分配的地址给 VirtualBox DHCP
  2. 按顺序启动虚拟机
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    此步骤分配 IP 如下:
    192.168.99.100:vbox1
    192.168.99.101:vbox2
    192.168.99.102:vbox3

请注意docker-machine start vbox1 vbox2 vbox3不起作用,但我不知道为什么。

有时我不得不在 Windows 上杀死 VBoxNetDHCP.exe 进程,以使 vbox 从 192.168.99.100 开始分配 IP
否则,vbox 不会释放以前机器使用的 IP(不知道为什么)

👍

这真的会让我的生活更轻松。

我发现的最简单的解决方法是依靠 doker-machine 启动虚拟机的顺序。

VirtualBox 有 DHCP 服务器,它从 192.168.99.100 开始分配 IP 地址。

  1. 停止所有虚拟机
    docker-machine stop ${docker-machine ls -q}
    此步骤将释放所有分配的地址给 VirtualBox DHCP
  2. 按顺序启动虚拟机
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    此步骤分配 IP 如下:
    192.168.99.100:vbox1
    192.168.99.101:vbox2
    192.168.99.102:vbox3

请注意docker-machine start vbox1 vbox2 vbox3不起作用,但我不知道为什么。

这是非常有用的。

为了将static ip address 192.168.99.50分配给 VirtualBox 上的 docker-machine(默认),我使用了:

$ echo -e "kill \`cat /var/run/udhcpc.eth1.pid\`\nifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh default sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null

$ docker-machine restart default
Restarting "default"...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Waiting for SSH to be available...
Detecting the provisioner...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

$ docker-machine env
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.50:2376": x509: certificate is valid for 192.168.99.103, not 192.168.99.50
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which might stop running containers.

$ docker-machine regenerate-certs default
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...

$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.50:2376"
export DOCKER_CERT_PATH="/Users/mandrake/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env)

我的环境是OSX,VirtualBox(boot2docker.iso)

希望这对你有用🙂
顺便说一句:对于新功能请求 +1 😉
干杯。

是的,可以选择使用特定 ip 创建。 您需要做的就是指定 ip/ip-range
--virtualbox-hostonly-cidr选项。

例如:

  • 当你想分配特定的ip时,假设你想分配10.15.1.24,那么适当的配置将是(最重要的是我们在这里使用的掩码。对于特定的ip,您需要将子网掩码设置为32):
    docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "10.15.1.24/32" dev

  • 如果要从特定 ip 范围中选择一个 ip,则需要使用适当的子网掩码。

如果你的问题是你必须不断更新你的主机文件,你可以在你的容器上安装 Avahi 并使用 mDSN。

此页面是否有帮助?
0 / 5 - 0 等级