我是否要连接到没有TLS的启用TLS的守护程序?


221

我正在尝试了解Docker,但我不断收到(对我而言)错误的错误消息。

可能最简单的示例是尝试打印我安装的Docker版本:

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

我刚刚阅读了用户指南,并严格按照每个步骤进行操作,所以我很惊讶收到此消息...我现在该怎么办?

我只是注意到,如果我不使用,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
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

当然,这不是解决方案,因为我可能需要在sudo将来的某个地方使用...

我刚刚找到另一个页面,上面写着“ 如果您使用的是OS X,则不应使用” sudo。我不知道它们是否仅表示该示例,或者一般而言。


38
愚蠢的问题,但您启动了docker守护程序吗?
Usman Ismail

我一直在遵循用户指南,所以是的,我相信docker守护进程已启动。我该如何仔细检查?
肖恩2014年

5
实际上,您找到了解决方案。使用boot2docker时,您将永远不需要sudo;而对于Linux,您将永远需要sudo。这是因为boot2docker实际上在虚拟框中运行了这些命令,该虚拟框中已设置为正确访问守护程序。
Usman Ismail 2014年

1
我一直在努力解决这个问题,并且在没有sudo的情况下运行对我来说很有用
sak 2014年

6
几乎所有的答案是OS X的具体(他们提到boot2docker)虽然OS X是不是在问题或标签中明确提到。如果有人对通用答案感兴趣,请参阅我的答案。
Piotr Dobrogost

Answers:


150

对我来说,跑步$(boot2docker shellinit 2> /dev/null)解决了问题。

这将在当前终端会话中运行boot2docker shellinit命令(set -x ...三行)的输出,从而使docker命令知道在哪里可以找到boot2docker虚拟机。

每次打开终端时,添加$(boot2docker shellinit 2> /dev/null)~/.bash_profile文件底部将确保docker已配置命令。


对于使用鱼壳的人:boot2docker shellinit ^ /dev/null | source


请注意2> /dev/null(和Fish等效^ /dev/null)是可选的。就像@ pablo-fernandez建议的那样,这隐藏了这些Writing ..行。


我已经这样做了,但是我将其添加到.bash_profile中,好主意
Shawn 2014年

绝对对boot2docker 1.5有所帮助,但是较旧的一个boot2docker 1.2不能正确执行
Max Markov

1
我添加了stderr重定向,因此不会出现“ Writing ...”语句:$(boot2docker shellinit 2> / dev / null)
Pablo Fernandez

3
谢谢提鱼壳!为我解决了这个问题。
cyrillk 2015年

1
如下面萨尔瓦多·达利(Salvador Dali)的回答中所述,请确保boot2docker start在运行shell初始化之前也要运行。
凯文

78

我在使用sudo和不使用sudo的MacOS上遇到了相同的错误。

我已经解决了:

boot2docker start
$(boot2docker shellinit)

PS:感谢艾伦。我发现在他们的官方文档中建议使用此方法。

PS2:有时boot2docker init可能需要先运行两个命令(谢谢Aaron)。


这是可行的,但我不明白为什么?$ {boot2docker shellinit)在做什么?
Emile 2015年

这在Mac OS X中有效,但是我和Emile有相同的问题,即为什么这样做有效?
日产

在使用Docker Tools的Mac OSX 10.10.4上,这对我不起作用。
2015年

我不仅要运行boot2docker shellinit,还必须复制并运行它显示的每个命令。链接的官方文档说,此命令仅显示必需的命令集
Vitaliy Lebedev

在Windows机器上也为我工作。
Noushad

55

就我而言(Linux Mint 17),我做了各种各样的事情,但我不确定其中哪一项是完全必要的。

我包括缺少的Ubuntu软件包:

$ sudo apt-get install apparmor lxc cgroup-lite

用户已添加到组docker

$ sudo usermod -aG docker ${USER}

启动守护程序(openSUSE仅需要此)

$ sudo docker -d

谢谢\署名


感谢Usman Ismail,因为也许这只是最后一件事...

愚蠢的问题,但您是否启动了docker守护进程?– Usman Ismail 2014年12月17日15:04


也感谢github @ MichaelJCole为我工作的解决方案,因为当我阅读Usman的评论时我没有检查守护进程。

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

感谢fredjean.net贴士注意到缺少的软件包,而忘记了默认的Ubuntu安装说明,而google则了解了其他方法

事实证明,Linux Mint上默认未安装cgroup-lite和lxc软件包。安装两者之后,我就可以在基本映像中运行bash,然后构建并运行我的映像。


感谢brettof86对openSUSE的评论


2
谢谢!在我的情况下(薄荷17.1),缺少了保镖。
亚历山大·泰勒斯

2
将自己添加到docker组中对我来说是成功的sudo adduser $USER docker。诀窍,使其采用当前的壳效应curgroup=$(id -gn) && newgrp docker && newgrp $curgroup,改编自superuser.com/questions/272061/...
泰罗Tilus

