Machine: [Solicitação de recurso] Especifique um IP estático para VMs do VirtualBox

Criado em 16 ago. 2015  ·  212Comentários  ·  Fonte: docker/machine

Olá, estive pesquisando os documentos e problemas para descobrir isso, mas não consigo encontrar uma resposta.

Basicamente, quero ser capaz de especificar o endereço IP de uma VM (ou seja, o valor listado em "URL" em docker-machine ls ) ao criá-lo com docker-machine create .

Eu quero isso porque tenho confiado no endereço padrão do boot2docker de 192.168.59.103, mas agora varia de máquina para máquina.

Obrigado!

drivevirtualbox kinenhancement

Comentários muito úteis

Caras, vamos. Podemos interromper o +1 em um problema de longa duração? Houve um botão Curtir implementado por esse motivo específico. Não há necessidade de spam para os assinantes.

Todos 212 comentários

+1, preciso deste recurso

+1

+1

+1

Aqui está uma boa solução alternativa. Adicione o seguinte ao seu ~/.bash_profile :

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

@letsgolesco você pode usar a opção --virtualbox-hostonly-cidr para isso, que selecionará o adaptador vboxnetX somente host apropriado.

Por padrão, parece que a docker-machine escolhe um aleatoriamente, então forçado a usar aquele para vboxnet0 ( 192.168.59.3/24 , aquele usado pelo boot2docker) parece resolver o 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

Felicidades.

@luislavena - Infelizmente isso não funcionou.

+1

Def precisa deste recurso embora!

@krinkere não tenho certeza do seu env, mas funcionou para a minha instalação OSX ao fazer isso, mas falhou ao usar a máquina no Linux, o que exigiu ajustes na configuração do 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 é, como você pode ver, um grande hack: smile_cat :, mas funciona por enquanto: smile:

Adoraria ver esse recurso !!

@luislavena - Obrigado pela sua resposta

Aqui está o que eu recebo no meu Mac.

$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.99.3/24" dev
Criando VirtualBox VM ...
Criando chave SSH ...
Iniciando VirtualBox VM ...
Iniciando VM ...
Para ver como conectar o Docker a esta máquina, execute: docker-machine env dev

$ docker-machine ip dev
192.168.99.100

Embora eu tenha ip na sub-rede certa, não é o IP que eu gostaria de usar ... Def adoraria ver esse recurso

+1 recurso útil

+1 Este recurso realmente nos ajudaria!

Usamos docker-machine para executar um cluster Elasticsearch local e temos /etc/hosts entrada para 192.168.59.103 que mapeia para elastic-local.mycompany.com . Desde que mudamos para docker-machine do boot2docker, tivemos que atualizar continuamente manualmente esta entrada do arquivo hosts para qualquer que seja o novo IP atribuído à nossa VM docker. Poderíamos escrever alguma automação que atualizaria esta entrada do arquivo hosts para nós, mas seria muito mais simples se docker-machine apenas nos permitisse usar um endereço IP configurável para novas máquinas.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 (e)

+1

+1

+1

Temporariamente, estou usando alguns scripts bash para atualizar os arquivos de hosts, mas é complicado, pois você tem que atualizar / etc / hosts via script sudo, mas como você pode obter o ip da docker-machine, ele funciona. Posso compartilhar uma essência.

ianlintner-wf, compartilhe o script, por favor. Estou prestes a escrever um exatamente assim, mas se eu não puder reinventar a roda, seria ótimo .. sim ..

Aqui está o script principal que estou usando. Eu limpei um pouco, mas faltam parâmetros padrão mais formais e outras coisas.

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

+1 por favor!

obrigado pelo script @ ianlintner-wf. Eu escrevi um que adiciona dinamicamente o host / ip de qualquer máquina docker em execução. Testei no OS X El Capitan.

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

O incremento de IP é armazenado em cache pelo servidor DHCP do VirtualBox. Parar e reiniciar o VirtualBox irá redefinir o incremento de IP.

