Machine: [Demande de fonctionnalité] Spécifiez une adresse IP statique pour les machines virtuelles VirtualBox

Créé le 16 août 2015  ·  212Commentaires  ·  Source: docker/machine

Bonjour, j'ai cherché dans la documentation et les problèmes pour comprendre cela mais je ne trouve pas de réponse.

Fondamentalement, je veux pouvoir spécifier l'adresse IP d'une machine virtuelle (c'est-à-dire la valeur répertoriée sous "URL" dans docker-machine ls ) lorsque je la crée avec docker-machine create .

Je le veux parce que je me suis appuyé sur l'adresse par défaut de boot2docker de 192.168.59.103, mais maintenant cela varie d'une machine à l'autre.

Merci!

drivevirtualbox kinenhancement

Commentaire le plus utile

Les gars, allez. Pourrions-nous s'il vous plaît arrêter +1 sur un problème manifestement de longue date ? Il y avait un bouton J'aime implémenté pour cette raison particulière. Pas besoin de spammer les abonnés.

Tous les 212 commentaires

+1, besoin de cette fonctionnalité

+1

+1

+1

Voici une bonne solution de contournement. Ajoutez ce qui suit à votre ~/.bash_profile :

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

@letsgolesco, vous pouvez utiliser l'option --virtualbox-hostonly-cidr pour cela, qui sélectionnera le bon adaptateur vboxnetX hôte uniquement.

Par défaut, il semble que docker-machine en choisisse un au hasard, donc obligé d'utiliser celui pour vboxnet0 ( 192.168.59.3/24 , celui utilisé par boot2docker) semble résoudre le problème :

$ 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

Acclamations.

@luislavena - Malheureusement, cela n'a pas fonctionné.

+1

Def besoin de cette fonctionnalité cependant !

@krinkere n'est pas sûr de votre env, mais cela a fonctionné pour mon installation OSX en faisant cela, mais a échoué lors de l'utilisation de la machine sous Linux, ce qui a nécessité des ajustements à la configuration du serveur dhcp 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

C'est, comme vous pouvez le voir, un énorme hack :smile_cat:, mais fonctionne pour l'instant :smile:

J'adorerais voir cette fonctionnalité !!

@luislavena - Merci pour votre réponse

Voici ce que j'obtiens sur mon Mac.

$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.99.3/24" dev
Création de la machine virtuelle VirtualBox...
Création de la clé SSH...
Démarrage de la machine virtuelle VirtualBox...
Démarrage de la machine virtuelle...
Pour voir comment connecter Docker à cette machine, exécutez : docker-machine env dev

$ docker-machine ip dev
192.168.99.100

Bien que j'aie l'adresse IP dans le bon sous-réseau, ce n'est pas l'adresse IP que je voudrais utiliser... Def aimerait voir cette fonctionnalité

+1 fonctionnalité utile

+1 Cette fonctionnalité nous aiderait vraiment !

Nous utilisons docker-machine pour exécuter un cluster Elasticsearch local et nous avons /etc/hosts entrée 192.168.59.103 qui correspond à elastic-local.mycompany.com . Depuis que nous sommes passés de boot2docker à docker-machine, nous avons dû continuellement mettre à jour manuellement cette entrée de fichier hosts vers la nouvelle adresse IP attribuée à notre VM docker. Nous pourrions écrire une automatisation qui mettrait à jour cette entrée de fichier hosts pour nous, mais ce serait beaucoup plus simple si docker-machine nous laissait simplement utiliser une adresse IP configurable pour les nouvelles machines.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 (et)

+1

+1

+1

Temporairement, j'utilise des scripts bash pour mettre à jour les fichiers hosts, mais c'est kludgy car vous devez mettre à jour /etc/hosts via le script sudo'd, mais comme vous pouvez obtenir une adresse IP à partir de docker-machine, cela fonctionne. Je peux partager une idée.

ianlintner-wf, partagez le script s'il vous plaît. Je suis sur le point d'en écrire un exactement comme ça moi-même, mais si je ne peux pas réinventer la roue ce serait génial.. ouais..

Voici le script principal que j'utilise. Je l'ai nettoyé un peu, mais il manque des paramètres par défaut plus formels et d'autres éléments.

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

+1 s'il vous plait !

merci pour le script @ianlintner-wf. J'en ai écrit un qui ajoute dynamiquement l'hôte/l'adresse IP de toutes les machines docker en cours d'exécution. Avoir testé sur OS X El Capitan.

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

L'incrément IP est mis en cache par le serveur DHCP de VirtualBox. Arrêter et redémarrer VirtualBox réinitialisera l'incrément IP.

+1, nos développeurs OSX utilisent toujours boot2docker car notre environnement repose sur des entrées /etc/hosts statiques. (au fait merci pour le script @ianlintner-wf )

+1

+1

+1

+1

+2

Ma solution de hacky-hack, qui n'est certainement pas pour tout le monde : j'exécute Cassandra dans une machine docker, et je veux pouvoir y accéder depuis l'application node.js que je développe. Plutôt que d'utiliser une adresse IP fixe pour la machine docker, je fais :

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

qui permet la redirection de port pour le tunneling de port de localhost à la VM docker. Maintenant, je peux simplement me connecter à localhost:9042. (Ce serait beaucoup plus facile si quelqu'un réparait https://github.com/docker/machine/issues/41. :D)

@luislavena merci, je viens de recréer la machine par défaut avec ces options et tout fonctionne bien maintenant

+1

+1, je vais essayer le script avec la mise à jour automatique du fichier hosts, mais définitivement je veux cette fonctionnalité !

Sur la base du script @cookandy & @ianlintner-wf, j'ai créé le mien.

Vous pouvez le configurer avec une carte entre docker-machine-name et host name.

Il mettra à jour vos hôtes en supprimant les anciennes adresses IP des machines Docker et les nouvelles

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

+1

:+1:

+1

+1

:+1:

+1

+1

+1

Docker me dit de régénérer les certificats si l'adresse IP change, je dois définir une adresse IP statique pour éviter ce problème ou existe-t-il une autre solution ?

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 ETA sur cette fonctionnalité ?

Une solution de

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

S'il n'y a pas d'autre machine avec le même cidr , la machine devrait toujours obtenir l'IP .100 au démarrage.

@schmunk42 très bon travail autour :+1:

Ma virtualbox a une plage DHCP 192.168.99.100 - 255 et je souhaite définir une adresse IP avant 100.

J'ai trouvé une astuce simple pour définir une IP statique : après avoir créé une machine, j'exécute cette commande et redémarre la machine :

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

Cette commande crée un fichier bootsync.sh qui est recherché par les scripts de démarrage boot2docker et exécuté.

Maintenant, pendant le démarrage de la machine, la commande est exécutée et définit une IP statique.

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

C'est une bonne astuce aussi @micheletedeschi :+1:

J'aime la façon dont @micheletedeschi a corrigé cela. Cela semble être un moyen simple et standard qui n'implique pas de modifications de docker-machine. Peut-être que cela devrait être documenté quelque part?

Vous pouvez trouver de la documentation ici ou ici

+1
Je travaille avec 3 VM et j'ai toujours des problèmes pour me connecter via ssh et configurer mes utilitaires, mon fichier hosts, etc.

+1

:+1:

+1

+1

+1

+1

+1 J'essaie d'automatiser la création de machines et je ne peux pas m'attendre à avoir des autorisations pour ajouter des entrées à /etc/hosts encore et encore. Avoir une adresse IP stable signifierait n'avoir à la configurer qu'une seule fois.

J'ai fini par configurer un script qui pré-remplit dnsmasq sur l'hôte à l'aide de l'ip docker-machine

Le 19 décembre 2015, à 12h18, Pedro Cattori [email protected] a écrit :

+1

-
Répondez directement à cet e-mail ou consultez-le sur GitHub.

Une fonctionnalité très utile :+1:

J'adore le correctif de eth1 par eth1:1 dans la commande ci-dessus) car l'interface eth1 exécute DHCP et finira par revenir à l'adresse IP attribuée par DHCP.

Je ne sais pas combien de temps dure le temps d'actualisation du bail DHCP (il a fonctionné pendant une journée avec le correctif initial avant d'avoir soudainement l'erreur "vous devez régénérer les certificats TLS" et de réaliser ce qui se passait). Fera un rapport si mettre l'IP sur une interface virtuelle ne colle pas

@drags J'ai mis à jour les commandes avec :

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

puis exécutez la commande (uniquement la première fois)

docker-machine regenerate-certs prova-discovery

maintenant l'IP ne sera pas modifiée par le DHCP

:+1:

+1

:+1:

+1

+1

+1

Quelqu'un a-t-il eu de la chance de scripter la solution de contournement de @micheletedeschi ? Je veux une seule commande que tous les membres de l'équipe peuvent exécuter pour lancer le dev vm. J'ai essayé ce qui suit :

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

Lorsque j'exécute les commandes manuellement, cela fonctionne. Dans le script, je devais mettre le sommeil 30 ou la commande de redémarrage se bloquerait. Maintenant, le script se termine avec succès, mais après son exécution, la machine virtuelle fonctionne toujours avec l'ancienne adresse IP.

Vous pouvez utiliser vagrant pour lancer la machine docker, puis utiliser un plugin comme vagrant-hostmanager. Mais bien sûr, vous avez d'autres problèmes à résoudre si vous voulez qu'il s'agisse d'une seule commande pour lancer la VM multiplateforme.

Il n'y a tout simplement pas de solution parfaite à l'heure actuelle (affaiblissement).

Ouais, je pense que je vais rester avec Vagrant pour le moment.

Je construis une image de boîte Vagrant avec docker fonctionnant avec DOCKER_OPTS="-H 0.0.0.0:2375" . Ensuite, je peux créer une machine virtuelle errante avec une adresse IP codée en dur sur un réseau privé et utiliser cette adresse IP pour définir DOCKER_HOST et /etc/hosts, ce qui, je pense, sera une configuration assez idéale.

+1, en particulier en travaillant avec le pilote de machine vmwarevsphere

+1

+1

+1

+1, juste pouvoir définir l'adresse IP d'une machine. Actuellement, la CLI ne prend en charge que son obtention. L'utilisation d'AWS Elastic IP nécessiterait cela. Sinon, le config.json de la machine doit être mis à jour manuellement.

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

@dcosson par rapport aux scripts.

Je viens de démarrer la docker-machine puis d'exécuter les 2 commandes suivantes (une pour tuer le client DHCP, deux pour définir une adresse IP statique). J'ai choisi de ne pas exécuter 'docker restart' pour déclencher bootsync.sh. Peut-être que ce script de démarrage ne fonctionne pas ? Il est également possible que le client DHCP vous dérange et réinitialise l'adresse IP eth1 sur vous.

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

J'ai dû légèrement modifier l' extrait de

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"

J'ai le sentiment que ne pas définir d'adresse IP statique sur ma machine exécutant consul est ce qui me pose des problèmes en ce qui concerne mon cluster swarm. +1 pour cela

+1

+1

+1

+1

+1

+1_000000 :)

+1

Basé sur le commentaire de @micheletedeschi , voici mon script pour définir une IP fixe sur une VM docker-machine :
http://stackoverflow.com/a/35367277/6309

+1

+1

+1

+1

Ce que j'ai fait est de créer une copie de votre fichier hosts n'importe où.

Définissez un espace réservé pour les pièces que vous souhaitez modifier dynamiquement

<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

Pour info : j'utilise gnu-sed comme sed par défaut, donc ce ne sera pas celui de votre mac
brew install gnu-sed --with-default-names

et dans mon script de démarrage, je viens de les remplacer, puis de désactiver le fichier hosts. Maintenant, si vous avez votre copie de votre fichier hosts comme avant. cela ne devrait affecter aucun de vos autres services

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

Démarrer le script :

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

Voici ce que j'utilise pour créer mes environnements docker-machine avec des IP cohérentes :

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

Certaines IP ont tendance à réussir plus souvent que d'autres, et j'ai eu la meilleure chance avec celles de la forme 192.168.x.100 telles que x < 99 .

Et voici ce que j'utilise pour basculer rapidement entre eux :

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

N'hésitez pas à utiliser, modifier et distribuer à votre guise.

+1

J'ai aussi dû ajouter la passerelle par défaut...

Voici comment procéder sur Windows 10 à l'aide de PowerShell et Hyper-V (avec le service VMNat.dll pour NAT au lieu d'ICS).

  • le sous-réseau est 192.168.233.0/24
  • Le serveur DHCP s'exécute sur .1
  • DNS et NAT sur .2
  • nouvelle docker-machine pour prendre une IP statique .10

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

