Machine: 【Resolvido】 Como a docker-machine pode adicionar um docker host existente?

Criado em 21 mar. 2016  ·  63Comentários  ·  Fonte: docker/machine

É um problema antigo, mas não consigo encontrar uma resposta útil.

Eu tenho o seguinte env:
Nome do host local (meu laptop): Chris-Laptop
docker-machine já está instalado, versão 0.6.0, build e27fb87, Mac OS X 10.11
Nome do host remoto (Meu VPS): li845-130 (139.162.3.130)
docker-engine já está instalado, CentOS 7.0

1. Processo daemon do Docker no host remoto
[ root @ li845-130 ~] # ps -ef | grep docker |
root 12093 1 0 02:09? 00:00:00 / usr / bin / docker daemon -H tcp: //0.0.0.0 : 2376

2. Configure a conexão ssh sem senha
[ tdy218 @ Chris-Laptop .ssh] $ ssh [email protected]
Último login com falha: seg, 21 de março, 02:54:06 UTC de 2016 de 125.88.177.95 em ssh: notty
Houve 54 tentativas de login malsucedidas desde o último login bem-sucedido.
Último login: Segunda-feira, 21 de março, 02:25:25 de 2016, 114.248.235.223
[ root @ li845-130 ~] #

3. Adicionar um host docker remoto às máquinas docker locais
[ tdy218 @ Chris-Laptop .ssh] $ docker-machine create --driver none -url = tcp: //139.162.3.130 : 2376 linodevps
Executando verificações de pré-criação ...
Criando máquina ...
Para ver como conectar seu Docker Client ao Docker Engine em execução nesta máquina virtual, execute: docker-machine env linodevps
[ tdy218 @ Chris-Laptop .ssh] $ docker-machine ls
NOME DO MOTORISTA ATIVO DO ESTADO URL ERROS DO SWARM DOCKER
default * virtualbox Running tcp: //192.168.99.100 : 2376 v1.10.3
linodevps - nenhum Executando tcp: //139.162.3.130 : 2376 Desconhecido Incapaz de consultar a versão do docker: Incapaz de ler a configuração TLS: open /Users/tdy218/.docker/machine/machines/linodevps/server.pem: nenhum arquivo ou diretório.
[ tdy218 @ Chris-Laptop .ssh] $
[ tdy218 @ Chris-Laptop .ssh] $ docker-machine -D regenerate-certs linodevps
Versão da máquina Docker: 0.6.0, compilação e27fb87
Regenerar certificados de máquina TLS? Aviso: isso é irreversível. (s / n): s
Gerando certificados TLS novamente
Caminho binário encontrado em / usr / local / bin / docker-machine
Iniciando servidor de plugin para driver nenhum
Servidor de plug-in ouvindo no endereço 127.0.0.1:54648
() Chamando .GetVersion
Usando API versão 1
() Chamando .SetConfigRaw
() Chamando .GetMachineName
comando = configureAuth machine = linodevps
Aguardando SSH estar disponível ...
Chegando à função WaitForSSH ...
(linodevps) Chamando .GetSSHHostname
(linodevps) Chamando .GetSSHPort
(linodevps) Chamando .GetSSHKeyPath
(linodevps) Chamando .GetSSHUsername
Usando o tipo de cliente SSH: externo
{[-o BatchMode = sim -o PasswordAuthentication = não -o StrictHostKeyChecking = no -o UserKnownHostsFile = / dev / null -o LogLevel = quiet -o ConnectionAttempts = 3 -o ConnectTimeout = 10 -o ControlMaster = não -o ControlPath = nenhum @ -p 0] / usr / bin / ssh}
Prestes a executar o comando SSH:
saída 0
Erro SSH cmd, saída: status de saída 255: uso: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b
..................

Erro ao obter o comando ssh 'exit 0': algo deu errado ao executar um comando SSH!
comando: saída 0
err: sair do status 255
saída: uso: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
.....................

Ele relata "Muitas tentativas esperando que o SSH esteja disponível. Último erro: Número máximo de novas tentativas (60) excedido ..." por último.

Por quê ? Eu configurei a conexão SSH entre o host local e o host docker remoto sem senha.

Como posso exportar o host docker para a linha de comando docker-machine local?

Comentários muito úteis

@dweomer Adicionar máquina docker existente de outro computador não é um caso de uso muito comum e básico?

Todos 63 comentários

O docker-machine oferece suporte para adicionar um host docker existente?

Como eu estava pesquisando os documentos nas últimas 5 horas, na verdade, há a opção "--driver = none" (não documentado). Consulte https://github.com/docker/machine/issues/2270 .

