Como expor a API do docker sobre TCP?

13

Estou usando o porttainer e não consigo gerenciar pontos de extremidade remotos. Tentei usar a linha de comando para conectar-se aos nós do docker remoto, mas recebi uma mensagem Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Sim, eles estão correndo. Eu me adicionei ao grupo de janelas de encaixe e posso acessar a janela de encaixe por SSHing nos nós. No entanto, não consigo acessar nenhum nó do docker remotamente.

Modifiquei /etc/defaultpara adicionar / descomentarDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Eu também modifiquei /etc/init.d/dockere /etc/init/docker.confincluí DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Reiniciei o serviço docker, desconectado e conectado várias vezes no processo, mas ainda não consigo me conectar ao nó remoto. Não consigo nem me conectar ao nó local passando o IP.

O que eu perdi? Qual configuração em qual arquivo expõe a API sobre TCP?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://127.0.0.1:2375 info
Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

Edit: Running ps aux | grep -i dockerretorna isso -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://
root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
Lorde Loh.
fonte
2375 está ouvindo? ss -ntl
Jscott #
Não. Não há nada ouvindo no 2375. E não consigo descobrir qual configuração em qual arquivo afeta isso. Eu incluí a saída de ps auxna minha resposta, se isso ajudar.
Senhor Loh.
Tentei coisas semelhantes e suspeito que os arquivos / etc / default / docker, /etc/init/docker.conf e /etc/init.d/docker são simplesmente ignorados no Ubuntu 16.04 com uma instalação do docker-ce, alguém pode confirmar ? Acho que, quando executo o "status do docker de serviço", o que realmente acontece é o "systemctl status docker", um outro sistema de gerenciamento.
Chrisinmtown 7/07

Respostas:

21

Encontrei uma solução graças ao post de Ivan Krizsan .

Eu tive que editar /lib/systemd/system/docker.serviceno meu sistema Ubuntu 16.04.2 LTS para modificar a linha

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

então

sudo systemctl daemon-reload
sudo systemctl restart docker.service

e tudo funcionou :-). A próxima etapa é descobrir como proteger o formulário do daemon do docker que está sendo invadido.

Lorde Loh.
fonte
1
Confirmo que essa alteração faz com que o Dockerd escute solicitações HTTP no Ubuntu 16.04 com o docker-ce ver 17.06. Parece errado modificar o script de serviço diretamente.
Chrisinmtown 7/07
7
Nunca edite o script de serviço do docker (ou qualquer script de serviço) diretamente. O SystemD possui um recurso de edição diferencial embutido. Use systemctl edit docker.servicee systemctl criarão um novo arquivo com suas edições. Isso impede que uma atualização limpe suas alterações. O SystemD mesclará os dois arquivos em tempo de execução. Bom documento aqui: digitalocean.com/community/tutorials/…
Routhinator 20/17
Obrigado! Isso é muito útil. Continuo recebendo avisos durante as atualizações. Vou analisar isso: _)
Lorde Loh.
4
No Ubuntu Server 18.04, funcionava assim:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA
Quando eu uso o -H tcp://cenário por si só, sem a -H fd://definição, eu não posso emitir e comandos do cliente, por exemplo .., info janela de encaixe, versão janela de encaixe, etc.
Chris F
2

O diretório / etc / default é onde os mantenedores da distribuição colocam seus arquivos de configuração. Se você instalar o docker diretamente dos repositórios do Docker, esse diretório não será usado.

O diretório / lib / systemd é onde os pacotes instalam seus arquivos systemd e sobrescrevem todas as alterações na atualização. Se você usar isso, suas alterações serão perdidas.

Para fazer suas próprias alterações em um arquivo de unidade systemd que persista, você pode criar um arquivo de unidade em /etc/systemd/system/docker.service.d/, por exemplo, aqui está o meu /etc/systemd/system/docker.service padrão. d / override.conf:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