encore à tester si la passerelle par défaut fonctionne après le redémarrage ....

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

tuer dhcp sur l'interface eth0 tout de suite

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

faire apparaître eth0 avec une nouvelle IP statique ..

la commande suivante se bloque... Je dois CTRL+C au bout d'un moment...

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

corriger les certs tls qui sont pour l'ancienne IP dynamique

docker-machine regenerate-certs consul0

assurez-vous qu'Internet fonctionne toujours en rajoutant la passerelle par défaut (elle a disparu dans mon cas)

docker-machine ssh consul0 "route ajouter par défaut gw 192.168.233.2"
``````

bon à savoir:

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

#open vmconnect
$vm=Get-VM consul0

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

Remarque : Parfois, l'initialisation de boot2docker semble échouer et Hyper-V ne peut pas obtenir l'adresse IP de l'adaptateur...

+1

+1

Nous sommes toujours en mode plus un ? :)

Cela fout en l'air mes paramètres tout le temps et il serait tout à fait logique de donner des adresses IP fixes, en particulier lorsque vous exécutez plusieurs environnements de développement pour différents projets localement

Nous attendons la confirmation que la stratégie ci-dessus fonctionne pour les autres utilisateurs utilisant docker-machine sur Mac OSX. Le voici sous une forme plus concise :

