Machine: [Solicitud de función] Especifique una IP estática para las máquinas virtuales de VirtualBox

Creado en 16 ago. 2015  ·  212Comentarios  ·  Fuente: docker/machine

Hola, he estado buscando en los documentos y problemas para resolver esto, pero no puedo encontrar una respuesta.

Básicamente, quiero poder especificar la dirección IP de una máquina virtual (es decir, el valor que aparece en "URL" en docker-machine ls ) cuando la creo con docker-machine create .

Quiero esto porque he estado confiando en la dirección predeterminada de boot2docker de 192.168.59.103, pero ahora varía de una máquina a otra.

¡Gracias!

drivevirtualbox kinenhancement

Comentario más útil

Chicos, vamos. ¿Podríamos dejar de hacer +1 en un problema obviamente de larga duración? Hubo un botón Me gusta implementado por esa razón en particular. No es necesario enviar spam a los suscriptores.

Todos 212 comentarios

+1, necesito esta función

+1

+1

+1

Aquí tienes una buena solución. Agregue lo siguiente a su ~/.bash_profile :

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

@letsgolesco , puede usar la opción --virtualbox-hostonly-cidr para eso, que seleccionará el adaptador de solo host vboxnetX adecuado.

De forma predeterminada, parece que la máquina acoplable elige uno al azar, por lo que se ve obligado a usar el de vboxnet0 ( 192.168.59.3/24 , el que usa boot2docker) parece resolver el problema:

$ 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

Salud.

@luislavena - Desafortunadamente, eso no funcionó.

+1

¡Sin embargo, definitivamente necesito esta característica!

@krinkere no estoy seguro de su env, pero esto funcionó para mi instalación de OSX al hacer eso, pero falló al usar la máquina en Linux, lo que requirió ajustes en la configuración de dhcpserver de vboxnet0 :

$ 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

Este es, como puede ver, un gran truco: smile_cat :, pero funciona por ahora: smile:

¡Me encantaría ver esta función!

@luislavena - Gracias por tu respuesta

Esto es lo que obtengo en mi Mac.

$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.99.3/24" dev
Creando VirtualBox VM ...
Creando clave SSH ...
Iniciando VirtualBox VM ...
Iniciando VM ...
Para ver cómo conectar Docker a esta máquina, ejecute: docker-machine env dev

$ docker-machine ip dev
192.168.99.100

Si bien tengo una IP en la subred correcta, no es la IP que me gustaría usar ... A Def le encantaría ver esta función

+1 característica útil

+1 ¡Esta función realmente nos ayudaría!

Usamos docker-machine para ejecutar un clúster de Elasticsearch local y tenemos la entrada /etc/hosts para 192.168.59.103 que se asigna a elastic-local.mycompany.com . Desde que nos hemos trasladado a docker-machine desde boot2docker, hemos tenido que actualizar manualmente de forma continua esta entrada del archivo de hosts a la nueva IP asignada a nuestra máquina virtual docker. Podríamos escribir algo de automatización que actualizaría esta entrada del archivo de hosts para nosotros, pero sería mucho más simple si docker-machine nos permitiera usar una dirección IP configurable para nuevas máquinas.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 (y)

+1

+1

+1

Temporalmente, estoy usando algunos scripts bash para actualizar los archivos de hosts, pero es complicado ya que tiene que actualizar / etc / hosts a través del script sudo'd, pero como puede obtener ip de la máquina acoplable, funciona. Puedo compartir una idea.

ianlintner-wf, comparta el script por favor. Estoy a punto de escribir uno exactamente así yo mismo, pero si no puedo reinventar la rueda, sería genial ... sí ...

Aquí está el script principal que estoy usando. Lo limpié un poco, pero carece de parámetros predeterminados más formales y otras cosas.

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

+1 por favor!

gracias por el script @ ianlintner-wf. He escrito uno que agrega dinámicamente el host / ip de cualquier máquina acoplable en ejecución. Probé en OS X El Capitan.

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

El incremento de IP es almacenado en caché por el servidor DHCP de VirtualBox. Detener y reiniciar VirtualBox restablecerá el incremento de IP.