1
我猜这个分数要低得多是因为使用OS X的人多于Linux?我正在使用Ubuntu 14.04,它对我有用。
icedwater

1
openSUSE,我只需要启动守护进程
blockloop

请原谅我对docker-machine的无知,但我不知道。但是,如果您发现问题,请在评论中指出或编辑答案。:D
ElMesa 2015年

49

强调的问题很简单–缺乏对/var/run/docker.sockUnix域套接字的许可。

从适用于Docker 1.6.0 的Docker命令行参考的Daemon套接字选项 一章中:

默认情况下,在处创建unix域套接字(或IPC套接字) /var/run/docker.sock需要root许可或Docker组成员身份

Fedora的 Docker 安装说明中很好地描述了授予用户权限的必要步骤:

授予用户使用Docker的权利

泊坞窗命令行工具的联系人通过套接字文件泊坞窗守护进程 /var/run/docker.sock所拥有root:root。尽管建议将sudo用于docker命令,但如果用户希望避免使用sudo,则管理员可以创建docker组,拥有docker组 /var/run/docker.sock并将其添加到该组。

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

注销并重新登录,以使上述更改生效。请注意,某些Linux发行版(Ubuntu)的Docker软件包已经放置/var/run/docker.sock在该docker组中,因此上述步骤的前两个步骤是不必要的。

如果是OS X,boot2docker情况则有所不同;Docker守护程序在VM内运行,因此DOCKER_HOST必须将环境变量设置为此VM,以便Docker客户端可以找到Docker守护程序。这是通过$(boot2docker shellinit)在shell中运行来完成的。


1
嗯,我的情况是相似的,但是有细微的不同。我在Ubuntu 14.04上运行。Docker看似安装正确(仅输入“ docker”会弹出命令列表)。我创建了一个码头工人组,并让我的用户成为它的成员。这只是一个家庭系统,我只是在玩docker。但是,除了“ docker”以外,其他任何东西都会引发错误。我相信是因为docker无法创建/var/run/docker.sock。在我的系统上/ var / run是/ run的符号链接,它是root:root和755 perm,因此docker无法在其中写入。不知道我的解决方案是什么。
史蒂夫·科恩

皮奥特,这个解释很有用。您能否详细说明为什么“ $(boot2docker shellinit)”有效,而普通的“ boot2docker shellinit”却无效?我知道括号表示要在子shell中执行,但是我无法弄清楚为什么在其他命令都不需要docker时才能使docker正常工作是必要的..
Alex Edelstein 2015年

@AlexEdelstein boot2docker shellinit与其他命令的区别在于,该命令本身不会进行任何更改,而只会生成(打印)您必须自己运行的命令。您可以boot2docker shellinit先运行,然后手动从其输出中复制并运行每个命令。通过boot2docker shellinit在子进程中运行所有命令(使用$()语法)会更容易,因为这样一来,输出的每一行都将自动作为shell命令运行。请参阅docs.docker.com/installation/mac/#from-your-command-line,其中详细显示了此内容。
Piotr Dobrogost,2015年

@SteveCohen您可能要检查docker服务是否正在运行sudo service docker status。在我的Ubuntu 14.04上,安装后未运行,这导致了错误。
razz0

1
感谢您将实际文档链接为根本原因,从而解决了我的问题
RonaldFindling

23

确保Docker守护程序正在运行:

service docker start

这为我解决了!


sudo service docker start对我来说
Milimetric 2015年

systemctl enable docker.servicesystemctl start docker.service 对于system.d linux用户(以我
为例

sudo service docker restart对我来说
Frozen Flame Flame

15
  1. Docker称自己为Linux容器的自足运行时。简单来说,它既充当服务器又充当客户端。
  2. $ docker version命令查询在Docker可执行文件内部,而不在运行的守护程序/服务内部。
  3. $ docker images or $ docker ps or $ docker pull centos 是将查询发送到正在运行的Docker守护程序/服务的命令。
  4. Docker默认情况下支持与其守护进程/服务的TLS连接。
  5. 仅当您以用户组身份登录的用户docker或您sudo在命令之前使用过(例如)时$ sudo docker images,才不需要TLS连接。

访问Docker文档页面保护Docker守护进程套接字

稍微滚动到顶部,warning section以保持清晰度。


1
到目前为止,流行的答案仅适用于OS X,而这一答案更为笼统,解释了原因,并让我在GNU / Linux上解决了它。
sinisterstuf

1
@laffuste您的命令将擦除用户的其他组。由于缺少“ -a”
Pawel Barcik,2015年

3
@PawelBarcik一个可怕的错误,谢谢:sudo usermod -a -G docker {username}
laffuste

1
这个答案如何回答问题?错误的原因是什么?如何解决?(我不在OS X上,因此现有答案不适用)。
Piotr Dobrogost

13

您将需要执行以下操作:

$boot2docker init
$boot2docker start

以下设置解决了该问题:

$export DOCKER_HOST=tcp://192.168.59.103:2376
$export DOCKER_CERT_PATH=/Users/{profileName}/.boot2docker/certs/boot2docker-vm
$export DOCKER_TLS_VERIFY=1

1
该命令还可以用来设置环境变量(而不是做手工):eval "$(boot2docker shellinit)"
鲍尔斯

11

您可能还没有该文件的权限。我将自己加入docker群组使用后发生了事

sudo gpasswd -a user docker

但尚未注销。

要解决此问题,您可以重新登录,也可以sg docker "docker <subcommand> ..."在注销前使用 。

如果你是在组docker/etc/group,你应该能够无需键入密码运行它。

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 /


7

在安装lxc-docker之后的Ubuntu上,您需要将用户添加到docker用户组:

sudo usermod -a -G docker myusername

这是因为套接字文件的权限:

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

请勿在其他注释之一中建议在没有“ -a”的情况下运行usermod,否则它将擦除您的其他组设置,而只会离开“ docker”组

这将发生:

➜  ~  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)