+1, nossos devs OSX ainda estão usando boot2docker porque nosso env depende de entradas / etc / hosts estáticos. (aliás, obrigado pelo script @ ianlintner-wf)

+1

+1

+1

+1

+2

Minha solução hacky-hack, que definitivamente não é para todos: estou executando o Cassandra em uma máquina docker e quero poder acessá-la a partir do aplicativo node.js que estou desenvolvendo. Em vez de usar um IP fixo para a máquina docker, eu faço:

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 permite o encaminhamento de portas para o tunelamento de portas de localhost para o docker VM. Agora posso apenas conectar ao localhost: 9042. (Isso seria muito mais fácil se alguém corrigisse https://github.com/docker/machine/issues/41.: D)

@luislavena obrigado, acabei de recriar a máquina padrão com essas opções e tudo funciona bem agora

+1

+1, vou tentar o script com a atualização automática do arquivo hosts, mas definitivamente quero esse recurso!

Com base no script @cookandy & @ ianlintner-wf, criei o meu.

Você pode configurá-lo com um mapa entre docker-machine-name e nome do host.

Ele irá atualizar seus hosts removendo ips de máquinas docker mais antigos e novos

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

+1

: +1:

+1

+1

: +1:

+1

+1

+1

Docker me diz para regenerar certs se o IP mudar, eu preciso definir um IP estático para evitar esse problema ou há outra solução?

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 qualquer hora prevista de chegada neste recurso?

Uma solução alternativa para alguns casos de uso poderia ser criar máquinas como:

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

Se não houver outra máquina com o mesmo cidr , a máquina deve sempre obter o .100 IP ao iniciar.

@ schmunk42 solução muito boa: +1:

Minha caixa virtual tem uma faixa de dhcp 192.168.99.100 - 255 e eu quero definir um IP antes de 100.

Descobri um truque simples para definir um IP estático: depois de criar uma máquina, executo este comando e reinicio a 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 cria um arquivo bootsync.sh que é pesquisado por scripts de inicialização boot2docker e executado.

Agora, durante a inicialização da máquina, o comando é executado e define o IP estático.

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

Esse é um bom truque também @micheletedeschi : +1:

Gosto da maneira como @micheletedeschi consertou isso. Parece uma maneira fácil e padrão que não envolve modificações na docker-machine. Talvez isso deva ser documentado em algum lugar?

Você pode encontrar alguma documentação aqui ou aqui

+1
Estou trabalhando com 3 VM e sempre tenho problemas para conectar via ssh e configurar meus utilitários, arquivo hosts etc.

+1

: +1:

+1

+1

+1

+1

1 Estou tentando automatizar a criação da máquina e não posso esperar ter permissões para adicionar entradas a /etc/hosts repetidamente. Ter um ip estável significaria ter que configurá-lo apenas uma vez.

Acabei configurando um script que preenche o dnsmasq no host usando docker-machine ip

Em 19 de dezembro de 2015, às 12h18, Pedro Cattori [email protected] escreveu:

+1

-
Responda a este e-mail diretamente ou visualize-o no GitHub.

Um recurso muito útil: +1:

Estou adorando a correção de eth1 por eth1:1 no comando acima), pois a interface eth1 está executando DHCP e, eventualmente, reverterá para o endereço IP atribuído por DHCP.

Não tenho certeza de quanto tempo é o tempo de atualização da concessão dhcp (executado por um dia com a correção inicial antes de eu de repente receber o erro "você precisa regenerar certificados TLS" e perceber o que estava acontecendo). Irá reportar se colocar o IP em uma interface virtual não pega

@drags Eu atualizei os comandos com:

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

em seguida, execute o comando (apenas na primeira vez)

docker-machine regenerate-certs prova-discovery

agora o IP não será alterado pelo DHCP

: +1:

+1

: +1:

+1

+1

+1

Alguém teve sorte no script da solução alternativa de @micheletedeschi ? Quero um único comando que todos da equipe possam executar para iniciar o dev vm. Tentei o seguinte:

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