1) Définissez la variable x sur n'importe quel nombre entier compris entre 1 et 98. Par exemple :
x='42'

2) Définissez la variable new_dm_name comme nom de votre nouvel environnement docker-machine. Par example:
new_dm_name='magic'

3) Exécutez cette commande :
docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.$x.100/24" "$new_dm_name"

Votre nouvelle IP statique devrait maintenant être 192.168.x.100 et devrait persister entre les sessions tant que vous n'attribuez cette IP à rien d'autre. Pour confirmer que c'est le cas, je recommande d'exécuter ces commandes :

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

Avec un peu de chance, cela sera également adaptable à Windows.

+1

eh bien, je suis condamné. Mon entreprise utilise 192.168.99.x pour notre propre adresse IP locale, veuillez donc autoriser cette modification.

@xbeta - vous pouvez simplement reconfigurer le réseau VBox ? Je ne serais pas en mesure de vous dire comment faire cela car j'utilise Hyper-V, mais si vous utilisez le pilote VBox par défaut, jetez un œil aux cartes réseau virtuelles créées par cela, docker-machine est juste enveloppant VBox

+1

Les gens pourraient-ils s'il vous plaît, s'il vous plaît, s'il vous plaît, arrêtez avec les commentaires +1 ? Github a maintenant une fonctionnalité +1. Cliquez simplement sur le +Smiley en haut à droite, puis cliquez sur l'icône pouce levé. Il transmet votre soutien sans envoyer d'e-mail à tous ceux qui ont commenté ici. #kthxbye

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