+1, nuestros desarrolladores de OSX todavía están usando boot2docker porque nuestro entorno se basa en entradas estáticas / etc / hosts. (por cierto, gracias por el script @ ianlintner-wf)

+1

+1

+1

+1

+2

Mi solución hacky-hack, que definitivamente no es para todos: estoy ejecutando Cassandra en una máquina acoplable y quiero poder acceder a ella desde la aplicación node.js que estoy desarrollando. En lugar de usar una IP fija para la máquina acoplable, hago:

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)"

que habilita el reenvío de puertos para la tunelización de puertos desde localhost a la máquina virtual docker. Ahora puedo conectarme a localhost: 9042. (Esto sería mucho más fácil si alguien arreglara https://github.com/docker/machine/issues/41.: D)

@luislavena gracias, acabo de recrear la máquina predeterminada con estas opciones y todo funciona bien ahora

+1

+1, intentaré el script con la actualización automática del archivo de hosts, ¡pero definitivamente quiero esta función!

Basado en el script @cookandy & @ ianlintner-wf, he creado el mío.

Puede configurarlo con un mapa entre docker-machine-name y host name.

Actualizará sus hosts eliminando las ips antiguas de la máquina acoplable y las nuevas.

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

+1

: +1:

+1

+1

: +1:

+1

+1

+1

Docker me dice que regenere certificados si la IP cambia, necesito establecer una IP estática para evitar este problema o hay otra solución?

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 cualquier ETA en esta función?

Una solución para algunos casos de uso podría ser crear máquinas como esta:

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

Si no hay otra máquina con el mismo cidr , la máquina siempre debe obtener la IP .100 al inicio.

@ schmunk42 muy buen trabajo: +1:

Mi virtualbox tiene un rango dhcp 192.168.99.100 - 255 y quiero establecer una IP antes de 100.

Encontré un truco simple para configurar una IP estática: después de crear una máquina, ejecuto este comando y reinicio la máquina:

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

Este comando crea un archivo bootsync.sh que es buscado por los scripts de inicio de boot2docker y ejecutado.

Ahora, durante el arranque de la máquina, se ejecuta el comando y se establece una IP estática.

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

Ese es un buen truco también @micheletedeschi : +1:

Me gusta la forma en que @micheletedeschi arregló esto. Parece una forma fácil y estándar que no implica modificaciones de la máquina acoplable. ¿Quizás esto debería documentarse en alguna parte?

Puede encontrar documentación aquí o aquí.

+1
Estoy trabajando con 3 VM y siempre tengo problemas para conectarme a través de ssh y configurar mis utilidades, archivos de hosts, etc.

+1

: +1:

+1

+1

+1

+1

+1 Estoy tratando de automatizar la creación de máquinas y no puedo esperar tener permisos para agregar entradas a /etc/hosts una y otra vez. Tener una ip estable significaría tener que configurar esto solo una vez.

Terminé configurando un script que llena previamente dnsmasq en el host usando la ip de la máquina docker

El 19 de diciembre de 2015, a las 12:18 p.m., Pedro Cattori [email protected] escribió:

+1

-
Responda a este correo electrónico directamente o véalo en GitHub.

Una característica muy útil: +1:

Me encanta la solución de terminé poniendo la IP en una interfaz virtual (reemplace eth1 con eth1:1 en el comando anterior) ya que la interfaz eth1 está ejecutando DHCP y eventualmente volverá a la dirección IP asignada por DHCP.

No estoy seguro de cuánto tiempo dura el tiempo de actualización de la concesión de dhcp (se ejecutó durante un día con la solución inicial antes de que apareciera de repente el error "necesita regenerar certificados TLS" y me di cuenta de lo que estaba pasando). Informará si poner la IP en una interfaz virtual no se pega

@drags He actualizado los comandos con:

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

luego ejecute el comando (solo la primera vez)

docker-machine regenerate-certs prova-discovery

ahora la IP no será cambiada por el DHCP

: +1:

+1

: +1:

+1

+1

+1

¿Alguien ha tenido suerte escribiendo la solución alternativa de

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

Cuando ejecuto los comandos manualmente, funciona. En el script, tuve que poner en suspensión 30 o el comando de reinicio simplemente se colgaría. Ahora la secuencia de comandos finaliza correctamente, pero después de ejecutarse, la máquina virtual todavía se ejecuta con la IP anterior.

Puede usar vagrant para iniciar la máquina acoplable y luego usar un complemento como vagrant-hostmanager. Pero, por supuesto, tiene otros problemas con los que lidiar si desea que sea un solo comando para iniciar la plataforma cruzada de VM.

Simplemente no hay una solución perfecta en la actualidad (afaict).

Sí, creo que me quedaré con Vagrant por ahora.

Estoy creando una imagen de caja de Vagrant con la ventana acoplable ejecutándose con DOCKER_OPTS="-H 0.0.0.0:2375" . Luego puedo crear una máquina virtual vagabunda con una IP codificada de red privada y usar esa IP para configurar DOCKER_HOST y / etc / hosts, que creo que será una configuración bastante ideal.

+ 1, especialmente trabajando con el controlador de máquina vmwarevsphere

+1

+1

+1

+1, solo poder configurar la dirección IP de una máquina. Actualmente, la CLI solo admite su obtención. El uso de AWS Elastic IP requeriría esto. De lo contrario, el config.json de la máquina debe actualizarse manualmente.

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

@dcosson wrt scripting.

Simplemente inicio la máquina acoplable y luego ejecuto los siguientes 2 comandos (uno para matar al cliente dhcp, dos para configurar una dirección IP estática). Elegí no ejecutar el 'reinicio de la ventana acoplable' para activar bootsync.sh. ¿Quizás ese script de inicio no funciona? También es posible que el cliente dhcp lo esté arruinando y restableciendo la IP eth1 en usted.

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

Tuve que modificar ligeramente el fragmento de @roocell para matar el servidor dhcp inmediatamente porque no quería reiniciar. De lo contrario, se revertiría después de unos minutos.

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"

Tengo la sensación de que no establecer una IP estática en mi máquina que ejecuta consul es lo que me está dando problemas con respecto a mi grupo de enjambres. +1 para esto

+1

+1

+1

+1

+1

+ 1_000000 :)