Quando eu executo os comandos manualmente, ele funciona. No script, tive que colocar no modo de espera 30 ou o comando de reinicialização simplesmente travaria. Agora o script foi concluído com sucesso, mas depois de executado, o vm ainda está executando com o IP antigo.

Você pode usar o vagrant para iniciar a máquina docker e então usar um plugin como o vagrant-hostmanager. Mas é claro que você terá outros problemas para lidar se quiser que seja um único comando para iniciar a plataforma cruzada VM.

Simplesmente não há solução perfeita no momento (afaict).

Sim, acho que vou ficar com o Vagrant por enquanto.

Estou construindo uma imagem de caixa do Vagrant com o docker rodando com DOCKER_OPTS="-H 0.0.0.0:2375" . Então posso criar um vagrant vm com um IP codificado de rede privada e usar esse IP para definir DOCKER_HOST e / etc / hosts, que acho que será uma configuração muito ideal.

+ 1, especialmente trabalhando com driver de máquina vmwarevsphere

+1

+1

+1

+1, apenas sendo capaz de definir o endereço IP de uma máquina. Atualmente, a CLI oferece suporte apenas para obtê-lo. O uso de IPs do AWS Elastic exigiria isso. Caso contrário, o config.json da máquina deve ser atualizado manualmente.

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

@dcosson wrt scripting.

Acabei de iniciar a docker-machine e executar os 2 comandos a seguir (um para matar o cliente dhcp, dois para definir um ip estático). Eu escolhi não executar o 'docker restart' para acionar o bootsync.sh. Talvez esse script de inicialização não funcione? Também é possível que o cliente dhcp esteja bagunçando você e reconfigurando o IP eth1 em você.

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

Tive que modificar um pouco o snippet de @roocell para

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"

Tenho a sensação de que não definir um ip estático na minha máquina executando o consul é o que está me dando problemas com relação ao meu cluster de enxame. 1 para isto

+1

+1

+1

+1

+1

+ 1_000000 :)

+1

Com base no comentário de @micheletedeschi , aqui está meu script para definir um IP fixo para uma máquina virtual docker:
http://stackoverflow.com/a/35367277/6309

+1

+1

+1

+1

O que fiz foi criar uma cópia do seu arquivo hosts em qualquer lugar.

Defina um espaço reservado para as partes que você gostaria de alterar dinamicamente

<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 sua informação: estou usando o gnu-sed como meu sed padrão, então não será o que está no seu mac
brew install gnu-sed --with-default-names

e no meu script de inicialização eu apenas substituí aqueles e, em seguida, troquei o arquivo hosts. Agora, se você tiver sua cópia do arquivo hosts da mesma forma que antes. não deve afetar nenhum de seus outros serviços

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

Aqui está o que eu uso para criar meus ambientes de máquina docker com IPs 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"
}

Alguns IPs tendem a ser bem-sucedidos com mais frequência do que outros, e tive mais sorte com aqueles da forma 192.168.x.100, que x <99 .

E aqui está o que eu uso para alternar rapidamente entre eles:

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

Sinta-se à vontade para usar, modificar e distribuir como quiser.

+1

Eu também tive que adicionar o gateway padrão ...

Veja como faço isso no Windows 10 usando PowerShell e Hyper-V (com serviço VMNat.dll para NAT em vez de ICS).

  • sub-rede é 192.168.233.0/24
  • O servidor DHCP está sendo executado em .1
  • DNS e NAT em .2
  • nova docker-machine para obter IP estático 0,10

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

ainda para testar se o gateway padrão funciona após a reinicialização ....

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 na interface eth0 imediatamente

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

traga a eth0 com o novo IP estático ..

seguinte comando trava ... Eu tenho que CTRL + C depois de um tempo ...

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

consertar os certificados tls que são para o antigo IP dinâmico

docker-machine regenerate-certs consul0

garantir que a Internet ainda funcione, adicionando novamente o gateway padrão (ele sumiu no meu caso)