Plus rapide et plus fiable : fini la VirtualBox !

On dirait que Docker abandonne VirtualBox. Vous voudrez peut-être ajuster vos attentes sur ce problème pour obtenir une solution.

+1

+1

+1

:+1:

+1

+1

+1

Ouais, s'il te plait, sois des nerds, continue de chouchouter. Ça donne tellement confiance.

@everett-toews VirtualBox est toujours utile pour les solutions docker multi-hôtes comme Swarm, Kubernetes, Nomad, etc. Docker pour Mac équivaut à une configuration à un hôte (votre mac est l'hôte).
Une autre solution locale est VmwareFusion qui conserve l'adresse IP d'un hôte lorsqu'il est redémarré. Il s'agit d'un correctif récent.
Alors oui, nous avons besoin d'un moyen plus simple de spécifier des adresses IP statiques pour VirtualBox.

@gittycat Ouais . Et c'est pourquoi je lance toujours Docker Toolbox. Juste pour que je puisse créer un essaim. Même ainsi, je préférerais voir cette demande de fonctionnalité : plusieurs machines virtuelles dans Docker pour Mac/Windows.

+1

+1

+1

+1

+1

Si vous devez configurer une adresse IP statique pour une machine boot2docker, modifiez simplement /var/lib/boot2docker/profile et ajoutez

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

Après cela, vous devez régénérer les certificats
docker-machine regenerate-certs rancher -f

+1

Je pense qu'il est temps, au moins pour Mac n Windows, de fermer cette demande comme non pertinente. Tous mes problèmes autour de docker-machine ip ont été résolus par docker pour Mac. Pensées à tout le monde ?

@caledhwa d' accord, docker mac est assez stable maintenant ne voit plus aucune raison de traiter avec docker-machine

@caledhwa Docker pour Mac ne prend en charge qu'une seule machine - si vous avez une configuration multi-machines, cela reste pertinent.

@caledhwa comme l' a dit

??

+1

Toujours pas de mouvement à ce sujet ? Ceci est un bloqueur pour l'utilisation de docker-machine car je ne peux pas changer l'adresse réseau en conflit de l'invité.

Pour pouvoir réparer l'IP de la machine docker pour virtualbox est une fonctionnalité nécessaire.

J'ai configuré plusieurs hôtes docker comme exemple d'essaim, et après le redémarrage, presque l'adresse IP de chaque hôte a changé et obtiendra l'erreur :

x509: certificate is valid for 192.168.99.103, not 192.168.99.100

Oui, je pourrais peut-être utiliser docker-machine regenerate-certs pour résoudre le problème de certificat, cependant, l'adresse IP du magasin clé-valeur a également changé, et le résultat est que mon essaim a cessé de fonctionner, jusqu'à ce que je les modifie manuellement dans la configuration un par un nouveau.

Il sera peut-être préférable de simplement les supprimer et de créer à nouveau ces hôtes. Cependant, toutes les images/conteneurs de ces hôtes seront perdus.

Donc, veuillez permettre de spécifier l'IP de l'hôte, ou simplement allouer automatiquement une IP fixe pour l'hôte docker virtualbox, et ne le laissez pas changer au cours du redémarrage.

+1
J'ai un cas où j'utilise dnsmaq pour DHCP et DNS, sur la base des commentaires ci-dessus, j'ai essayé de désactiver le serveur DHCP de l'interface de la boîte virtuelle dans mon cas, c'est vboxnet4 comme VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet4 et j'ai besoin de redémarrer la machine pour choisir la plage DHCP de dnsmasq , le problème auquel je suis confronté est que sur chaque nouvelle création de machine, la machine docker active le serveur DHCP sur vboxnet4 et les autres serveurs utilisant dnsmasq ne sont pas en mesure de recherchez la ou les machines docker, je dois répéter la suppression de vnet, puis redémarrer les machines docker. ce serait formidable si nous pouvions ajouter un indicateur à docker-machine-create pour aider à ne pas activer le genre de chose DHCP.

+1

+1

+1

+1

Voici une commande qui encapsule le travail de @micheletedeschi et offre une certaine commodité pour basculer entre les configurations DHCP et statiques. Il met également à jour votre fichier /etc/hosts si demandé.

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

Nous l'utilisons depuis quelques semaines avec beaucoup de succès. Exécutez-le juste après avoir créé votre machine 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

Tout le monde pensait à une solution plus "générique" (fonctionnalité native docker-machine) car cette option est intéressante également sur Vsphere, Azure et d'autres environnements de déploiement. Mais c'est vraiment le bienvenu.

+1

+1

+1

+1

+1

+1

La solution de contournement de @micheletedeschi fonctionne plus ou moins pour moi, mais il semble que l'adresse IP revient parfois de celle sur laquelle je l'ai définie avec son script (192.168.99.100:2376) à celle qui a été générée automatiquement lorsque j'ai créé ma machine ( 192.168.99.104:2376). Assez nouveau sur docker, quelqu'un a-t-il une idée ?

+1, a rencontré le même problème aujourd'hui avec ZooKeeper et VirtualBox

La solution de contournement de @micheletedeschi fonctionne plus ou moins pour moi, mais il semble que l'adresse IP revient parfois de celle sur laquelle je l'ai définie avec son script (192.168.99.100:2376) à celle qui a été générée automatiquement lorsque j'ai créé ma machine ( 192.168.99.104:2376). Assez nouveau sur docker, quelqu'un a-t-il une idée ?

Tu tues le client DHCP ? Une fois rétabli, pouvez-vous confirmer que le client DHCP ne fonctionne toujours pas ?

J'ai trouvé une autre solution de contournement qui fonctionne enfin pour moi : je démarre simplement l'agent swarm sur chaque machine en utilisant _advertise=$(ifconfig eth1 | grep -Eo "192.168.99.1[0-9]{2}"):2376_ et publie le courant IP à ZooKeeper (ou tout autre service de découverte). C'est ok dans mon cas car je peux compter sur chaque machine qui se voit attribuer une adresse 192.168.99.1** (c'est juste une configuration expérimentale). pense qu'il existe des expressions regex plus avancées qui peuvent être appliquées à des plages d'adresses IP arbitraires. Ce n'est pas agréable et peut-être un peu bidon, mais ça fait le travail.