+1

Basado en el comentario de @micheletedeschi , aquí está mi script para configurar una IP fija para una máquina virtual acoplable:
http://stackoverflow.com/a/35367277/6309

+1

+1

+1

+1

Lo que he hecho es crear una copia de su archivo de hosts en cualquier lugar.

Establezca un marcador de posición para las partes que le gustaría cambiar dinámicamente

<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

Para su información: estoy usando gnu-sed como mi sed predeterminado, por lo que no será el de su mac
brew install gnu-sed --with-default-names

y en mi script de inicio, simplemente reemplacé esos y luego cambié el archivo de hosts. Ahora, si tiene su copia de su archivo de hosts, lo mismo que antes. no debería afectar a ninguno de sus otros servicios

#!/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

Iniciar guion:

#!/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

Esto es lo que uso para crear mis entornos de máquina acoplable con IP consistentes:

#--- 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"
}

Algunas direcciones IP tienden a tener éxito con más frecuencia que otras, y he tenido la mejor suerte con las de la forma 192.168.x.100, de manera que x <99 .

Y esto es lo que uso para cambiar rápidamente entre ellos:

#--- 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"
}

Siéntase libre de usar, modificar y distribuir al contenido de su corazón.

+1

También tuve que agregar la puerta de enlace predeterminada ...

Así es como hago esto en Windows 10 usando PowerShell & Hyper-V (con el servicio VMNat.dll para NAT en lugar de ICS).

  • subred es 192.168.233.0/24
  • El servidor DHCP se está ejecutando en .1
  • DNS y NAT en .2
  • nueva máquina acoplable para tomar .10 IP estática

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

aún para probar si la puerta de enlace predeterminada funciona después del reinicio ...

echo "kill` `more /var/runudhcpc.eth0.id```nifconfig eth0 192.168.233.10 netmask 255.255.255.0 broadcast 192.168.233.255 up" | docker-machine ssh consul0 "sudo tee /var/lib/boot2docker/bootsync.sh"> $ null

matar dhcp en la interfaz eth0 de inmediato

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

abre eth0 con una nueva IP estática.

el siguiente comando se cuelga ... Tengo que CTRL + C después de un tiempo ...