docker-machine ssh consul0 "rota adicionar gw padrão 192.168.233.2"
`` `` ``

bom 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

Observação: às vezes, a inicialização do boot2docker parece falhar e o Hyper-V não consegue obter o IP do adaptador ...

+1

+1

Ainda estamos no modo +1? :)

Está bagunçando minhas configurações o tempo todo e faria totalmente sentido fornecer ips fixos, especialmente quando você executa vários ambientes de desenvolvimento para diferentes projetos localmente

Estamos aguardando a confirmação de que a estratégia acima funciona para outras pessoas que usam docker-machine no Mac OSX. Aqui está de uma forma mais concisa:

1) Defina a variável x como qualquer número inteiro entre 1 e 98. Por exemplo:
x='42'

2) Defina a variável new_dm_name como o nome de seu novo ambiente de máquina docker. Por exemplo:
new_dm_name='magic'

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

Seu novo IP estático agora deve ser 192.168.x.100 e deve persistir entre as sessões, desde que você não atribua esse IP a mais nada. Para confirmar que este é o caso, recomendo executar estes 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"

Com alguma sorte, isso também será adaptável ao Windows.

+1

bem, estou condenado. Minha empresa está usando 192.168.99.x para nosso próprio ip local, portanto, permita que isso seja alterado.

@xbeta - você pode apenas reconfigurar a rede VBox? Eu não poderia dizer como fazer isso porque estou usando o Hyper-V, mas se você usar o driver VBox padrão, basta dar uma olhada nos nics virtuais criados por ele, docker-machine é apenas envolvendo VBox

+1

As pessoas poderiam, por favor, parar com os comentários de +1? O Github agora tem um recurso +1. Basta clicar em + Smiley no canto superior direito e clicar no ícone de polegar para cima. Transmite o seu apoio sem enviar um e-mail a todos os que comentaram aqui. #kthxbye

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

Mais rápido e confiável: chega de VirtualBox!

Parece que o Docker está abandonando o VirtualBox. Você pode querer ajustar suas expectativas em relação a esse problema e obter uma solução.

+1

+1

+1

: +1:

+1

+1

+1

Sim, por favor, sejam nerds, continuem plussing. Isso inspira muita confiança.

@ everett-toews VirtualBox ainda é útil para soluções docker de vários hosts como Swarm, Kubernetes, Nomad, etc. Docker para Mac é equivalente a uma configuração de host (seu mac é o host).
Outra solução local é o VmwareFusion, que mantém o ip de um host quando ele é reiniciado. Esta é uma correção recente.
Então, sim, precisamos de uma maneira mais fácil de especificar ips estáticos para o VirtualBox.

@gittycat Sim. E é por isso que ainda executo o Docker Toolbox. Só para que eu possa criar um Enxame. Mesmo assim, prefiro ver esta Solicitação de recurso: Várias VMs no Docker para Mac / Windows.

+1

+1

+1

+1

+1

Se você precisar configurar um ip estático para uma máquina boot2docker, basta editar / var / lib / boot2docker / profile e adicionar

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

Depois disso, você precisa regenerar os certificados
docker-machine regenerate-certs rancher -f

+1

Acho que é hora, pelo menos para Mac n Windows, de encerrar este pedido como irrelevante. Todos os meus problemas em torno do ip da docker-machine foram resolvidos pelo docker para Mac. Pensamentos de todos?

@caledhwa concorda, docker mac é bastante estável agora não consigo ver mais nenhuma razão para lidar com docker-machine

@caledhwa Docker para Mac suporta apenas uma máquina - se você tiver uma configuração de várias máquinas, isso ainda é relevante.

@caledhwa como @davidolrik disse, Docker para Mac / Windows / AWS / Azure suporta apenas 1 host, o que exclui o desenvolvimento, demonstração e teste de Swarm / Kubernete / Mesos / etc de vários nós.

👍

+1

Ainda nenhum movimento sobre isso? Este é um bloqueador para o uso da docker-machine, pois não posso alterar o endereço de rede conflitante do convidado.