@ tdy218 @atemerev Pelo que me lembro, as opções --driver none foram intencionalmente enterradas (e achei que foram removidas do executável lançado) porque são usadas apenas para fins de teste.

Problema relacionado: Eu tenho uma gota no oceano digital criada com docker-machine. Como posso gerenciar uma instância de outro laptop?

Um colega recriou os certificados de seu laptop usando docker-machine regenerate-certs [name] . e agora não consigo mais acessar minha instância. Devo copiar os novos certificados em algum lugar manualmente? A documentação sobre isso é realmente confusa.

$ docker-machine ls
NAME           ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS
default        -        virtualbox     Stopped                                      Unknown   
gapp-sandbox   *        digitalocean   Running   tcp://xx.xxx.xxx.xx:2376           Unknown   Unable to query docker version: Get https://xx.xxx.xxx.xx:2376/v1.15/version: x509: certificate signed by unknown authority

Eu encontrei uma solução alternativa: https://github.com/docker/machine/issues/2270

Edite o config.json da máquina para apontar para o CA e as chaves do cliente para aquela máquina específica, em vez das chaves globais da máquina.

Então copiei todos os arquivos da pasta do meu colega e substituí todos os caminhos pelos da minha máquina. No meu caso, o caminho final é /Users/mturatti/.docker/machine/machines/gapp-sandbox/ .
Solução desagradável, mas parece funcionar.

ca.pem
cert.pem
config.json
id_rsa
id_rsa.pub
key.pem
server-key.pem
server.pem

@dweomer Adicionar máquina docker existente de outro computador não é um caso de uso muito comum e básico?

@dweomer Adicionar máquina docker existente de outro computador não é um caso de uso muito comum e básico?

@atemerev : Não, acho que não. Pelo que entendi, Docker Machine existe para criar / provisionar hosts que são habilitados para Docker.

Dito isso, existe o driver menos óbvio generic que acho que @ tdy218 deveria estar usando. O driver generic assumirá o controle de um host e o provisionará novamente. Tudo o que é necessário é um host em execução com um daemon ssh e um usuário nesse host com acesso sem senha sudo (ou apenas root). Esse reprovisionamento não é destrutivo, pois uma instalação existente do Docker será, no máximo, atualizada.

@dweomer
Tentei usar um driver genérico para adicionar um host docker existente no teste a seguir.
Nome do host local (meu laptop): Chris-Laptop
docker-machine já está instalado, versão 0.6.0, build e27fb87, Mac OS X 10.11
Nome do host remoto (Meu VPS): li845-130 (139.162.3.130)
docker-engine já está instalado, CentOS 7.0

1. Processo Docker Daemon no host remoto
[ root @ li845-130 ~] # ps -ef | grep docker |
root 12093 1 0 02:09? 00:00:00 / usr / bin / docker daemon -H tcp: //0.0.0.0 : 2376

2. Configure a conexão ssh sem senha
[ tdy218 @ Chris-Laptop ~] $ ssh [email protected]
Último login: Seg, 28 de março 03:06:07 2016 de 111.193.199.188