docker-machine ssh consul0 "sudo ifconfig eth0 192.168.233.10 netmask 255.255.255.0 broadcast 192.168.233.255 up"

arregla los certificados tls que son para la antigua IP dinámica

docker-machine regenerate-certs consul0

asegúrese de que Internet todavía funcione volviendo a agregar la puerta de enlace predeterminada (desapareció en mi caso)

docker-machine ssh consul0 "ruta agregar predeterminada gw 192.168.233.2"
`` `` ``

bueno saber:

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

#open vmconnect
$vm=Get-VM consul0

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

Nota: A veces, el inicio de boot2docker parece fallar y Hyper-V no puede obtener la IP del adaptador ...

+1

+1

¿Seguimos en modo más uno? :)

Está arruinando mi configuración todo el tiempo y tendría mucho sentido dar ips fijos, especialmente cuando ejecuta múltiples entornos de desarrollo para diferentes proyectos localmente

Estamos esperando la confirmación de que la estrategia anterior funciona para otras personas que usan docker-machine en Mac OSX. Aquí está en una forma más concisa:

1) Establezca la variable x en cualquier número entero entre 1 y 98. Por ejemplo:
x='42'

2) Establezca la variable new_dm_name para que sea el nombre de su nuevo entorno de máquina acoplable. Por ejemplo:
new_dm_name='magic'

3) Ejecute este comando:
docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.$x.100/24" "$new_dm_name"

Su nueva IP estática ahora debería ser 192.168.x.100 y debería persistir entre sesiones siempre que no asigne esa IP a ninguna otra cosa. Para confirmar que este es el caso, recomiendo ejecutar estos comandos:

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

Con un poco de suerte, esto también se podrá adaptar a Windows.

+1

bueno, estoy condenado. Mi empresa está usando 192.168.99.x para nuestra propia IP local, así que permita que esto se cambie.

@xbeta : ¿puede simplemente reconfigurar la red VBox? No podría decirte cómo hacer eso ya que estoy usando Hyper-V, pero si usas el controlador VBox predeterminado, solo echa un vistazo a los nics virtuales creados por eso, docker-machine es simplemente envolviendo VBox

+1

¿Podrían las personas, por favor, detenerse con los comentarios +1? Github ahora tiene una función +1. Simplemente haga clic en + Smiley en la esquina superior derecha y haga clic en el icono de pulgar hacia arriba. Transmite su apoyo sin enviar un correo electrónico a todos los que han comentado aquí. #kthxbye

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

Más rápido y más confiable: ¡no más VirtualBox!

Parece que Docker está abandonando VirtualBox. Es posible que desee ajustar sus expectativas sobre este problema para obtener una solución.

+1

+1

+1

: +1:

+1

+1

+1

Sí, por favor sean nerds, sigan hablando. Infunde mucha confianza.

@ everett-toews VirtualBox sigue siendo útil para soluciones acoplables de múltiples hosts como Swarm, Kubernetes, Nomad, etc. Docker para Mac es equivalente a una configuración de un host (su mac es el host).
Otra solución local es VmwareFusion, que mantiene la ip de un host cuando se reinicia. Esta es una solución reciente por cierto.
Entonces, sí, necesitamos una forma más fácil de especificar direcciones IP estáticas para VirtualBox.

@gittycat Sí. Y es por eso que todavía ejecuto Docker Toolbox. Solo para poder crear un Enjambre. Aun así, prefiero ver esta solicitud de función: varias máquinas virtuales en Docker para Mac / Windows.

+1

+1

+1

+1

+1

Si necesita configurar una ip estática para una máquina boot2docker, simplemente edite / var / lib / boot2docker / profile y agregue

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

Después de eso, necesita regenerar los certificados.
docker-machine regenerate-certs rancher -f

+1

Creo que es hora, al menos para Mac n Windows, de cerrar esta solicitud como irrelevante. Docker para Mac resolvió todos mis problemas relacionados con la ip de la máquina acoplable. ¿Pensamientos todos?

@caledhwa está de acuerdo, docker mac es bastante estable, ahora no veo ninguna razón para lidiar con docker-machine.

@caledhwa Docker para Mac solo admite una máquina; si tiene una configuración de varias máquinas, esto sigue siendo relevante.