+1

+1

La modification arbitraire des adresses IP de VM et des certificats TLS qui deviennent soudainement invalides au redémarrage a causé de nombreux moments difficiles et des heures de travail perdues

Est-ce même une priorité ? Pendant 13 mois entiers, cette affaire a été ouverte. +10000

Je suppose qu'il existe un désaccord philosophique entre certaines personnes de l'équipe Docker Machine et le reste du monde sur cette question. Utiliser DHCP et avoir une IP non déterministe ne vaut pratiquement rien pour tous mes cas d'utilisation.

J'utilise cette solution de contournement depuis l'année dernière. Il est adapté de certaines des solutions de contournement décrites ci-dessus.

SSH sur la machine docker
docker-machine ssh par défaut

Ajouter/modifier le script de démarrage 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
sortir

Redémarrer la machine et régénérer les certificats
docker-machine redémarrer par défaut
docker-machine regenerate-certs par défaut

+1

+1

+1 (pour docker-machine et jimmidyson/minishift)

+1

@eytanhanig Malheureusement, votre méthode n'a pas fonctionné pour moi. Je suis sous OS X 10.11.6. Les machines obtiennent les adresses IP souhaitées, mais une erreur s'est produite lors de la connexion à celles-ci. Docker suggère de régénérer les clés, mais cela n'a pas résolu le problème.