6

TLDR:当我在安装docker时运行诊所时,这使我的Python metup摆脱了这个问题,并且大多数用户都在OS X上:

boot2docker init
boot2docker up

运行export输出给您的命令,然后

docker info

应该告诉你它的工作原理。


上下文(使我们陷入困境的原因)

我领导了一个安装docker的诊所,大多数与会者都安装了OS X,我们遇到了这个问题,我在多台计算机上克服了这个问题。这是我们遵循的步骤:

首先,我们安装了自制软件(是的,有些与会者没有):

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

然后,我们得到了用来安装virtualbox的木桶,然后使用brew安装docker和boot2docker(对于OS X都是必需的)。不要将sudo用于brew。

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

解决方案

那是我们遇到问题的时候了。下面修复了它。我了解这init是一次性交易,但您up每次启动docker时都可能必须运行:

boot2docker init
boot2docker up

然后在up运行后,它会给出几个export命令。复制并运行它们。

最后docker info应该告诉您它已正确安装。

演示

其余命令应进行演示。(在Ubuntu Linux上,我需要sudo。)

docker run hello-world
docker run -it ubuntu bash

然后,您应该在容器的根外壳上:

apt-get install nano
exit

回到您的本机用户bash:

docker ps -l

在“容器ID”下查找大约12位十六进制(0-9或af)的标识符,例如456789abcdef。然后,您可以提交更改并将其命名为描述性名称,例如descriptivename

docker commit 456789abcdef descriptivename`

5

在Linux Ubuntu / Mint上运行Docker所需的一切:

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

(可选)如果上述方法不起作用,则可能需要安装两个其他依赖项:

sudo apt-get -y install apparmor cgroup-lite
sudo service docker restart

1
如果可能的话,我会给自己+
1-

这对我有帮助。我意识到安装后docker服务未运行,因此sudo service docker start在Ubuntu 14.04上解决了该问题。
razz0

3

我在这里尝试了解决方案,但boot2docker无法正常工作。

我的解决方案:在Mac上卸载boot2docker,在VirtualBox中安装Centos 7 VM,然后在该VM中使用Docker。


3

对我来说,以下步骤有效:

  1. 我注意到运行docker run hello-world失败,并出现问题,但运行正常sudo docker run hello-world
  2. 我将当前用户添加到了该dockersudo adduser user docker。然后,您必须重新启动计算机或使用su - usergroups如果在docker组中,请使用using 命令)。

之后,hello-world开始工作。

我的答案是基于如何没有sudo的情况下使用docker?这就解释了哪里出了问题。



将self添加到组后,执行`newgrp docker;。newgrp primary-group会创建一个带有新的docker主要组的子外壳,然后重新建立正确的主要组。(有点hack)。
ctrl-alt-delor

2

为了它的价值,我尝试了此问题及相关问题中的所有解决方案,直到卸载并重新安装VirtualBox为止,没有一个解决了我的问题。此过程将VirtualBox从4.2.16版本升级到4.3.22(我以前的版本已经在系统上闲置了几个月)。

然后boot2dockerdocker无需任何其他调整即可工作。



2

Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户root拥有,其他用户只能使用sudo访问它。Docker守护程序始终以root用户身份运行。

sudo groupadd docker
sudo usermod -aG docker $USER

注销并重新登录,以便重新评估您的组成员身份。

docker run hello-world

来源:管理多克尔作为非根用户


1

我遇到了相同的问题,并尝试了各种方法来解决此问题,修改了.bash_profile文件,登录并注销,但没有任何运气。最后,重新启动计算机将其修复。



0

从Jenkins创建Docker映像时,我遇到了同样的问题。只需将用户添加到docker组中,然后重新启动Docker服务,就我而言,我必须重新启动Jenkins服务。

这是我得到的错误:

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]#

-1

另一个可能的原因是您的BIOS CPU可视化未启用。先启用它!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.