@caledhwa como dijo @davidolrik , Docker para Mac / Windows / AWS / Azure solo admite 1 host, lo que lo descarta para el desarrollo, las demostraciones y las pruebas de múltiples nodos Swarm / Kubernete / Mesos / etc.

👍

+1

¿Todavía no hay movimiento sobre esto? Este es un bloqueador para usar docker-machine ya que no puedo cambiar la dirección de red conflictiva del invitado.

Para poder arreglar la IP de la máquina acoplable para virtualbox es una característica necesaria.

Configuré varios hosts de la ventana acoplable como un ejemplo de enjambre, y después del reinicio, la IP de casi todos los hosts cambió y aparecerá el error:

x509: certificate is valid for 192.168.99.103, not 192.168.99.100

Sí, podría usar docker-machine regenerate-certs para solucionar el problema del certificado, sin embargo, la IP de la tienda de valor clave también cambió y el resultado es que mi enjambre dejó de funcionar, hasta que los cambie manualmente en la configuración uno por una vez más.

Tal vez sea mejor simplemente eliminarlos y crear esos hosts nuevamente. Sin embargo, se perderán todas las imágenes / contenedores de esos hosts.

Por lo tanto, haga posible especificar la IP del host, o simplemente asigne automáticamente una IP fija para el host de la ventana acoplable virtualbox, y no permita que cambie durante el reinicio.

+1
Tengo un caso en el que uso dnsmaq para DHCP y DNS, según los comentarios anteriores, intenté deshabilitar el servidor DHCP de la interfaz de la caja virtual en mi caso, es vboxnet4 como VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet4 y necesito reiniciar la máquina para elegir el rango de DHCP de dnsmasq , el problema al que me enfrento es que en cada nueva creación de máquina, la máquina acoplable habilita el servidor dhcp en vboxnet4 y otros servidores que usan dnsmasq no pueden busque las máquinas acoplables, tengo que repetir la eliminación de vnet y luego reiniciar las máquinas acoplables. Sería genial si podemos agregar una bandera a docker-machine-create para ayudar a no habilitar dhcp tipo de cosas.

+1

+1

+1

+1

Aquí hay un comando que encapsula el trabajo de @micheletedeschi y brinda cierta conveniencia para cambiar entre DHCP y configuraciones estáticas. También actualiza su archivo /etc/hosts si se solicita.

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

Lo hemos estado usando durante las últimas semanas con gran éxito. Simplemente ejecútelo justo después de crear su máquina acoplable.

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

Todos estaban pensando en una solución más "genérica" ​​(característica nativa de la máquina acoplable) ya que esta opción es interesante también en Vsphere, Azure y otros entornos de implementación. Pero es realmente bienvenido.

+1

+1

+1

+1

+1

+1

La solución alternativa de @micheletedeschi funciona más o menos para mí, pero parece que la ip ocasionalmente revierte de la que configuré con su script (192.168.99.100:2376) a la que se generó automáticamente cuando creé mi máquina ( 192.168.99.104:2376). Bastante nuevo en Docker, ¿alguien tiene alguna idea?

+1, encontré el mismo problema hoy usando ZooKeeper y VirtualBox

La solución alternativa de @micheletedeschi funciona más o menos para mí, pero parece que la ip ocasionalmente revierte de la que configuré con su script (192.168.99.100:2376) a la que se generó automáticamente cuando creé mi máquina ( 192.168.99.104:2376). Bastante nuevo en Docker, ¿alguien tiene alguna idea?

¿Estás matando al cliente DHCP? Después de que se revierte, ¿puede confirmar que el cliente DHCP aún no se está ejecutando?

Encontré otra solución que finalmente me funciona: simplemente inicio el agente swarm en cada máquina usando _advertise = $ (ifconfig eth1 | grep -Eo "192.168.99.1 [0-9] {2}"): 2376_ y publico el actual IP a ZooKeeper (o cualquier otro servicio de descubrimiento). Esto está bien en mi caso, ya que puedo confiar en que a cada máquina se le asigne una dirección 192.168.99.1 ** (es solo una configuración experimental). Creo que hay expresiones regulares más avanzadas que se pueden aplicar a rangos de IP arbitrarios. Esto no es agradable y puede ser un poco complicado, pero funciona.