+1

+1

C'est ridicule depuis combien de temps les gens ajoutent +1 à ça.

+1

J'adore avoir cette fonctionnalité, cependant, je n'ai trouvé aucune approche élégante pour la mettre en œuvre.

Le problème est causé par le DHCP dans Virtualbox, si le système redémarre, le serveur DHCP perdra toutes les données IP allouées et essaiera de réaffecter l'IP pour ces VM, qui n'auront probablement pas la même IP pour la dernière fois.

Je ne suis pas sûr qu'il soit juste de laisser la Virtualbox persister les données DHCP. Et Boot2docker ne conservera pas l'adresse IP allouée par DHCP, ce qui est en fait un comportement correct.

À mon humble avis, je ne pense pas qu'essayer de contourner le DHCP soit la bonne façon de faire, je pense que l'ajout de la possibilité de spécifier une adresse IP statique à Boot2docker et au pilote de virtualbox docker-machine devrait résoudre le problème.

Il est peut-être préférable d'implémenter d'abord l'adresse IP statique dans le projet https://github.com/boot2docker/boot2docker , par exemple en ajoutant la possibilité de spécifier une adresse IP statique, plutôt que d'utiliser DHCP.

Voici le code pour déclencher l'appel 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 -------------------------------"

Nous pouvons le rendre conditionnel, en ajoutant un ensemble de configuration IP dans /var/lib/boot2docker/profile , et si une IP statique a été configurée, alors utilisez l'IP statique au lieu de demander l'IP de DHCP.

Ensuite, nous pouvons ajouter une ou plusieurs options pour le pilote virtualbox pour spécifier la configuration IP statique, comme --virtualbox-boot2docker-cidr , --virtualbox-boot2docker-gateway , --virtualbox-boot2docker-dns ...

+1

+1

+1

Les gars, allez. Pourrions-nous s'il vous plaît arrêter +1 sur un problème manifestement de longue date ? Il y avait un bouton J'aime implémenté pour cette raison particulière. Pas besoin de spammer les abonnés.

Pas besoin de spammer les abonnés.

Vous pouvez vous désinscrire.
1

Je suis pour le spam des abonnés.

Certains de ces abonnés font partie de l'équipe du projet.

Le 26 janvier 2017 14:20, "Sergey Nevmerzhitsky" [email protected]
a écrit:

Pas besoin de spammer les abonnés.

Vous pouvez vous désinscrire.
[image : 1]
https://cloud.githubusercontent.com/assets/1006042/22332699/4cf1a8b4-e3e3-11e6-8bad-52406c3b8055.png

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/docker/machine/issues/1709#issuecomment-275386350 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AG44NZ2KdnsH6JTU6iI_5Uieh9WZxWXBks5rWJ2RgaJpZM4FsQYg
.

Je suis pour le spam des abonnés.
Certains de ces abonnés font partie de l'équipe du projet.

Vérification du responsable. Veuillez _ne_ pas_ spammer le problème avec des commentaires +1. C'est un problème bien connu et spammer le fil ne sert à rien. Indiquez votre soutien via les réactions emoji "+1" si vous le souhaitez. Comme toujours, nous sommes heureux d'évaluer les demandes de tirage ou les propositions détaillées. Merci a tous.

