我是否尝试连接到启用TLS的守护进程而不使用TLS?

我正在尝试了解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 

当然,这不是一个解决scheme,因为我可能需要在路的某个地方使用sudo

我刚刚发现另一个网页说:“ 如果你使用OS X,那么你不应该使用sudo 。” 我不知道他们是仅仅为了这个例子,还是一般的意思。

对我来说,运行$(boot2docker shellinit 2> /dev/null)修复了这个问题。

这将在当前terminal会话中运行boot2docker shellinit命令(三个set -x ...行)的输出,该命令让docker命令知道在哪里可以findboot2docker虚拟机。

$(boot2docker shellinit 2> /dev/null)~/.bash_profile文件的底部将确保每次打开terminal时都configurationdocker命令。


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


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

我用sudo在MacOS上得到同样的错误,没有它。

我已经解决了它:

 boot2docker start $(boot2docker shellinit) 

PS:感谢Alan。 我发现这种方法是在他们的官方文档中推荐的。

PS2:在运行两个命令之前,有时需要boot2docker init (谢谢Aaron)。

在我的情况下(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守护程序? – 乌斯曼伊斯梅尔14年12月17日在15:04


感谢github @ MichaelJCole提供的解决scheme,因为我在阅读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安装说明和谷歌其他方式

事实certificate,在Linux Mint上,cgroup-lite和lxc软件包默认不安装。 安装两个,然后让我在基本图像中运行bash,然后构build并运行我的图像。


感谢brettof86对openSUSE的评论

下划线问题很简单 – 缺less/var/run/docker.sock unix域套接字的权限。

从Docker 1.6.0的Docker命令行参考的守护程序套接字选项 一章 :

默认情况下,在/var/run/docker.sock创build一个unix域套接字(或IPC套接字), 需要root权限或docker组成员资格

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

授予用户使用Docker的权利

docker命令行工具通过由root:root拥有的套接字文件/var/run/docker.sock联系docker守护进程。 尽pipebuild议使用sudo作为docker命令,但如果用户希望避免这种情况,pipe理员可以创build一个docker组,并拥有自己的/var/run/docker.sock ,并将用户添加到该组中。

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

注销并重新login以使上述更改生效。 请注意,某些Linux发行版(Ubuntu)的Docker包已经在docker组中放置了/var/run/docker.sock ,这使得上面的两个步骤不再需要。

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

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

 service docker start 

为我修好了!

  1. Docker自称是Linux容器的一个自给自足的运行时。 简而言之,它既作为服务器又作为客户端。
  2. $ docker version命令查询是Docker可执行文件的内部,而不是运行的守护进程/服务。
  3. $ docker images or $ docker ps or $ docker pull centos是发送查询到docker守护进程/服务运行的命令。
  4. 默认情况下,Docker支持到其守护进程/服务的TLS连接。
  5. 只有当你login的用户是用户组docker一部分,或者你已经在sudo之前使用了sudo ,例如$ sudo docker images ,是否需要TLS连接。

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

向上滚动一下,findwarning section以获得清晰。

你需要做的是:

 $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 

您可能还没有该文件的权限。 我把自己添加到docker组使用后发生在我身上

 sudo gpasswd -a user docker 

但还没有注销。

要解决这个问题,您可以重新login,或在注销之前使用sg docker "docker <subcommand> ..."

如果您在/etc/group中的组docker中,则应该可以在不input密码的情况下运行它。

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启用守护程序,而无需-TLS /

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

 sudo usermod -a -G docker myusername 

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

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

不要像其他评论中的build议那样运行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) 

TLDR :当我在安装docker的时候运行一个诊所,而且大部分用户都在OS X上时,这让我的Python meetup组过去了这个问题:

 boot2docker init boot2docker up 

然后运行输出给你的输出命令

 docker info 

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


背景(是什么使我们面对这个问题)

我带领一家诊所安装Docker,大部分与会者都有OS X,我们遇到了这个问题,并在几台机器上克服了这个问题。 以下是我们所遵循的步骤:

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

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

然后,我们得到了我们用来安装virtualbox的cask,然后使用brew来安装docker和boot2docker(OS X都需要)。 不要使用sudo来进行brew。 :

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

解决scheme

那是当我们遇到这个问题的时候。 以下修复它。 我知道init是一次性交易,但每次启动docker时都可能需要运行up

 boot2docker init boot2docker 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位hex(0-9或af)标识符,例如456789abcdef 。 然后,您可以提交您的更改并将其命名为描述性名称,如descriptivename性名称:

 docker commit 456789abcdef descriptivename` 

在Ubuntu 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 

我在这里尝试了解决scheme,boot2docker没有工作。

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

对我来说,以下步骤起作用:

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

之后, hello-world开始工作。

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


为了什么是值得的,我试了这个问题的所有解决scheme,在这个相关的问题 ,没有解决我的问题,直到我卸载并重新安装VirtualBox 。 这个过程把VirtualBox从版本4.2.16升级到了4.3.22(我以前的系统在系统上已经闲置了几个月)。

然后boot2dockerdocker工作没有任何其他的调整。

我有同样的问题。 一个简单的service docker restart解决了这个问题。

我有同样的问题,并试图解决这个问题,修改.bash_profile文件,login和退出,没有任何运气。 最后,重新启动我的机器修复它。

确保有

 127.0.0.1 localhost 

在你的

 `/etc/hosts ` 

文件。

当我从Jenkins创buildDocker镜像时遇到同样的问题。 只需将用户添加到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]# 

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