3. Adicionar um host docker remoto às máquinas docker locais
[ tdy218 @ Chris-Laptop ~] $ docker-machine -D create --driver generic --generic-ip-address 139.162.3.130 --generic-ssh-user root linodevps
Versão da máquina Docker: 0.6.0, compilação e27fb87
Caminho binário encontrado em / usr / local / bin / docker-machine
Lançando servidor de plugin para driver genérico
Servidor de plug-in ouvindo no endereço 127.0.0.1:50319
() Chamando .GetVersion
Usando API versão 1
() Chamando .SetConfigRaw
() Chamando .GetMachineName
(flag-lookup) Chamando .GetMachineName
(flag-lookup) Chamando .DriverName
(flag-lookup) Chamando .GetCreateFlags
Caminho binário encontrado em / usr / local / bin / docker-machine
Lançando servidor de plugin para driver genérico
Servidor de plug-in ouvindo no endereço 127.0.0.1:50323
() Chamando .GetVersion
Usando API versão 1
() Chamando .SetConfigRaw
() Chamando .GetMachineName
(linodevps) Chamando .GetMachineName
(linodevps) Chamando .DriverName
(linodevps) Chamando .GetCreateFlags
(linodevps) Chamando .SetConfigFromFlags
Executando verificações de pré-criação ...
(linodevps) Chamando .PreCreateCheck
(linodevps) Chamando .GetConfigRaw
Criando máquina ...
(linodevps) Chamando .Create
(linodevps) Chamando .GetConfigRaw
(linodevps) Nenhuma chave SSH especificada. Conectar-se a esta máquina agora e no futuro exigirá que o agente ssh contenha a chave apropriada.
(linodevps) DBG | IP: 139.162.3.130
(linodevps) Chamando .DriverName
(linodevps) Chamando .DriverName
Esperando que a máquina esteja funcionando, isso pode levar alguns minutos ...
(linodevps) Chamando .GetState
Detectando o sistema operacional da instância criada ...
Aguardando SSH estar disponível ...
Chegando à função WaitForSSH ...
(linodevps) Chamando .GetSSHHostname
(linodevps) Chamando .GetSSHPort
(linodevps) Chamando .GetSSHKeyPath
(linodevps) Chamando .GetSSHUsername
Usando o tipo de cliente SSH: externo
{[-o BatchMode = sim -o PasswordAuthentication = não -o StrictHostKeyChecking = no -o UserKnownHostsFile = / dev / null -o LogLevel = quiet -o ConnectionAttempts = 3 -o ConnectTimeout = 10 -o ControlMaster = não -o ControlPath = nenhum [email protected] -p 22] / usr / bin / ssh}
Prestes a executar o comando SSH:
saída 0
Erro SSH cmd, resultado::
Detectando o provisionador ...
(linodevps) Chamando .GetSSHHostname
(linodevps) Chamando .GetSSHPort
(linodevps) Chamando .GetSSHKeyPath
(linodevps) Chamando .GetSSHUsername
Usando o tipo de cliente SSH: externo
{[-o BatchMode = sim -o PasswordAuthentication = não -o StrictHostKeyChecking = no -o UserKnownHostsFile = / dev / null -o LogLevel = quiet -o ConnectionAttempts = 3 -o ConnectTimeout = 10 -o ControlMaster = não -o ControlPath = nenhum [email protected] -p 22] / usr / bin / ssh}
Prestes a executar o comando SSH:
cat / etc / os-release
Erro SSH cmd, resultado:: NAME = "CentOS Linux"
VERSÃO = "7 (núcleo)"
ID = "centos"
ID_LIKE = "rhel fedora"
VERSION_ID = "7"
PRETTY_NAME = "CentOS Linux 7 (Core)"
ANSI_COLOR = "0; 31"
CPE_NAME = "cpe: / o: centos: centos : 7"
HOME_URL = " https://www.centos.org/ "
BUG_REPORT_URL = " https://bugs.centos.org/ "

CENTOS_MANTISBT_PROJECT = "CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION = "7"
REDHAT_SUPPORT_PRODUCT = "centos"
REDHAT_SUPPORT_PRODUCT_VERSION = "7"

Não foi possível definir CPE_NAME chave, nenhum campo de estrutura correspondente encontrado
Não foi possível definir a chave, nenhum campo de estrutura correspondente foi encontrado
Não foi possível definir a chave CENTOS_MANTISBT_PROJECT, nenhum campo de estrutura correspondente foi encontrado
Não foi possível definir a chave CENTOS_MANTISBT_PROJECT_VERSION, nenhum campo de estrutura correspondente foi encontrado
Não foi possível definir a chave REDHAT_SUPPORT_PRODUCT, nenhum campo de estrutura correspondente foi encontrado
Não foi possível definir a chave REDHAT_SUPPORT_PRODUCT_VERSION, nenhum campo de estrutura correspondente encontrado
Não foi possível definir a chave, nenhum campo de estrutura correspondente foi encontrado
host compatível encontrado: centos
Provisionando com centos ...
Nenhum storagedriver especificado, usando o mapeador de dispositivos

(linodevps) Chamando .GetMachineName
(linodevps) Chamando .GetSSHHostname
(linodevps) Chamando .GetSSHPort
(linodevps) Chamando .GetSSHKeyPath
(linodevps) Chamando .GetSSHUsername
Usando o tipo de cliente SSH: externo
{[-o BatchMode = sim -o PasswordAuthentication = não -o StrictHostKeyChecking = no -o UserKnownHostsFile = / dev / null -o LogLevel = quiet -o ConnectionAttempts = 3 -o ConnectTimeout = 10 -o ControlMaster = não -o ControlPath = nenhum [email protected] -p 22] / usr / bin / ssh}

4. A linha de comando do host docker remoto.
[ root @ linodevps ~] # ps -ef | grep docker |
root 17079 1 0 03:06? 00:00:00 / usr / bin / docker daemon -H tcp: //0.0.0.0 : 2376
root 17185 1 0 03:06? 00:00:00 versão docker sudo
root 17190 17185 0 03:06? 00:00:00 versão docker

O processo do daemon do docker foi reiniciado, mas havia mais dois processos de versão do docker, então tentei executar o comando docker version manualmente, ele estava travado.

É tão difícil adicionar um host docker existente à linha de comando docker-machine ...