Para ser capaz de corrigir o IP da máquina docker para o virtualbox é necessário um recurso.

Eu configurei vários hosts docker como um exemplo de swarm e, após a reinicialização, quase todos os IPs de host mudaram e obterá o erro:

x509: certificate is valid for 192.168.99.103, not 192.168.99.100

Sim, posso usar docker-machine regenerate-certs para corrigir o problema do certificado, no entanto, o IP do armazenamento de valor-chave também mudou e o resultado é que meu enxame parou de funcionar, até que eu os altere manualmente na configuração, um por um denovo.

Talvez seja melhor apenas removê-los e criá-los novamente. No entanto, todas as imagens / contêineres nesses hosts serão perdidos.

Portanto, torne possível especificar o IP do host ou apenas alocar automaticamente o IP fixo para o host docker virtualbox e não permitir que ele seja alterado durante a reinicialização.

+1
Eu tenho um caso em que uso dnsmaq para DHCP e DNS, com base nos comentários acima tentei desabilitar o servidor DHCP da interface da caixa virtual no meu caso é vboxnet4 como VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet4 e preciso reiniciar a máquina para escolher o intervalo de DHCP de dnsmasq , o problema que estou enfrentando é que em cada criação de nova máquina, a máquina docker está habilitando o servidor dhcp em vboxnet4 e outros servidores que usam dnsmasq não são capazes de procure as docker-machine (s), eu tenho que repetir a remoção do vnet e reinicie as docker-machines. será ótimo se pudermos adicionar um sinalizador para docker-machine-create para ajudar a não habilitar o tipo de coisa dhcp.

+1

+1

+1

+1

Aqui está um comando que encapsula o trabalho de @micheletedeschi e fornece alguma conveniência para alternar entre as configurações DHCP e estáticas. Ele também atualiza seu arquivo /etc/hosts se solicitado.

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

Temos usado isso nas últimas semanas com grande sucesso. Basta executá-lo logo após criar sua máquina 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

Todos estavam pensando em uma solução mais "genérica" ​​(recurso nativo da máquina docker), pois essa opção é interessante também no Vsphere, Azure e outros ambientes de implantação. Mas é realmente bem-vindo.

+1

+1

+1

+1

+1

+1

A solução alternativa de @micheletedeschi mais ou menos funciona para mim, mas parece que o ip ocasionalmente reverte daquele que eu defini com seu script (192.168.99.100:2376) para aquele que foi gerado automaticamente quando eu criei minha máquina ( 192.168.99.104:2376). Bastante novo no docker, alguém tem alguma ideia?

+1, tive o mesmo problema hoje usando o ZooKeeper e o VirtualBox

A solução alternativa de @micheletedeschi mais ou menos funciona para mim, mas parece que o ip ocasionalmente reverte daquele que eu defini com seu script (192.168.99.100:2376) para aquele que foi gerado automaticamente quando eu criei minha máquina ( 192.168.99.104:2376). Bastante novo no docker, alguém tem alguma ideia?

Você está matando o cliente DHCP? Após a reversão, você pode confirmar se o cliente DHCP ainda não está em execução?

Eu encontrei outra solução alternativa que finalmente funciona para mim: eu simplesmente inicio o agente swarm em cada máquina usando _advertise = $ (ifconfig eth1 | grep -Eo "192.168.99.1 [0-9] {2}"): 2376_ e publico o atual IP para o ZooKeeper (ou qualquer outro serviço de descoberta). Isso está ok no meu caso, já que posso confiar que cada máquina receberá um endereço 192.168.99.1 ** (é apenas uma configuração experimental). acho que há expressões regex mais avançadas que podem ser aplicadas a intervalos de IP arbitrários. Isso não é legal e pode ser meio hackeado, mas funciona.

+1

+1

Mudanças arbitrárias de IPs de VM e certificados TLS que repentinamente se tornaram inválidos após a reinicialização causou muitos momentos pegos e desperdício de horas de trabalho

