我试图学习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。”我不知道他们是指这个例子,还是一般情况。


对我来说,运行$(boot2docker shellinit 2> /dev/null)可以解决这个问题。

这将运行boot2docker shellinit命令的输出(三个set -x…这让docker命令知道在哪里可以找到boot2docker虚拟机。

将$(boot2docker shellinit 2> /dev/null)添加到~/的底部。Bash_profile文件将确保每次打开终端时都配置了docker命令。


对于使用Fish shell的人:boot2docker shellinit ^ /dev/null | source。


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


Docker calls itself a self-sufficient runtime for Linux containers. In simple terms it acts both as server and client. The $ docker version command query is internal to the Docker executable and not to the daemon/service running. $ docker images or $ docker ps or $ docker pull centos are commands which send queries to the docker daemon/service running. Docker by default supports TLS connections to its daemon/service. Only if the user you are logged in as is part of user group docker or you have used sudo before the command, e.g. $ sudo docker images, does it not require TLS connectivity.

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

滚动一点到顶部,找到警告部分的清晰度。


我在MacOS上得到了同样的错误与sudo和没有它。

我已经解决了这个问题:

boot2docker start
$(boot2docker shellinit)

附注:多亏了艾伦。我发现这种方法在他们的官方文件中是推荐的。

P.S.2:有时在运行两个命令之前需要boot2docker init(谢谢Aaron)。


你需要做的是:

$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

您可能还没有访问该文件的权限。 这发生在我把自己添加到dockergroup使用

sudo gpasswd -a user docker

但还没有注销。

要解决这个问题,您可以重新登录或使用 Sg docker "docker <subcommand>…"

如果您在/etc/group中的docker组中,您应该能够在不输入密码的情况下运行它。

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/


无论如何,我尝试了这个问题和这个相关问题中的所有解决方案,但都没有解决我的问题,直到我卸载并重新安装VirtualBox。这个过程将VirtualBox从4.2.16版本升级到4.3.22版本(我之前的版本已经在系统上没用了几个月了)。

然后boot2docker和docker不需要任何其他调整就可以工作了。


我尝试了这里的解决方案,boot2docker不起作用。

我的解决方案:卸载Mac上的boot2docker,在VirtualBox中安装Centos 7虚拟机,并在该虚拟机中使用Docker。


确保有

127.0.0.1    localhost

在你的

`/etc/hosts `

文件。


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

sudo usermod -a -G docker myusername

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

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

不要运行usermod没有“-a”,就像在其他评论中建议的那样,否则它会擦除你的额外组设置,只会离开“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)

TLDR:这让我的Python聚会小组克服了这个问题,当时我正在运行一个关于安装docker的诊所,大多数用户都在OS X上:

boot2docker init
boot2docker up

然后运行输出提供的导出命令

docker info

应该会告诉你它有用。


背景(是什么导致了我们的问题)

我主持了一个关于安装docker的诊所,大多数参与者都使用OS X,我们遇到了这个问题,我在几台机器上克服了这个问题。以下是我们遵循的步骤:

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

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

然后我们得到了cask,我们用它来安装virtualbox,然后用brew来安装docker和boot2docker(都是OS X所需的)。

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

解决方案

这时我们遇到了这位提问者遇到的问题。下面的问题得到了解决。我知道init是一次性的交易,但你可能每次启动docker都要运行:

boot2docker init
boot2docker up

然后,当运行up时,它给出几个导出命令。复制粘贴并运行。

最后,docker信息应该告诉你它已经正确安装。

演示

其余的命令应该演示它。(在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或a-f)标识符,例如456789abcdef。然后你可以提交你的变更,并给它起一个描述性的名字,比如descriptivename:

docker commit 456789abcdef descriptivename`

突出的问题很简单——缺少对/var/run/docker的权限。Sock Unix域套接字。

摘自Docker 1.6.0命令行参考的Daemon socket选项章节:

默认情况下,unix域套接字(或IPC套接字)在 /var/run/docker.Sock,需要root权限或docker 组成员。

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

赋予用户使用Docker的权限 docker命令行工具 通过套接字文件联系docker守护进程 /var/run/docker.root拥有的袜子:root。尽管建议这样做 对于docker命令,如果用户希望避免使用sudo,可以使用sudo 管理员可以创建一个属于自己的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。在docker组中插入代码,使上述前两个步骤变得不必要。

在OS X和boot2docker的情况是不同的;Docker守护进程运行在虚拟机内部,所以DOCKER_HOST环境变量必须设置为这个虚拟机,这样Docker客户端才能找到Docker守护进程。这是通过在shell中运行$(boot2docker shellinit)来完成的。


以我为例(Linux Mint 17),我做了各种各样的事情,我不确定其中哪些是完全必要的。

我将丢失的Ubuntu包包括在内:

$ sudo apt-get install apparmor lxc cgroup-lite

日志含义向组docker添加用户。

$ sudo usermod -aG docker ${USER}

启动守护进程(openSUSE只需要这个)

$ sudo docker -d

谢谢\归因


谢谢乌斯曼·伊斯梅尔,因为也许这只是最后一件事…

愚蠢的问题,你启动docker守护程序了吗?- Usman Ismail 12月17日15:04


还要感谢github@MichaelJCole为我提供的解决方案,因为当我阅读乌斯曼的评论时,我没有检查守护进程。

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安装说明和谷歌关于其他方法

在Linux Mint上,缺省情况下没有安装cgroup-lite和lxc包。安装这两个程序后,我可以在基本映像中运行bash,然后构建并运行我的映像。


感谢brettof86对openSUSE的评论


我遇到了同样的问题,并尝试了各种方法来解决这个问题,修改.bash_profile文件,登录和退出,但没有任何运气。最后,重启我的机器解决了这个问题。


在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

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


我也有同样的问题。一个简单的服务docker重启就解决了这个问题。


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

service docker start

这为我解决了问题!


当我用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]#

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

我注意到,运行docker运行hello-world失败与这个袜子错误的问题,但运行sudo docker运行hello-world工作。 我将我的当前用户添加到docker组,sudo adduser user docker。然后必须重新启动计算机或使用su - user(如果在docker组中,请使用groups命令检查)。

在那之后,hello-world开始工作。

我的答案是基于我如何使用docker没有sudo?这就解释了问题所在。



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

sudo groupadd docker
sudo usermod -aG docker $USER

登出并重新登录,以便重新评估组成员资格。

docker run hello-world

来源:以非root用户管理Docker