Se o host remoto não tiver nenhum docker engine, é fácil criar docker host (instalar docker engine) a partir da linha de comando docker-machine, mas como o problema acima, a docker-machine é limitada.

@dweomer Isso é verdade, mas se eu provisionar docker-machine ou docker-swarm, como faço para, digamos, permitir que outro desenvolvedor implante contêineres lá? Como faço para transferir variáveis ​​de configuração / env entre máquinas? Até agora, só posso usar hosts de máquina docker provisionados eu mesmo, e apenas de uma única máquina (e se estiver com defeito? Como restauro a configuração em outra?).

Para mim, docker-machine / docker-swarm estão muito longe de estar prontos para produção e devem ser marcados como beta pelo menos. Ou eu gostaria de ouvir de alguém que realmente está usando na produção ...

FWIW, se você apenas soltar ~ / .docker daquela estação de trabalho para o novo (presumindo que o diretório inicial seja o mesmo caminho), ele funcionará. Se o diretório inicial for diferente, você precisará editar os arquivos .json em vários lugares (chaves e certificados etc.) para alterar, por exemplo, /Users/macuser/.docker para /home/linuxuser/.docker .

Parece que esta questão foi exaustivamente abordada e / ou cobre terreno já estabelecido em outras questões. Obrigado a todos.

@nathanleclaire Só para ficar claro, é a abordagem oficial para adicionar hosts docker existentes (criados por docker-machine ou outro) para copiar a pasta ~ / .docker entre as máquinas clientes? Em caso afirmativo, existe algum subconjunto específico de arquivos / um arquivo que precisamos copiar?

Se a abordagem oficial for usar o driver genérico, seria útil resolver o problema @ tdy218 descrito no comentário aqui .

Não creio que esta questão tenha sido abordada. Estou tentando empurrar o código para uma nova máquina e a melhor resposta que alguém pode dar é encontrar o cara que fez a máquina e copiar seus arquivos para mim.

Não tenho certeza se alguém tentou fazer isso aqui no mundo real, mas é uma merda.

@TheSeanBrady Vamos manter a discussão sobre questões civis. Se você tiver propostas de soluções que gostaria de ver, compartilhe-as. Vamos nos concentrar nas soluções dos problemas.

Estou apenas sendo honesto. Você tenta enviar e-mails pedindo arquivos, porque até agora não está funcionando para mim. Este foi encerrado sem resolver o problema.

Estou apenas sendo honesto. Você tenta enviar e-mails pedindo arquivos, porque até agora não está funcionando para mim. Este foi encerrado sem resolver o problema.

Você não acha que dizer algo "uma merda" e insinuar que o resto de nós não vivemos "no mundo real" é desnecessariamente duro e não construtivo?

Tentamos fomentar uma comunidade onde a colaboração e a positividade são encorajadas. Peço que, se você quiser participar, siga esses princípios também.

Devido ao uso de credenciais de API armazenadas, chaves SSH e certificados, o compartilhamento de docker-machine s entre computadores é um problema de ACL / gerenciamento de segredos desenvolvido, do tipo que outras classes de tecnologia inteiras foram inventadas para resolver. É um grande problema de escopo. Podem ser tomadas medidas para atenuá-lo que ajudem em seu caso de uso, então por que não sugerir algumas soluções proativas para implementar?

Se quiser enviar uma proposta para lidar com isso, fique à vontade. Se você também quiser fazer uma proposta apoiada por código em uma solicitação pull, eu também o encorajo a fazer isso. Mas, de qualquer forma, concentre a discussão em soluções e permaneça positivo.

Você não acha que dizer algo "uma merda" e insinuar que o resto de nós não vivemos "no mundo real" é desnecessariamente duro e não construtivo?

Na verdade, não quando está acompanhando ...

Parece que esta questão foi exaustivamente abordada e / ou cobre terreno já estabelecido em outras questões. Obrigado a todos.

Isso é basicamente o que eu chamo de dispensa sumária. E por "mundo real", quero dizer o ambiente onde usamos essas coisas, não onde você pode passar por um dos desenvolvedores no corredor.

Esta teria sido uma resposta mais apropriada ...

Devido ao uso de credenciais API armazenadas, chaves SSH e certificados, o compartilhamento de máquinas docker entre computadores é um problema completo de gerenciamento de segredos / ACL, do tipo que outras classes de tecnologia inteiras foram inventadas para resolver.

... mesmo que essas tecnologias tenham sido inventadas e a maioria delas seja de código aberto.

No entanto, como você perguntou, que tal docker-machine add <hostname> , usando autenticação de chave SSH para passar os certificados necessários para a conexão TLS?