+1

+1

El cambio arbitrario de las IP de las VM y los certificados TLS que de repente se vuelven inválidos al reiniciar ha causado muchos momentos inesperados y horas de trabajo desperdiciadas.

¿Es esto incluso priorizado? Un total de 13 meses este caso ha estado abierto. +10000

Supongo que existe un desacuerdo filosófico entre algunas personas del equipo de la máquina acoplable y el resto del mundo sobre este tema. Usar DHCP y tener una IP no determinista es prácticamente inútil para todos mis casos de uso.

He estado usando esta solución durante el último año. Está adaptado de algunas de las soluciones de una sola línea descritas anteriormente.

SSH en la máquina acoplable
docker-machine ssh predeterminado

Agregar / editar el script de inicio boot2docker
sudo 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

sudo chmod 755 /var/lib/boot2docker/bootsync.sh
Salida

Reiniciar la máquina y regenerar certificados
reinicio predeterminado de la máquina docker
docker-machine regenerate-certs predeterminado

+1

+1

+1 (para docker-machine y jimmidyson / minishift)

+1

@eytanhanig Lamentablemente, su método no me funcionó. Estoy en OS X 10.11.6. Las máquinas obtienen las IP deseadas pero hay un error al conectarse a ellas. Docker sugiere la regeneración de claves, pero eso no solucionó el problema.

+1

+1

Es ridículo cuánto tiempo la gente ha estado haciendo +1 en esto.

+1

Me encanta tener esta función, sin embargo, no encontré ningún enfoque elegante para implementarla.

El problema es causado por el DHCP en Virtualbox, si el sistema se reinicia, el servidor DHCP perderá todos los datos de IP asignados e intentará reasignar la IP para esas VM, que probablemente no tengan la misma IP por última vez.

No estoy seguro de que sea correcto permitir que Virtualbox conserve los datos DHCP. Y Boot2docker no mantendrá la IP asignada por DHCP, que en realidad es un comportamiento correcto.

En mi humilde opinión, no creo que intentar solucionar el DHCP sea la forma correcta de hacerlo, creo que agregar la capacidad de especificar una IP estática a Boot2docker y al controlador de la caja virtual de la máquina acoplable debería resolver el problema.

Quizás sea mejor implementar la IP estática en el proyecto https://github.com/boot2docker/boot2docker primero, como agregar la capacidad de especificar una IP estática, en lugar de usar DHCP.

Aquí está el código para activar la llamada 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 -------------------------------"

Podemos hacerlo condicional, agregando un conjunto de configuración de IP en /var/lib/boot2docker/profile , y si se ha configurado una IP estática, entonces use la IP estática en lugar de la IP de solicitud de DHCP.

Luego, podemos agregar una o más opciones para virtualbox driver para especificar la configuración de IP estática, como --virtualbox-boot2docker-cidr , --virtualbox-boot2docker-gateway , --virtualbox-boot2docker-dns ...

+1

+1

+1

Chicos, vamos. ¿Podríamos dejar de hacer +1 en un problema obviamente de larga duración? Hubo un botón Me gusta implementado por esa razón en particular. No es necesario enviar spam a los suscriptores.

No es necesario enviar spam a los suscriptores.

Puedes darte de baja.
1

Estoy totalmente a favor de enviar spam a los suscriptores.

Algunos de esos suscriptores forman parte del equipo del proyecto.

El 26 de enero de 2017 a las 14:20, "Sergey Nevmerzhitsky" [email protected]
escribió:

No es necesario enviar spam a los suscriptores.

Puedes darte de baja.
[imagen: 1]
https://cloud.githubusercontent.com/assets/1006042/22332699/4cf1a8b4-e3e3-11e6-8bad-52406c3b8055.png

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/docker/machine/issues/1709#issuecomment-275386350 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AG44NZ2KdnsH6JTU6iI_5Uieh9WZxWXBks5rWJ2RgaJpZM4FsQYg
.

Estoy totalmente a favor de enviar spam a los suscriptores.
Algunos de esos suscriptores forman parte del equipo del proyecto.