Isso é mesmo priorizado? Um total de 13 meses neste caso foi aberto. +10000

Meu palpite é que há uma discordância filosófica entre algumas pessoas da equipe da docker machine e o resto do mundo sobre esse assunto. Usar DHCP e ter um IP não determinístico é praticamente inútil para todos os meus casos de uso.

Eu tenho usado esta solução alternativa no ano passado. Ele é adaptado de algumas das soluções alternativas descritas acima.

SSH na máquina docker
docker-machine ssh padrão

Adicionar / editar o script de inicialização 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
saída

Reinicie a máquina e regenere certificados
padrão de reinicialização da máquina docker
docker-machine regenerate-certs default

+1

+1

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

+1

@eytanhanig Infelizmente, seu método não funcionou para mim. Estou no OS X 10.11.6. As máquinas obtêm os IPs desejados, mas ocorre um erro ao conectar-se a elas. O Docker sugere a regeneração das chaves, mas isso não corrigiu o problema.

+1

+1

É ridículo há quanto tempo as pessoas marcam isso com +1.

+1

Adoro ter esse recurso, no entanto, não achei nenhuma abordagem elegante para implementá-lo.

O problema é causado pelo DHCP no Virtualbox, se o sistema reiniciar, o servidor DHCP perderá todos os dados dos IPs alocados e tentará realocar o IP para aquelas VMs, que provavelmente não terão o mesmo IP da última vez.

Não tenho certeza se é certo deixar o Virtualbox persistir os dados DHCP. E o Boot2docker não persistirá no IP alocado pelo DHCP, o que na verdade é o comportamento correto.

IMHO, não acho que tentar contornar o DHCP seja a maneira certa de fazer, acho que adicionar a capacidade de especificar um IP estático para Boot2docker e driver docker-machine virtualbox deve resolver o problema.

Talvez seja melhor implementar o IP estático no projeto https://github.com/boot2docker/boot2docker primeiro, como adicionar a capacidade de especificar um IP estático, em vez de usar DHCP.

Aqui está o código para acionar a chamada 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 torná-lo condicional, adicionando um conjunto de configuração de IP em /var/lib/boot2docker/profile e, se um IP estático tiver sido configurado, use o IP estático em vez de solicitar o IP do DHCP.

Então, podemos adicionar uma ou mais opções para o driver virtualbox para especificar a configuração de IP estático, como --virtualbox-boot2docker-cidr , --virtualbox-boot2docker-gateway , --virtualbox-boot2docker-dns ...

+1

+1

+1

Caras, vamos. Podemos interromper o +1 em um problema de longa duração? Houve um botão Curtir implementado por esse motivo específico. Não há necessidade de spam para os assinantes.

Não há necessidade de spam para os assinantes.

Você pode cancelar a assinatura.
1

Sou totalmente a favor de enviar spam para os assinantes.

Alguns desses assinantes fazem parte da equipe do projeto.

Em 26 de janeiro de 2017 14:20, "Sergey Nevmerzhitsky" [email protected]
escreveu:

Não há necessidade de spam para os assinantes.

Você pode cancelar a assinatura.
[imagem: 1]
https://cloud.githubusercontent.com/assets/1006042/22332699/4cf1a8b4-e3e3-11e6-8bad-52406c3b8055.png

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/docker/machine/issues/1709#issuecomment-275386350 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AG44NZ2KdnsH6JTU6iI_5Uieh9WZxWXBks5rWJ2RgaJpZM4FsQYg
.

Sou totalmente a favor de enviar spam para os assinantes.
Alguns desses assinantes fazem parte da equipe do projeto.

Mantenedor fazendo check-in. _Não_ envie spam para o problema com +1 comentários. Esse é um problema bem conhecido e enviar spam para o tópico não adianta nada. Indique o apoio através das reações do emoji "+1", se desejar. Como sempre, temos prazer em avaliar solicitações pull ou propostas detalhadas. Obrigado a todos.

