Estou tentando conectar-me a um daemon habilitado para TLS sem TLS?

221

Estou tentando aprender sobre o Docker , mas continuo recebendo mensagens de erro enigmáticas (para mim).

Possivelmente, o exemplo mais simples disso é tentar imprimir a versão do Docker que instalei:

$ sudo docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.16/version:
    dial unix /var/run/docker.sock: no such file or directory.
    Are you trying to connect to a TLS-enabled daemon without TLS?

Acabei de ler o guia do usuário e seguir todas as etapas exatamente, por isso estou surpreso ao receber esta mensagem ... O que devo fazer agora?

Acabei de perceber que, se eu não usar sudo, não recebo o erro:

$ docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

Claro, isso não é uma solução, pois talvez eu precise usar em sudoalgum lugar no caminho ...

Acabei de encontrar outra página dizendo " Se você estiver usando o OS X , não deverá usar sudo". Não sei se eles significam apenas para esse exemplo ou em geral.

Shawn
fonte
38
Pergunta estúpida, mas você iniciou o daemon do docker?
precisa
Eu tenho seguido o guia do usuário, então sim, acredito que o daemon do docker foi iniciado. Como posso verificar novamente?
Shawn
5
Na verdade, você encontrou a solução. Com o boot2docker, você nunca precisará do sudo com o linux, sempre precisará do sudo. Isso ocorre porque o boot2docker realmente executa esses comandos em uma caixa virtual configurada para acessar o daemon corretamente.
Usman Ismail
1
Eu estava lutando com esta questão e funcionando sem sudo funcionou para mim
sak
6
Quase todas as respostas são específicas do OS X (elas mencionam boot2docker), embora o OS X não seja mencionado explicitamente na pergunta ou nas tags. Se alguém estiver interessado em resposta genérica, consulte a minha resposta.
Piotr Dobrogost

Respostas:

150

Para mim, a execução $(boot2docker shellinit 2> /dev/null)corrigiu o problema.

Isso executa a saída do boot2docker shellinitcomando (as três set -x ...linhas) na sua sessão de terminal atual, o que permite que o dockercomando saiba onde encontrar a máquina virtual boot2docker.

Adicionar $(boot2docker shellinit 2> /dev/null)ao final do ~/.bash_profilearquivo garantirá que o dockercomando esteja configurado toda vez que você abrir o terminal.


Para as pessoas que usam shell peixe: boot2docker shellinit ^ /dev/null | source.


Observe que 2> /dev/null(e o equivalente em peixe ^ /dev/null) são opcionais. Como o @ pablo-fernandez sugeriu, isso oculta as Writing ..linhas.

mauvm
fonte
Eu já tinha feito isso, mas vou adicioná-lo ao .bash_profile, boa ideia #
Shawn
definitivamente ajuda com boot2docker 1.5, mas mais velho boot2docker 1.2 não fazê-lo corretamente
Max Markov
1
Eu adicionei um redirecionamento stderr de modo a "Escrita ..." declarações não aparecer: $ (boot2docker shellinit 2> / dev / null)
Pablo Fernandez
3
Obrigado a mencionar a casca de peixe! Resolvido o problema para mim.
precisa saber é o seguinte
1
Como mencionado na resposta de Salvador Dali abaixo, certifique-se de executar também boot2docker startantes de executar o shell init.
21715 Kevin
78

Eu estava recebendo o mesmo erro no MacOS com o sudo e sem ele.

Eu o resolvi com:

boot2docker start
$(boot2docker shellinit)

PS: Obrigado ao Alan. Eu descobri que essa abordagem é recomendada na documentação oficial .

PS2: Às vezes boot2docker initpode ser necessário antes de executar dois comandos (obrigado Aaron).

Salvador Dalí
fonte
Isso funcionou, mas eu não entendo o porquê? o que o $ (boot2docker shellinit) está fazendo?
Emile
Isso funcionou no Mac OS X, mas eu tenho a mesma pergunta que Emile, ou seja, por que isso funcionou?
Nissan
Isso não funcionou para mim no Mac OSX 10.10.4 com o Docker Tools.
b01
Eu não apenas tinha que executar o boot2docker shellinit, mas também copiar e executar cada um dos comandos exibidos. Documentação oficial pelo link diz que este comando somente exibe exigido conjunto de comandos
Vitaliy Lebedev
Trabalhou para mim também em uma máquina Windows.
Noushad 24/09/2015
55