(En remarque, @ twang2218 semble avoir la bonne idée en général - les adresses IP statiques sont plus difficiles qu'elles ne semblent être correctes et correspondent aux cas d'utilisation que les abonnés à ce fil pourraient avoir en tête - peut-être qu'un problème pourrait être déclenché dans le référentiel boot2docker à discuter.)

Je ne veux pas vraiment une IP statique. Mais une fois que l'adresse IP est sélectionnée lors de la création, elle doit la conserver lors des redémarrages suivants. Est-ce déjà disponible ?

J'avais un docker avec VPN et la norme 192.168.99.100 ne se chargeait pas. J'ai pensé que c'était à cause de la connexion VPN, j'ai donc configuré un réseau de pont à l'intérieur de Virtualbox pour accéder au docker via 192.168.1.159. J'aimerais que cela apparaisse sur l'adresse IP publiée de Kitematic. Y a-t-il un moyen de le faire?

Pour ceux qui ne peuvent pas attendre que cette fonctionnalité soit implémentée, l'attribution d'une adresse IP personnalisée, ainsi que d'un processeur/mémoire personnalisé est possible en utilisant le fournisseur Vagrant VirtualBox et le pilote générique docker-machine .

Par exemple dans Windows, placez ce 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

et placez la clé privée ssh par défaut du vagabond avec le nom vagrant.pem

et courir

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

et vous obtiendrez un hôte docker avec une adresse IP, un processeur, une mémoire, etc. personnalisés configurés via vagrant en même temps accessibles via docker-machine.

Vous pouvez trouver un ensemble de fichiers de travail pour Windows sur https://github.com/joelhandwell/dockerhost

@jcwilson Salut Josh et al, merci beaucoup .. J'ai forké votre script afin de résoudre le même problème (voir https://github.com/minishift/minishift/issues/343 , https://github.com/minishift /minishift/issues/598) en combinaison avec minishift :

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

Des nouvelles?

Actuellement, j'expérimente ceci pour Minishift : https://github.com/minishift/minishift/issues/1293
Cependant, une autre approche serait d'utiliser quelque chose comme cloud-init (ce qui est peut-être trop lourd pour cette approche, ou d'intégrer un serveur DHCP dans le binaire basé sur Go et de l'utiliser pour forcer une adresse IP allouée)

+1.
Avoir actuellement plus d'une machine est une douleur horrible. Si vous utilisez des certificats supplémentaires (par exemple, pour un référentiel docker personnalisé) et modifiez l'ordre de démarrage des machines, vous devez effectuer :

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

Cela vous oblige à régénérer les certificats ou à désactiver toutes les machines et à restaurer l'ordre d'exécution (ce qui peut parfois être pénible aussi).

De plus, l'utilisation de Chef pour configurer un projet basé sur Docker serait également bien meilleure si vous pouviez supposer que la machine créée aurait toujours la même IP (par exemple, en l'ajoutant au fichier hosts et vous pourriez oublier les IP).

+1

+1

+1
merci jcwilson, le script docker-machine-ipconfig est très bon ! J'avais besoin de modifier le eth1 en eth0 dans le script, après cela, le script fonctionnait parfaitement pour moi. J'utilise vmware vsphere.

au revoir.

+1

Dans le cadre de minishift, nous avons implémenté https://github.com/minishift/minishift/issues/1316 et cela a bien fonctionné jusqu'à présent. Nous recherchons maintenant des alternatives pour faire de même pour les autres hyperviseurs au fil du temps, mais nous allons d'abord corriger l'adresse en utilisant https://github.com/minishift/minishift/issues/1457 (pour éviter qu'une nouvelle adresse ne soit attribuée) . Nous n'avons pas encore pu réserver de temps, nous allons également atterrir dans minikube.

+1

La solution de contournement la plus simple que j'ai trouvée consiste à s'appuyer sur la séquence de démarrage des machines virtuelles par doker-machine.

VirtualBox a un serveur DHCP qui commence à attribuer des adresses IP à partir de 192.168.99.100.

  1. Arrêter toutes les VM
    docker-machine stop ${docker-machine ls -q}
    Cette étape libérera toutes les adresses attribuées à VirtualBox DHCP

  2. Démarrer les machines virtuelles dans l'ordre
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Ces étapes attribuent l'IP comme ceci :
    192.168.99.100 : vbox1
    192.168.99.101 : vbox2
    192.168.99.102 : vbox3

Notez que docker-machine start vbox1 vbox2 vbox3 ne fonctionnera pas, mais je ne comprends pas pourquoi.