Mantenedor registrándose. Por favor, _no_ envíe spam al problema con comentarios +1. Este es un problema bien conocido y enviar spam al hilo no sirve de nada. Indique su apoyo a través de las reacciones emoji "+1" si lo desea. Como siempre, nos complace evaluar las solicitudes de extracción o las propuestas detalladas. Gracias a todos.

(Como nota al margen, @ twang2218 parece tener la idea correcta en general: las direcciones IP estáticas son más complicadas de lo que parecen para acertar y alcanzar los casos de uso que los suscriptores de este hilo podrían tener en mente; tal vez se podría iniciar un problema en el boot2docker repositorio para discutir.)

Realmente no quiero una ip estática. Pero una vez que se elige la dirección IP durante la creación, debe mantenerla en los reinicios posteriores. ¿Esto ya está disponible?

Tenía una ventana acoplable con VPN y el estándar 192.168.99.100 no se cargaba. Supuse que esto se debía a la conexión VPN, así que configuré una red puente dentro de Virtualbox para acceder a la ventana acoplable a través de 192.168.1.159. Me gustaría que esto apareciera en la dirección IP publicada de Kitematic. ¿Hay alguna manera de hacerlo?

Para aquellos que no pueden esperar a que se implemente esta función, es posible asignar una IP personalizada, además de una CPU / memoria personalizada mediante el uso del proveedor Vagrant VirtualBox y el controlador genérico de la máquina acoplable .

Por ejemplo, en Windows, coloque este 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

y coloque la clave privada ssh predeterminada de vagabundo con el nombre vagrant.pem

y correr

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

y obtendrá un host de docker con ip personalizada, cpu, memoria, etc.configurado a través de vagrant al mismo tiempo accesible a través de docker-machine.

Puede encontrar el conjunto de archivos de trabajo para Windows en https://github.com/joelhandwell/dockerhost