que tal uma máquina docker adicionar, usando a autenticação de chave SSH para passar os certificados necessários para a conexão TLS?

Isso poderia resolver o problema ... para ambientes de desenvolvimento, pelo menos

Outra opção é usar um soquete docker em um host disponível via SSH, que é amplamente preferível para mim, pois usa o mecanismo de autenticação SSH existente (que no meu caso é feito backup com HSMs) e não requer o ajuste de portas / firewalls para suporte TLS.

Eu criei minha própria solução para isso usando socat, mas seria muito bom se docker-machine pudesse suportá-la. Não é difícil fazer o ssh para um host, instalar o socat se ainda não estiver instalado e usar o socat para transformar a sessão ssh em um soquete local para comunicação com o /var/lib/docker.sock remoto. Isso também significa que a docker-machine não teria que saber nada sobre autenticação ou certificados ou TLS neste modo de driver, embora dependa do socat localmente para criar o soquete local ...

Seria bom ver um modo de driver que faz esse tipo de configuração de soquete local da mesma forma que o driver ssh existente configura todas as coisas TLS. Muitas organizações já têm a distribuição de chaves SSH / encaminhamento de porta resolvido e esperar que agora distribuam / gerenciem uma PKI para o TLS (e abram outra porta) é trabalhoso.

tyrell:~▻ cat Library/Local/bin/ber1docker 
#!/bin/bash

DOCKER_REMOTE_HOST="ber1.local"
DOCKER_SOCK="$TMPDIR/docker.sock"
export DOCKER_HOST="unix://$DOCKER_SOCK"
rm $DOCKER_SOCK

socat UNIX-LISTEN:$DOCKER_SOCK,reuseaddr,fork \
   EXEC:"ssh root@$DOCKER_REMOTE_HOST 'socat STDIO UNIX-CONNECT:/var/run/docker.sock'" &

Então, nenhum "docker-machine add ..."?

+1 para docker-machine add ...

Queremos ter a beleza de eval $(docker-machine env mymachine) para todos os membros da nossa equipe (para ambientes de desenvolvimento compartilhados, é claro).

Eu girei uma gota com o driver digitalocean e coloquei um site funcionando usando docker-compose da minha estação de trabalho.

Então eu tive que fazer o trabalho no site, mas de um local completamente diferente, longe de minha estação de trabalho onde eu fiz os comandos originais da docker-machine.

Não é uma situação bastante comum?

É uma solução muito comum. Especialmente se você trabalha em uma coisa chamada "equipe". Mas eles evitam esse tópico há cerca de 18 meses. Tudo o que eles fazem é fechar questões como essa e dizer algo como "é muito complicado implementar esse recurso" e que você pode fazer isso sozinho e propor uma solicitação de pull a qualquer momento.
Parece-me que eles nem começaram a trabalhar em uma solução nos últimos 18 meses.

Obrigado pela sua resposta, embora não seja uma maneira fácil de perceber ainda.

Mantenha as credenciais e outros enfeites na nuvem.

Dê-me instruções sobre como usar minha caixa de depósito ou Google Drive para armazená-lo.

Deixe-me consultar as informações do digitalocean, já que esse é o driver que eu estava usando.

Isso realmente não pode ser tão difícil.

Sim, parece seguro.
Na Quarta, 9 de novembro de 2016 às 09:28 Michael Schwartz [email protected]
escrevi:

Mantenha as credenciais e outros enfeites na nuvem.

Dê-me instruções sobre como usar minha caixa de depósito ou Google Drive para armazená-lo.

Isso realmente não pode ser tão difícil.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/docker/machine/issues/3212#issuecomment -259457472,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ABxbKbZQLUfK9ENnWpNKiF207ZGpXFs2ks5q8fSagaJpZM4H07I2
.

Não menos seguro do que enviar os comandos e todo o meu código pela internet para fazer em primeiro lugar.

Ou fazer o upload de todas as minhas coisas proprietárias para o docker hub ou github, até mesmo para um repositório privado.

Para aqueles que estão tentando adicionar uma máquina docker ao ambiente de desenvolvimento, você pode fazer assim:

docker-machine create -d "none" --url http://192.168.10.100 : 4243 bla

isso se você tiver o HTTP e não a autenticação TSL habilitada no host.

Passei muito tempo encontrando essas coisas sem documentos

Acho que parece um pouco míope permitir que apenas uma máquina gerencie um cluster docker também. Mais do que apenas compartilhar a responsabilidade de gerenciar o cluster com sua equipe, que tal ter mais de um ponto de falha ou permitir que vários agentes automatizados possam interagir com o cluster docker?

+1 para o comando de exportação.

Ele pode exportar todas as configurações e certificados para um arquivo tar ou zip seguro que pode ser importado por docker-machine com uma senha.