+1

lorsque je lance docker-machine.exe start , cela prend plus de 15 secondes pour DHCP waiting for an IP (si Internet est interrompu, cela prend plus de 2 minutes), je pense que si vous pouvez définir une adresse IP statique, il peut démarrer rapidement .

Cette fonctionnalité a été ajoutée à Minishift il y a quelque temps, mais elle
a besoin d'une modification de l'ISO pour fonctionner.
Sur Hyper-V, nous avons rencontré des problèmes que l'image boot2docker n'a pas
bien joué... donc cela ne fonctionnait que sur les images basées sur CentOS et Fedora.
De plus, cela ne fonctionne pas avec le pilote KVM actuel car il repose sur DHCP.

Cela aurait besoin d'une légère refonte...

Le dimanche 3 février 2019 à 23 h 08, fcying [email protected] a écrit :
>

lorsque je lance docker-machine.exe start, il faut plus de 15 secondes pour que DHCP attende une adresse IP (si Internet est en panne, cela prend plus de 2 minutes), je pense que s'il peut définir une adresse IP statique, il peut démarrer rapidement.

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub ou coupez le fil de discussion.

--

Gérard Braad | http://gbraad.nl
[ Faire des affaires Open Source ]

La solution de contournement la plus simple que j'ai trouvée consiste à s'appuyer sur la séquence de démarrage des machines virtuelles par doker-machine.

VirtualBox a un serveur DHCP qui commence à attribuer des adresses IP à partir de 192.168.99.100.

  1. Arrêter toutes les VM
    docker-machine stop ${docker-machine ls -q}
    Cette étape libérera toutes les adresses attribuées à VirtualBox DHCP
  2. Démarrer les machines virtuelles dans l'ordre
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Ces étapes attribuent l'IP comme ceci :
    192.168.99.100 : vbox1
    192.168.99.101 : vbox2
    192.168.99.102 : vbox3

Notez que docker-machine start vbox1 vbox2 vbox3 ne fonctionnera pas, mais je ne comprends pas pourquoi.

Parfois, je devais tuer le processus VBoxNetDHCP.exe sous Windows, pour que vbox attribue des IP à partir de 192.168.99.100
Sinon, vbox ne publierait pas les adresses IP utilisées par les machines précédentes (je ne sais pas pourquoi)

??

Cela me simplifierait vraiment la vie.

La solution de contournement la plus simple que j'ai trouvée consiste à s'appuyer sur la séquence de démarrage des machines virtuelles par doker-machine.

VirtualBox a un serveur DHCP qui commence à attribuer des adresses IP à partir de 192.168.99.100.

  1. Arrêter toutes les VM
    docker-machine stop ${docker-machine ls -q}
    Cette étape libérera toutes les adresses attribuées à VirtualBox DHCP
  2. Démarrer les machines virtuelles dans l'ordre
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Ces étapes attribuent l'IP comme ceci :
    192.168.99.100 : vbox1
    192.168.99.101 : vbox2
    192.168.99.102 : vbox3

Notez que docker-machine start vbox1 vbox2 vbox3 ne fonctionnera pas, mais je ne comprends pas pourquoi.

C'est très utile.

Afin d'attribuer un static ip address 192.168.99.50 à ma machine docker (par défaut) sur VirtualBox, j'ai utilisé :

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

Mon environnement est OSX, VirtualBox (boot2docker.iso)

En espérant que cela puisse être utile
BTW : +1 pour la demande de nouvelle fonctionnalité 😉
Acclamations.

Oui, il existe une option pour créer avec une adresse IP spécifique. Tout ce que vous avez à faire est de spécifier ip/ip-range avec
Option --virtualbox-hostonly-cidr .

Par example:

  • lorsque vous souhaitez attribuer une adresse IP spécifique, disons que vous souhaitez attribuer 10.15.1.24, la configuration appropriée sera alors (la chose la plus importante est le masque que nous utilisons ici. Pour une adresse IP spécifique, vous devez définir le masque de sous-réseau sur 32) :
    docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "10.15.1.24/32" dev

  • si vous souhaitez choisir une adresse IP dans une plage d'adresses IP spécifique, vous devez utiliser le masque de sous-réseau approprié.

Si votre problème est que vous devez continuer à mettre à jour votre fichier hôte, vous pouvez simplement installer Avahi sur votre conteneur et utiliser mDSN.

Cette page vous a été utile?
0 / 5 - 0 notes