@jcwilson Hola Josh y otros, muchas gracias. Bifurqué su script para solucionar el mismo problema (consulte https://github.com/minishift/minishift/issues/343, https://github.com/minishift / minishift / issues / 598) en combinación con minishift:

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

¿Hay noticias?

Actualmente, estoy experimentando con esto para Minishift: https://github.com/minishift/minishift/issues/1293
Aunque, otro enfoque sería usar algo como cloud-init (que quizás sea demasiado pesado para este enfoque, o incrustar un servidor DHCP dentro del binario basado en Go y usar esto para forzar una dirección IP asignada)

+1.
Actualmente, tener más de una máquina es un dolor espantoso. Si usa certificados adicionales (por ejemplo, para el repositorio de Docker personalizado) y cambia el orden de inicio de las máquinas, debe hacer lo siguiente:

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

Esto le obliga a regenerar certificados o deshabilitar todas las máquinas y restaurar el orden de ejecución (lo que a veces también puede ser doloroso).

Además, usar Chef para configurar un proyecto basado en Docker también sería mucho mejor si pudiera asumir que la máquina creada tendría siempre la misma IP (por ejemplo, agregarla al archivo de hosts y podría olvidarse de las IP).

+1

+1

+1
gracias jcwilson, el script docker-machine-ipconfig es muy bueno. Necesitaba modificar eth1 a eth0 en el script, después de esto, el script funcionaba perfectamente para mí. Estoy usando vmware vsphere.

adiós.

+1

Como parte de minishift, hemos implementado https://github.com/minishift/minishift/issues/1316 y esto ha funcionado bien hasta ahora. Ahora estamos buscando alternativas para hacer lo mismo con los otros hipervisores a lo largo del tiempo, pero primero arreglaremos la dirección usando https://github.com/minishift/minishift/issues/1457 (para evitar que se asigne una nueva dirección) . No hemos podido reservar tiempo todavía, vamos a aterrizar esto también en minikube.

+1

La solución alternativa más simple que encontré es confiar en la secuencia de inicio de máquinas virtuales por doker-machine.

VirtualBox tiene un servidor DHCP que comienza a asignar direcciones IP desde 192.168.99.100.

  1. Detener todas las máquinas virtuales
    docker-machine stop ${docker-machine ls -q}
    Este paso liberará todas las direcciones asignadas a VirtualBox DHCP

  2. Inicie las máquinas virtuales en orden
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Estos pasos asignan una IP como esta:
    192.168.99.100: vbox1
    192.168.99.101: vbox2
    192.168.99.102: vbox3

Observe que docker-machine start vbox1 vbox2 vbox3 no funcionará, pero no entiendo por qué.

+1

cuando ejecuto docker-machine.exe start , DHCP tarda más de 15 segundos waiting for an IP (si Internet está roto, tarda más de 2 minutos), creo que si puedo configurar una ip estática, puede arrancar rápido .

Esta funcionalidad se ha agregado a Minishift hace tiempo, pero
necesita una modificación a la ISO para funcionar.
En Hyper-V nos encontramos con problemas que la imagen de boot2docker no
jugó bien ... por lo que solo funcionó en imágenes basadas en CentOS y Fedora.
Además, esto no funciona con el controlador KVM actual, ya que se basa en DHCP.

Esto necesitaría un ligero rediseño ...

El domingo, 3 de febrero de 2019 a las 11:08 p. M., Fcying [email protected] escribió:
>

cuando ejecuto el inicio de docker-machine.exe, DHCP tarda más de 15 segundos en esperar una IP (si Internet está roto, tarda más de 2 minutos), creo que si puedo configurar una IP estática, puede arrancar rápido.

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub o silencia el hilo.

-

Gerard Braad | http://gbraad.nl
[Haciendo asuntos de código abierto]

La solución alternativa más simple que encontré es confiar en la secuencia de inicio de máquinas virtuales por doker-machine.

VirtualBox tiene un servidor DHCP que comienza a asignar direcciones IP desde 192.168.99.100.

  1. Detener todas las máquinas virtuales
    docker-machine stop ${docker-machine ls -q}
    Este paso liberará todas las direcciones asignadas a VirtualBox DHCP
  2. Inicie las máquinas virtuales en orden
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Estos pasos asignan una IP como esta:
    192.168.99.100: vbox1
    192.168.99.101: vbox2
    192.168.99.102: vbox3

Observe que docker-machine start vbox1 vbox2 vbox3 no funcionará, pero no entiendo por qué.

A veces tuve que matar el proceso VBoxNetDHCP.exe en Windows, para que vbox asigne direcciones IP a partir de 192.168.99.100
De lo contrario, vbox no liberaría las direcciones IP utilizadas por máquinas anteriores (no estoy seguro de por qué)

👍

Realmente me facilitaría la vida.

La solución alternativa más simple que encontré es confiar en la secuencia de inicio de máquinas virtuales por doker-machine.

VirtualBox tiene un servidor DHCP que comienza a asignar direcciones IP desde 192.168.99.100.

  1. Detener todas las máquinas virtuales
    docker-machine stop ${docker-machine ls -q}
    Este paso liberará todas las direcciones asignadas a VirtualBox DHCP
  2. Inicie las máquinas virtuales en orden
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Estos pasos asignan una IP como esta:
    192.168.99.100: vbox1
    192.168.99.101: vbox2
    192.168.99.102: vbox3

Observe que docker-machine start vbox1 vbox2 vbox3 no funcionará, pero no entiendo por qué.

Es muy útil.

Para asignar un static ip address 192.168.99.50 a mi docker-machine (predeterminado) en VirtualBox, utilicé:

$ 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)

Mi entorno es OSX, VirtualBox (boot2docker.iso)

Espero que esto pueda ser útil 🙂
Por cierto: +1 para la solicitud de nueva función 😉
Salud.

Sí, hay una opción para crear con una ip específica. Todo lo que necesita hacer es especificar ip / ip-range con
--virtualbox-hostonly-cidr opción.

Por ejemplo:

  • cuando desee asignar una IP específica, digamos que desea asignar 10.15.1.24, entonces la configuración adecuada será (lo más importante es la máscara que estamos usando aquí. Para una IP específica, debe configurar la máscara de subred en 32):
    docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "10.15.1.24/32" dev

  • Si desea elegir una IP de un rango de IP específico, debe usar la máscara de subred adecuada.

Si el problema es que tiene que seguir actualizando su archivo de host, puede instalar Avahi en su contenedor y usar mDSN.

¿Fue útil esta página
0 / 5 - 0 calificaciones