Essa substituição simplesmente desativa todos os sinalizadores de linha de comando para o daemon dockerd do systemd. Uma vez feito, você pode substituir todas as configurações do /etc/docker/daemon.json que são usadas pelo docker e, dependendo da configuração, podem ser recarregadas sem reiniciar o daemon. Por exemplo, aqui está um exemplo /etc/docker/daemon.json:

{
"debug": false,
"experimental": true,
"hosts": ["fd://", "tcp://0.0.0.0:2376"],
"labels": ["foo=bar", "fez=baz"],
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/host-cert.pem",
"tlskey": "/etc/docker/certs/host-key.pem",
"tlsverify": true
}

Para seus propósitos, você só precisa da linha existente para definir os hosts.

Uma parte extremamente importante do arquivo de configuração acima são as configurações de TLS. Se você não configurar o TLS mútuo entre cliente e servidor e abrir o docker para escutar na rede, estará executando o equivalente a um servidor de telnet aberto com logins raiz permitidos sem senha. Se você preferir ssh sobre telnet, ou se preferir ter uma senha para sua conta root, deverá configurar o TLS.As portas da API do docker são frequentemente verificadas na Internet e você encontrará malware instalado em seu host em pouco tempo, se pular esta etapa de configuração.

Detalhes completos sobre como configurar as chaves TLS para cliente e servidor podem ser encontrados em: https://docs.docker.com/engine/security/https/

BMitch
fonte
1
Uma resposta muito boa que sobreviverá a futuras atualizações no serviço docker. Este é o caminho certo para fazê-lo.
Fopedush
2

Se você não deseja reconfigurar e reiniciar o daemon do docker, pode simplesmente conectar o soquete unix a um soquete TCP usando ncat(do nmappacote):

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

Como alternativa, você pode usar o socat ou outras ferramentas .

eadmaster
fonte
surpreendente! posso redundar esse comando em segundo plano? quando eu fechar a minha conexão de terminal está perdido
Felix
ah eu encontrei nohupe&
Felix
0

Há uma documentação oficial que descreve como configurar onde o daemon do Docker escuta conexões .

systemd vs daemon.json

Configurar o Docker para escutar conexões usando o arquivo de unidade systemd e o arquivo daemon.json causa um conflito que impede a inicialização do Docker.

Configurando o acesso remoto com o arquivo de unidade systemd

  1. Use o comando sudo systemctl edit docker.service para abrir um arquivo de substituição para docker.service em um editor de texto.

  2. Adicione ou modifique as seguintes linhas, substituindo seus próprios valores.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Salve o arquivo.

  4. Recarregue a configuração systemctl.

    $ sudo systemctl daemon-reload
    
  5. Reinicie o Docker.

    $ sudo systemctl restart docker.service
    
  6. Verifique se a alteração foi respeitada revisando a saída do netstat para confirmar se o dockerd está escutando na porta configurada.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Configurando o acesso remoto com daemon.json

  1. Defina a matriz de hosts no /etc/docker/daemon.json para conectar-se ao soquete UNIX e a um endereço IP, da seguinte maneira:

    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
    

    Configurar o Docker para escutar conexões usando o arquivo de unidade systemd e o arquivo daemon.json causa um conflito que impede a inicialização do Docker.

    1. Adicione ou modifique as seguintes linhas, substituindo seus próprios valores.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Salve o arquivo.

    3. Recarregue a configuração systemctl.

      $ sudo systemctl daemon-reload
      
  2. Reinicie o Docker.

  3. Verifique se a alteração foi respeitada revisando a saída do netstat para confirmar se o dockerd está escutando na porta configurada.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

O cliente do Docker respeitará a DOCKER_HOSTvariável de ambiente para definir o -Hsinalizador para o cliente. Use um dos seguintes comandos:

$ docker -H tcp://127.0.0.1:2375 ps

ou

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
ROY
fonte