No meu caso (Linux Mint 17), fiz várias coisas e não tenho certeza sobre quais delas são totalmente necessárias.

Incluí pacotes ausentes do Ubuntu:

$ sudo apt-get install apparmor lxc cgroup-lite

Um usuário foi adicionado ao grupo docker:

$ sudo usermod -aG docker ${USER}

Daemon iniciado (o openSUSE só precisa disso)

$ sudo docker -d

Obrigado \ Atribuição


Obrigado Usman Ismail , porque talvez tenha sido apenas a última coisa ...

Pergunta estúpida, mas você iniciou o daemon do docker? O que você precisa saber é o seguinte:


Agradeço também ao github @ MichaelJCole pela solução que funcionou para mim, porque não verifiquei o daemon quando li o comentário de Usman.

Comentário do GitHub :

sudo apt-get install apparmor lxc cgroup-lite
sudo apt-get  install docker.io
# If you installed docker.io first, you'll have to start it manually
sudo docker -d
sudo docker run -i -t ubuntu /bin/bash

Obrigado ao fredjean.net post por observar os pacotes ausentes e esquecer as instruções de instalação padrão do Ubuntu e o google sobre outras maneiras

Acontece que os pacotes cgroup-lite e lxc não são instalados por padrão no Linux Mint. A instalação dos dois me permitiu executar o bash na imagem base e, em seguida, criar e executar a minha imagem.


Obrigado ao comentário de brettof86 sobre openSUSE

ElMesa
fonte
2
Obrigado! No meu caso (Casa da Moeda 17.1), estava o aparelho que estava faltando.
Alexandre L Telles
2
Adicionar-me ao grupo estivador fez a coisa por mim sudo adduser $USER docker,. Truque para fazê-lo em vigor no shell atual foi curgroup=$(id -gn) && newgrp docker && newgrp $curgroup, adaptado de superuser.com/questions/272061/...
Tero Tilus
1
Eu acho que o fato de isso ter uma pontuação muito menor é porque mais pessoas estão usando o OS X do que o Linux? Estou usando o Ubuntu 14.04 e funciona para mim.
icedwater
1
openSUSE e eu só precisava para iniciar o daemon
blockloop
Desculpe minha ignorância sobre a docker-machine, mas não sei. Mas se você descobrir, aponte aqui nos comentários ou na edição da resposta. : D
ElMesa
49

O problema sublinhado é simples - falta de permissão para /var/run/docker.sock soquete de domínio unix.

No capítulo da opção de soquete do Daemon da referência da Linha de Comando do Docker para o Docker 1.6.0:

Por padrão, um soquete de domínio unix (ou soquete IPC) é criado em /var/run/docker.sock, exigindo permissão root ou associação ao grupo de janelas de encaixe .

As etapas necessárias para conceder direitos aos usuários são bem descritas nas instruções de instalação do Docker para o Fedora :

Concedendo direitos aos usuários para usar o Docker

A ferramenta de linha de comando do docker entra em contato com o processo do daemon do docker por meio de um arquivo de soquete /var/run/docker.sockpertencente a root:root. Embora seja recomendável usar o sudo para comandos do docker, se os usuários desejarem evitá-lo, um administrador poderá criar um grupo do docker, possuir o seu /var/run/docker.socke adicionar usuários a esse grupo.

$ sudo groupadd docker
$ sudo chown root:docker /var/run/docker.sock
$ sudo usermod -a -G docker $USERNAME

Saia e faça login novamente para que as alterações acima entrem em vigor. Observe que os pacotes Docker de algumas distribuições Linux (Ubuntu) já estão /var/run/docker.sockno dockergrupo, tornando desnecessárias as duas primeiras etapas acima.

No caso do OS X e boot2dockera situação é diferente; o daemon do Docker é executado dentro de uma VM, portanto a DOCKER_HOSTvariável de ambiente deve ser configurada para essa VM para que o cliente do Docker possa encontrar o daemon do Docker. Isso é feito executando $(boot2docker shellinit)no shell.