(Como uma observação lateral, @ twang2218 parece ter a ideia certa em geral - IPs estáticos são mais complicados do que parecem para acertar e atingir os casos de uso que os assinantes deste tópico podem ter em mente - talvez um problema pudesse ser iniciado no repositório boot2docker para discutir.)

Eu realmente não quero um ip estático. Mas, uma vez que o endereço IP é escolhido durante a criação, ele deve mantê-lo nas reinicializações subsequentes. Já está disponível?

Eu tinha um docker com VPN e o padrão 192.168.99.100 não estava carregando. Achei que isso era por causa da conexão VPN, então configurei uma rede de ponte dentro do Virtualbox para acessar o docker via 192.168.1.159. Eu gostaria que isso aparecesse no endereço IP publicado do Kitematic. Existe alguma maneira de fazer isso?

Para aqueles que não podem esperar que esse recurso seja implementado, atribuir ip personalizado, além de CPU / memória personalizada é possível usando o provedor Vagrant VirtualBox e o driver genérico docker-machine .

Por exemplo, no 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

e coloque a chave privada SSH padrão do vagrant com o nome vagrant.pem

e corra

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

e você obterá o host docker com ip personalizado, cpu, memória etc. configurados via vagrant ao mesmo tempo acessível via docker-machine.

Você pode encontrar o conjunto de arquivos de trabalho para Windows em https://github.com/joelhandwell/dockerhost