Parece um pedido razoável.

@bmmathe Esse comando já é tar -c ~/.docker/machine | bzip2 > docker-machine-config.tbz2 .

Veja como o lxd lida com isso. Talvez uma senha ou chave pudesse ser configurada na máquina que permitiria copiar ou regenerar certificados.

Isso é tão triste 😖. Minhas máquinas remotas agora mostram o status local de timeout ao executar docker-machine ls , algo bagunçou as configurações da máquina. Não consigo descobrir como reconfigurá-los / corrigi-los na pasta de máquinas Docker local. Não há mais provisionamento local? Devo excluir as VMs e recriá-las?

Votação de uma opção para adicionar máquinas remotas às máquinas Docker locais:

docker-máquina adicionar--motorista

⏳🤒

Este é um recurso muito importante. Eu não entendo porque é tão difícil. Mesmo, se eu precisar regenerar os certificados não será um problema para mim, mas gostaria de ter isso documentado e um comando para trabalhar.

Se bem me lembro, meu problema foi causado por ter permissões erradas e / ou nome de usuário local não correspondendo ao remoto (o usuário padrão é docker-user ). Provavelmente é um problema da sua parte, você precisa cavar mais fundo.
O driver genérico para o comando docker-machine funciona bem para diferentes provedores, por exemplo, google.

Verifique estes:
https://github.com/docker/machine/issues/3522#issuecomment -280275707
https://docs.docker.com/machine/drivers/generic/
• Não consigo encontrar as outras conversas que tive sobre este assunto que me levaram à solução.

Hoje, encontrei a causa da adição de falha de host docker remoto no meu caso.
[ root @ linodevps ~] # ps -ef | grep docker | grep -v grep
root 17079 1 0 03:06? 00:00:00 / usr / bin / docker daemon -H tcp: //0.0.0.0 : 2376 // Este estilo de gravação não permite fd local ou comunicação de soquete unix entre o cliente docker e o servidor, portanto, ele trava no sudo docker comando version ao executar o add docker-machine.

Para corrigi-lo, basta editar o arquivo de configuração do serviço docker (o padrão é /usr/lib/systemd/system/docker.service), alterar o valor do parâmetro ExecStart de / usr / bin / docker daemon -H tcp: // 0.0.0.0 : 2376 para / usr / bin / docker daemon -H tcp: //0.0.0.0 : 2376 -H unix: ///var/run/docker.sock (o padrão é / usr / bin / docker daemon -H fd: //) ou / usr / bin / docker daemon -H tcp: //0.0.0.0 : 2376 -H fd: // ou export DOCKER_HOST = tcp: //0.0.0.0 : 2376,
e então sudo systemctl daemon-reload && sudo systemctl restart docker, reexecute o comando docker-machine add, espere um momento, ele adicionará com sucesso. No processo de adição, a docker-machine irá gerar certificados ssl para o docker host de destino e gerar um novo arquivo de configuração do serviço docker 10-machine.conf em um novo diretório denominado /etc/systemd/system/docker.service.d

tdy218 @ Chris-Laptop $ dm. ls
NOME DO MOTORISTA ATIVO DO ESTADO URL ERROS DO SWARM DOCKER
docker-vm119 - tcp em execução genérico
docker-vm120 - genérico interrompido desconhecido

docker-vm119 é o host docker existente antes de adicionar.

A partir deste caso, sabemos que docker-machine é compatível com a adição de um host docker existente, obrigado @Bean Young.

docker-machine create --driver none -url=tcp://123.123.123.123:2376 dockerhost1 é a melhor coisa que aprendi sobre docker em muito tempo!

Realmente deveria ser mais fácil compartilhar uma máquina de desenvolvimento entre usuários.

// cc @nathanleclaire

atualização: para ficar claro: especificamente, não me importo de pré-compartilhar os certificados com outros membros da equipe. Também há espaço para melhorias.

@dhrp que processo você segue para pré-compartilhar os certificados? Onde eles podem ser encontrados?

Oh meu caro senhor, não posso acreditar no passado mais de um ano e meio ninguém quer atirar neste problema 😞 😞 😞

@thaJeztah @AkihiroSuda @albers @tianon você realmente acha que este não é um requisito muito comum e crítico?