Piotr Dobrogost
fonte
1
Hmm, minha situação é semelhante, mas sutilmente diferente. Estou executando no Ubuntu 14.04. Docker aparentemente instalado corretamente (digitar apenas "docker" exibe a lista de comandos). Criei um grupo de janelas de encaixe e tornei meu usuário um membro. Este é apenas um sistema doméstico e estou apenas brincando com o docker. No entanto, qualquer coisa que não seja apenas "docker" traz o erro. Eu acredito nisso porque o docker não pode criar /var/run/docker.sock. No meu sistema / var / run existe um link simbólico para / run que é root: root e 755 perm, para que o docker não possa escrever lá. Não tenho certeza qual seria minha solução para isso.
Steve Cohen
Piotr, essa explicação é muito útil. Você pode explicar por que "$ (boot2docker shellinit)" funciona, mas "boot2docker shellinit" simples não funciona? Eu entendo que os parênteses implicam a execução em um subshell, mas eu não tenho sido capaz de decifrar por que isso é necessário para tornar o trabalho janela de encaixe corretamente quando nenhum dos outros comandos exigem que ....
Alex Edelstein
@AlexEdelstein A diferença entre boot2docker shellinite outros comandos é que esse comando não faz nenhuma alteração em si, mas gera apenas (imprime) comandos que você precisa executar sozinho. Você pode executar boot2docker shellinitprimeiro e, em seguida, copiar e executar manualmente cada comando a partir de sua saída. É mais fácil executar todos os comandos executando boot2docker shellinitem um subprocesso (com $()sintaxe), pois dessa forma cada linha de saída está sendo executada automaticamente como um comando shell. Consulte docs.docker.com/installation/mac/#from-your-command-line onde isso é mostrado em detalhes.
Piotr Dobrogost
@SteveCohen Convém verificar se o serviço docker está em execução sudo service docker status. No meu Ubuntu 14.04, ele não estava executando após a instalação, o que causou o erro.
razz0
1
Obrigado por vincular a documentação real para a causa raiz, resolvi o meu problema
RonaldFindling
23

Verifique se o daemon do Docker está em execução:

service docker start

Isso consertou para mim!

superlógico
fonte
sudo service docker startpara mim
Milimetric
systemctl enable docker.servicee systemctl start docker.service para usuários de Linux system.d (Arch no meu caso)
PRDeving
sudo service docker restartpara mim
Frozen Flame
15
  1. O Docker chama a si mesmo de tempo de execução auto-suficiente para contêineres Linux. Em termos simples, atua como servidor e cliente.
  2. o $ docker version consulta de comando é interna ao executável do Docker e não ao daemon / serviço em execução.
  3. $ docker images or $ docker ps or $ docker pull centos são comandos que enviam consultas ao daemon / serviço docker em execução.
  4. Por padrão, o Docker suporta conexões TLS com seu daemon / serviço.
  5. Somente se o usuário que você efetuou login faz parte do grupo de usuários dockerou se utilizou sudoantes do comando, por exemplo $ sudo docker images, ele não requer conectividade TLS.

Visite a página de documentação do Docker Proteger o soquete do daemon do Docker .

Role um pouco até o topo e procure warning sectionpor clareza.

Yogesh Kamat
fonte
1
As respostas populares até agora só se aplicam ao OS X, enquanto essa é muito mais geral, explica a causa e me permitiu resolvê-la no GNU / Linux.
26415 Sinisterstuf #
1
@laffuste, seu comando limpará os grupos adicionais do usuário. por causa do "-a" ausente
Pawel Barcik 20/03/2015
3
@PawelBarcik erro terrível, obrigado:sudo usermod -a -G docker {username}
laffuste
1
Como essa resposta responde à pergunta? Qual o motivo do erro? Como corrigi-lo? (Como não estou no OS X, as respostas existentes não se aplicam).
Piotr Dobrogost
13

Você precisará fazer:

$boot2docker init
$boot2docker start

As seguintes configurações corrigiram o problema:

$export DOCKER_HOST=tcp://192.168.59.103:2376
$export DOCKER_CERT_PATH=/Users/{profileName}/.boot2docker/certs/boot2docker-vm
$export DOCKER_TLS_VERIFY=1
AL-Tamimi
fonte
1
Este comando também pode ser usado para definir as variáveis ​​de ambiente (em vez de fazê-lo manualmente):eval "$(boot2docker shellinit)"
Executa
11

É possível que você ainda não tenha permissão para o arquivo. Aconteceu comigo depois que me adicionei ao dockergrupo usando

sudo gpasswd -a user docker

mas ainda não saiu.

Para resolver isso, você pode fazer login novamente ou usar sg docker "docker <subcommand> ..."antes de sair.

Se você estiver em grupo docker em /etc/group, você deve ser capaz de executá-lo sem senha digitação.

https://dingyichen.wordpress.com/2015/02/05/docker-dial-unix-varrundocker-sock-no-such-file-or-directory-are-you-trying-to-connect-to-a- tls-enabled-daemon-without-tls /

Ding-Yi Chen
fonte
7

No Ubuntu após a instalação do lxc-docker, você precisa adicionar seu usuário ao grupo de usuários do docker :

sudo usermod -a -G docker myusername

Isso ocorre devido às permissões do arquivo de soquete:

srw-rw---- 1 root docker 0 Mar 20 07:43 /var/run/docker.sock

NÃO EXECUTE usermod SEM "-a", como sugerido em um dos outros comentários, ou isso limpará a configuração de grupos adicionais e deixará o grupo "docker"

Isto é o que vai acontecer:

➜  ~  id pawel
uid=1000(pawel) gid=1000(pawel) groups=1000(pawel),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare),998(docker)
➜  ~  usermod -G docker pawel
➜  ~  id pawel               
uid=1000(pawel) gid=1000(pawel) groups=1000(pawel),998(docker)
Pawel Barcik
fonte
6

TLDR : Isso fez com que meu grupo de reuniões do Python resolvesse esse problema quando eu estava executando uma clínica na instalação do docker e a maioria dos usuários estava no OS X:

boot2docker init
boot2docker up

execute os exportcomandos que a saída fornecer, em seguida

docker info

deve dizer que funciona.


O Contexto (o que nos levou ao problema)

Liderei uma clínica na instalação do docker e a maioria dos participantes tinha o OS X, e encontramos esse problema e o superei em várias máquinas. Aqui estão as etapas que seguimos:

Primeiro, instalamos o homebrew (sim, alguns participantes não o possuíam):

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Em seguida, obtivemos o cask, que usamos para instalar o virtualbox e, em seguida, o brew para instalar o docker e o boot2docker (todos necessários para o OS X). Não use o sudo para o brew. :

brew install caskroom/cask/brew-cask
brew cask install virtualbox
brew install docker
brew install boot2docker

A solução

Foi quando encontramos o problema que o solicitante aqui teve. O seguinte corrigiu. Entendo que initera um contrato único, mas você provavelmente precisará executar upsempre que iniciar o Docker:

boot2docker init
boot2docker up

Então, quando upexecutado, ele fornece váriosexport comandos. Copie e cole e execute-os.

Finalmente docker info , você deve dizer que está instalado corretamente.

Para demonstração

O restante dos comandos deve demonstrá-lo. (no Ubuntu linux eu exigi o sudo.)

docker run hello-world
docker run -it ubuntu bash

Então você deve estar em um shell raiz no contêiner:

apt-get install nano
exit

Voltar para o bash de usuário nativo:

docker ps -l

Procure o identificador hexadecimal de cerca de 12 dígitos (0-9 ou af) em "ID do contêiner", por exemplo 456789abcdef. Você pode confirmar sua alteração e nomeá-la com um nome descritivo, como descriptivename:

docker commit 456789abcdef descriptivename`
Aaron Hall
fonte
5

Tudo o que você precisa para executar o Docker no Linux Ubuntu / Mint:

sudo apt-get -y install lxc
sudo gpasswd -a ${USER} docker
newgrp docker
sudo service docker restart

Opcionalmente, pode ser necessário instalar duas dependências adicionais se o acima não funcionar:

sudo apt-get -y install apparmor cgroup-lite
sudo service docker restart
tomrozb
fonte
1
Eu me dou +1 se fosse possível - eu estava procurando uma solução e encontrei a minha própria solução, que eu esqueci :)
tomrozb
Isso me ajudou. Percebi que o serviço docker não estava em execução após a instalação, por isso sudo service docker startresolvi o problema no meu Ubuntu 14.04.
razz0
3

Tentei as soluções aqui e o boot2docker não funcionou.

Minha solução: Desinstale o boot2docker no Mac, instale uma VM do Centos 7 no VirtualBox e trabalhe com o Docker dentro dessa VM.

MondKin
fonte
3

Para mim, os seguintes passos funcionaram:

  1. Percebi que a execução docker run hello-worldfalha com esse erro como a pergunta, mas a execução sudo docker run hello-worldfuncionou.
  2. Eu adicionei meu usuário atual ao dockergrupo sudo adduser user docker,. Então você deve reiniciar sua máquina ou usar su - user(verifique usando o groupscomando se estiver no dockergrupo).

Depois disso, hello-worldcomeçou a trabalhar.

Minha resposta é baseada em Como posso usar o docker sem o sudo? o que explica o que deu errado.


csharpfolk
fonte
Após adicionar self ao grupo, faça o `newgrp docker; newgrp primary-group isso cria um subshell, com o novo grupo primário de janela de encaixe e, em seguida, restabelece o grupo primário correto. (Um pouco de hack).
Ctrl-alt-delor
2

Pelo que vale a pena, tentei todas as soluções nesta questão e nesta questão relacionada e nenhuma resolveu meu problema até desinstalar e reinstalar o VirtualBox . Esse processo atualizou o VirtualBox da versão 4.2.16 para 4.3.22 (o meu anterior estava sem uso no sistema há alguns meses).

Então boot2dockere dockertrabalhou sem outros ajustes.

daedalus
fonte
2

Eu tive o mesmo problema. Um simples service docker restartresolveu o problema.

ChaitanyaBhatt
fonte
2

O daemon do Docker se liga a um soquete Unix em vez de uma porta TCP. Por padrão, o soquete Unix pertence à raiz do usuário e outros usuários podem acessá-lo apenas usando o sudo. O daemon do Docker sempre é executado como usuário root.

sudo groupadd docker
sudo usermod -aG docker $USER

Efetue logout e logon novamente, para que sua participação no grupo seja reavaliada.

docker run hello-world

Origem: gerenciar o Docker como um usuário não raiz

Shabbir Bata
fonte
1

Eu tive o mesmo problema e tentei várias coisas para corrigir isso, alterando o arquivo .bash_profile, entrando e saindo, sem qualquer sorte. No final, reiniciar minha máquina corrigiu.

DavB
fonte
0

Verifique se há

127.0.0.1    localhost

na tua

`/etc/hosts `

Arquivo.

bolerovt
fonte
0

Eu enfrentei o mesmo problema ao criar imagens do Docker a partir de Jenkins. Basta adicionar o usuário ao dockergrupo e reiniciar os serviços do Docker e, no meu caso, tive que reiniciar os serviços do Jenkins.

Este foi o erro que recebi:

http:///var/run/docker.sock/v1.19/build?cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&memory=0&memswap=0&rm=1&t=59aec062a8dd8b579ee1b61b299e1d9d340a1340: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
FATAL: Failed to build docker image from project Dockerfile
java.lang.RuntimeException: Failed to build docker image from project Dockerfile

Solution:

[root@Jenkins ssh]# groupadd docker
[root@Jenkins ssh]# gpasswd -a jenkins docker
Adding user jenkins to group docker
[root@Jenkins ssh]# /etc/init.d/docker restart
Stopping docker:                                           [  OK  ]
Starting docker:                                           [  OK  ]
[root@Jenkins ssh]# /etc/init.d/jenkins restart
Shutting down Jenkins                                      [  OK  ]
Starting Jenkins                                           [  OK  ]
[root@Jenkins ssh]#
Avinash Singh
fonte
-1

Outro motivo possível é que a visualização da CPU do BIOS não está ativada. Vá e ative-o primeiro!

Xianlin
fonte