@jcwilson Oi Josh et al, muito obrigado .. Eu fiz um fork do seu script para corrigir o mesmo problema (consulte https://github.com/minishift/minishift/issues/343, https://github.com/minishift / minishift / issues / 598) em combinação com minishift:

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

Alguma novidade?

Atualmente, estou experimentando isso para Minishift: https://github.com/minishift/minishift/issues/1293
Embora, outra abordagem seria usar algo como cloud-init (que pode ser muito pesado para esta abordagem, ou incorporar um servidor DHCP dentro do binário baseado em Go e usar isso para forçar um endereço IP alocado)

+1.
Atualmente, ter mais de uma máquina é uma dor terrível. Se você usar certificados adicionais (por exemplo, para repositório docker personalizado) e alterar a ordem de inicialização das máquinas, você deve fazer:

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

Isso força você a regenerar certificados ou desabilitar todas as máquinas e restaurar a ordem de execução (o que às vezes também pode ser doloroso).

Além disso, usar o Chef para configurar o projeto baseado em Docker também seria muito melhor se você pudesse assumir que a máquina criada teria sempre o mesmo IP (por exemplo, adicionando-o ao arquivo hosts e você poderia esquecer os IPs).

+1

+1

+1
thx jcwilson, o script docker-machine-ipconfig é muito bom! eu precisei alterar o eth1 para eth0 no script, depois disso, o script funcionando perfeitamente para mim. Estou usando o vmware vsphere.

tchau.

+1

Como parte do minishift, implementamos https://github.com/minishift/minishift/issues/1316 e tem funcionado bem até agora. Agora estamos procurando alternativas para fazer o mesmo para os outros hipervisores ao longo do tempo, mas primeiro corrigiremos o endereço usando https://github.com/minishift/minishift/issues/1457 (para evitar que um novo endereço seja atribuído) . Ainda não conseguimos reservar tempo, vamos pousar isso no minikube também.

+1

A solução mais simples que encontrei é confiar na sequência de inicialização de máquinas virtuais por doker-machine.

O VirtualBox tem um servidor DHCP que começa a atribuir endereços IP a partir de 192.168.99.100.

  1. Pare todas as VMs
    docker-machine stop ${docker-machine ls -q}
    Esta etapa irá liberar todos os endereços atribuídos ao VirtualBox DHCP

  2. Inicie as VMs em ordem
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Estas etapas atribuem IP assim:
    192.168.99.100: vbox1
    192.168.99.101: vbox2
    192.168.99.102: vbox3

Observe que docker-machine start vbox1 vbox2 vbox3 não funcionará, mas não descobri por quê.

+1

quando eu executo docker-machine.exe start , leva mais de 15 segundos para DHCP waiting for an IP (se a internet estiver quebrada, leva mais de 2 minutos), eu acho que se pode definir um ip estático, ele pode inicializar rápido .

Esta funcionalidade foi adicionada ao Minishift spome há algum tempo, mas
precisa de uma modificação no ISO para funcionar.
No Hyper-V, encontramos problemas que a imagem boot2docker não
funcionou bem ... então só funcionou em imagens baseadas em CentOS e Fedora.
Além disso, isso não funciona com o driver KVM atual, pois ele depende do DHCP.

Isso precisaria de um pequeno redesenho ...

No domingo, 3 de fevereiro de 2019 às 23h08, fcying [email protected] escreveu:
>

quando eu executo docker-machine.exe start, leva mais de 15 segundos para o DHCP esperar por um IP (se a internet estiver quebrada, leva mais de 2 minutos), eu acho que se pode definir um ip estático, ele pode inicializar rápido.

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

-

Gerard Braad | http://gbraad.nl
[Fazendo questões de código aberto]

A solução mais simples que encontrei é confiar na sequência de inicialização de máquinas virtuais por doker-machine.

O VirtualBox tem um servidor DHCP que começa a atribuir endereços IP a partir de 192.168.99.100.

  1. Pare todas as VMs
    docker-machine stop ${docker-machine ls -q}
    Esta etapa irá liberar todos os endereços atribuídos ao VirtualBox DHCP
  2. Inicie as VMs em ordem
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Estas etapas atribuem IP assim:
    192.168.99.100: vbox1
    192.168.99.101: vbox2
    192.168.99.102: vbox3

Observe que docker-machine start vbox1 vbox2 vbox3 não funcionará, mas não descobri por quê.

Às vezes eu tinha que matar o processo VBoxNetDHCP.exe no Windows, para fazer a vbox atribuir IPs a partir de 192.168.99.100
Caso contrário, a vbox não liberaria IPs usados ​​por máquinas anteriores (não tenho certeza por que)

👍

Isso realmente tornaria minha vida mais fácil.

A solução mais simples que encontrei é confiar na sequência de inicialização de máquinas virtuais por doker-machine.

O VirtualBox tem um servidor DHCP que começa a atribuir endereços IP a partir de 192.168.99.100.

  1. Pare todas as VMs
    docker-machine stop ${docker-machine ls -q}
    Esta etapa irá liberar todos os endereços atribuídos ao VirtualBox DHCP
  2. Inicie as VMs em ordem
    docker-machine start vbox1 && docker-machine start vbox2 && docker-machine start vbox3
    Estas etapas atribuem IP assim:
    192.168.99.100: vbox1
    192.168.99.101: vbox2
    192.168.99.102: vbox3

Observe que docker-machine start vbox1 vbox2 vbox3 não funcionará, mas não descobri por quê.

É muito útil.

Para atribuir um static ip address 192.168.99.50 à minha docker-machine (padrão) no VirtualBox, usei:

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

Meu ambiente é OSX, VirtualBox (boot2docker.iso)

Esperando que isso possa ser útil 🙂
BTW: +1 para a nova solicitação de recurso 😉
Felicidades.

Sim, existe a opção de criar com ip específico. Tudo que você precisa fazer é especificar o intervalo de ip / ip com
Opção --virtualbox-hostonly-cidr .

Por exemplo:

  • quando você quiser atribuir um ip específico, digamos que você queira atribuir 10.15.1.24, então a configuração apropriada será (a coisa mais importante é a máscara que estamos usando aqui. Para um ip específico, você precisa definir a máscara de sub-rede para 32):
    docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "10.15.1.24/32" dev

  • se você quiser escolher um ip de um intervalo específico de ip, será necessário usar a máscara de sub-rede apropriada.

Se o problema é que você precisa manter a atualização do arquivo host, basta instalar o Avahi no seu contêiner e usar o mDSN.

Esta página foi útil?
0 / 5 - 0 avaliações