Tentei reprovisionar um host docker existente ( docker-machine create --driver=generic --generic-ip-address <ip> <name> e pareceu funcionar sem invalidar certificados existentes. Isso foi feito na mesma máquina que provisionou originalmente o host docker ... esse é um resultado esperado?

Você pode reabrir este problema? Acho que ainda não está resolvido.

Tropecei nisso por acidente.

Bem, @nathanleclaire deixou claro o ponto: este NÃO é o ponto de adicionar um recurso do docker-machine, mas sim o ponto de compartilhar chaves que NÃO deveriam ser armazenadas em qualquer outro lugar que não a máquina cliente original. É exatamente assim que deveria ser feito e algumas pessoas aqui estão ficando com raiva sem pensar o suficiente sobre o assunto.

Se você realmente deseja compartilhar as chaves com uma equipe, vá em frente com qualquer repositório privado de controle de origem e aceite os riscos que está assumindo. Para exportar as chaves necessárias, há um script que alguém já fez: https://gist.github.com/schickling/2c48da462a7def0a577e

"Não há razão para não sermos civilizados" - Leônidas

Ainda acho que a docker-machine deve se comportar mais como scp. O que impede adicionar suporte para várias chaves?

Uma solução alternativa para isso, que acabei de encontrar.
Se você tiver uma docker-machine existente na mesma plataforma (a minha é o google) e você pode fazer ssh / scp para essa máquina sem exigir docker-machine, você pode copiar a outra máquina e fazê-la funcionar.
Eu fiz:

mkdir ~/.docker/machine/machines/new-machine
cp -r ~/.docker/machine/machines/old-machine/* ~/.docker/machine/machines/new-machine/

#then replace all instances of "old-machine" with "new-machine" in ~/.docker/machine/machines/new-machine/config.json

#then add the public key from your new-machine folder into the authorized_keys file for the docker-user on the new machine, e.g.
scp ~/.docker/machine/machines/new-machine/id_rsa.pub docker-user<strong i="8">@new_machine</strong>:/home/docker-user
ssh docker-user<strong i="9">@new_machine</strong> -c "cat ~/id_rsa.pub >>~/.ssh/authorized_keys"

(Não copie os comandos ssh literalmente, veja como fazê-lo corretamente - https://encrypted.google.com/search?hl=en&q=ssh%20copy%20public%20key)

+1 para o comando export / import.
1 para suporte multi-chave.

Não ser capaz de mover estações de trabalho de gerenciamento é simplesmente inaceitável e cria um grande ponto único de falha.

Por exemplo, computador perdido, roubo, incêndio, falha de hardware, falha de software, problemas de acesso da equipe, problemas de administração, etc ...

Docker-machine não foi concebido com isso em mente - esta é uma ferramenta de fast-food para provisionamento de desenvolvedor único. É isso, puro e simples, e funciona - e é grátis!

Alguns recursos mencionados aqui são implementados na oferta do Docker EE (como equipes e RBAC).

Se as pessoas não podem ser gratas, tente pelo menos ser razoável.

Não acredito que o compartilhamento de máquina tenha sido mencionado neste tópico ainda:

machine-export <machine-name>
>> exported to <machine-name>.zip
machine-import <machine-name>.zip
>> imported

Ei @andrevtg

Desculpe se pareci ingrato. Eu realmente amo a docker-machine e pensei que isso a tornaria ainda melhor.
Acho que a capacidade de um único desenvolvedor se mover facilmente entre computadores seria muito útil.

Se minha agenda ficar livre, posso tentar aprender a GO e tentar adicionar esse recurso.

Ei @ dmitrym0

Acho que este tíquete estava mais focado na falta de capacidade de se conectar a hosts docker remotos existentes.
Dito isso, o compartilhamento de máquina parece útil ao mover hosts docker locais.
Obrigado pela sugestão.

@ Jared-Harrington-Gibbs machine-share resolve especificamente o problema de "_adicionar hosts de máquina docker existentes_". Implementamos vários aplicativos via docker-compose e funciona bem para nós. Exportamos o conjunto de certificados com machine-share e o distribuímos a todos os membros da equipe que precisam. Não é ideal, mas funciona bem.

Tentei usar um driver genérico para adicionar um host docker existente, ele será adicionado com êxito após várias tentativas.

@sneak Esta solução não parece funcionar para mim, pois os caminhos em config.json não estarão apontando para os arquivos corretos. Eu presumiria que docker-machine depende do arquivo config.json , mas posso estar errado, não testei ainda.

Isso representa um problema para mim, porque talvez eu esteja executando em um ambiente onde posso não saber o caminho exato em que os arquivos estão armazenados. Talvez possa haver uma opção para um caminho relativo?

Se o problema for mão de obra, posso dedicar alguns dias para tentar fornecer uma solução para a comunidade. No entanto, preferiria receber alguma orientação dos mantenedores. [Resolved] neste caso indica uma decisão de não oferecer suporte nativo a esse recurso ou ele já é compatível em algum lugar que não estou vendo?

Este é um recurso que NÃO SE PRETENDE de ser implementado. Não faz sentido esperar que a máquina remota armazene as chaves privadas que não deveriam existir em nenhum lugar exceto na máquina do desenvolvedor original.

Até o Docker EE garante que um "pacote de cliente" diferente seja gerado cada vez que for solicitado e não os armazene no host.

As pessoas aqui estão pedindo um recurso que seja simples de implementar, mas que não faça nenhum sentido para ser implementado devido a uma restrição de segurança razoável.

@andrevtg A solicitação não é para a própria VM armazenar as chaves (o que tornaria as chaves totalmente inúteis), mas para o cliente docker-machine (que é feito de código, é um aplicativo real), para fornecer uma maneira para os usuários para transmitir voluntariamente as chaves de um cliente para outro.

Uma maneira simples de fazer isso pode ser fornecer um comando docker-machine export que agrupa as chaves em um arquivo e um comando docker-machine import para um destinatário desse arquivo importar as máquinas descritas em o arquivo. A criptografia / descriptografia nos limites da transmissão das chaves é da conta dos usuários (eles podem usar o e-mail PGP, SFTP, o que quiserem).

Exatamente docker-machine create cria um enorme arquivo de configuração e chaves que os novatos não entendem ou não sabem como replicar. Talvez criar uma chave ssh seja tão simples quanto adicionar uma chave ao arquivo hosts, mas isso não está documentado. Em qual contêiner o adicionamos? E como o configuramos em uma máquina diferente e notificamos docker-machine sobre isso? Ainda podemos usar docker-machine use ou temos que definir manualmente todas as variáveis ​​ambientais.

Idealmente, deve haver docker-machine add [name] para adicionar uma chave, docker-machine export para exportar os arquivos de configuração e docker-machine import para importar esses arquivos de configuração para outra máquina. Também seria bom ter docker-machine rm [name] para revogar o acesso às chaves.

@dhrp Eu tenho um servidor docker rodando em um rpi. Eu gostaria de acessá-lo de meu host local com máquina docker. Então, tudo que eu teria que fazer é:
docker-machine create --driver none -url=tcp://raspberry.local:22 rpihost
Isto funciona?

Então @ 360disrupt , não é? Estou lutando com o mesmo caso de uso.

Então @ 360disrupt , não é? Estou lutando com o mesmo caso de uso.

Não, ainda não.

Olá a todos. Isso ainda não foi resolvido? Usamos o docker para todos os aplicativos da empresa para a qual trabalho. Nosso maior problema está relacionado ao compartilhamento das máquinas. Tentei usar o driver genérico várias vezes, mas o problema com essa abordagem é que quando você cria uma máquina com o driver genérico e a conecta a um servidor existente, a criação simplesmente descarta os containers que estão atualmente em execução no servidor.

A única maneira que encontramos foi construir um script simples em Python que apenas importa e exporta a máquina que o desenvolvedor deseja acessar. Este script é responsável por copiar todos os arquivos de configuração e certificados do proprietário da máquina para a nova fonte. Funciona bem e não estamos tendo problemas com isso, só não posso acreditar que não haja uma forma oficial de compartilhar máquinas sem ter que compartilhar nossos certificados privados.

Estou trabalhando em um projeto e irei publicá-lo no GitHub para resolver esse problema de uma maneira diferente. Basicamente, estou apenas construindo um PaaS que vai concentrar todos os certs de todas as máquinas que temos aqui em nossa empresa. E quando alguém deseja implantar ou fazer algo parecido, você só precisa se conectar com o PaaS, e não com o servidor. É como um túnel. Em breve lançarei a primeira versão desse PaaS.

+1 para docker-machine add ou docker-machine create --existing

isso resolveu meu problema: machine-share : computer:: rabbit2:

@dweomer Adicionar máquina docker existente de outro computador não é um caso de uso muito comum e básico?

@atemerev : Não, acho que não. Pelo que entendi, Docker Machine existe para criar / provisionar hosts que são habilitados para Docker.

Dito isso, existe o driver menos óbvio generic que acho que @ tdy218 deveria estar usando. O driver generic assumirá o controle de um host e o provisionará novamente. Tudo o que é necessário é um host em execução com um daemon ssh e um usuário nesse host com acesso sem senha sudo (ou apenas root). Esse reprovisionamento não é destrutivo, pois uma instalação existente do Docker será, no máximo, atualizada.

Sei que parece um problema resolvido, mas gostaria apenas de afirmar que tenho que concordar com @atemerev : como equipe de desenvolvimento, temos a necessidade de nos conectar a outras máquinas provisionadas quase que semanalmente .

isso resolveu meu problema: compartilhamento de máquina 💻 🐇

Posso confirmar que este pacote npm funciona.

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