无法从docker-compose连接到docker

255

我在Mac OS 10.8.5上安装了docker-machine 0.1.0和docker-compose 1.1.0。
Docker-machine正常运行,并能够通过docker-machine ssh进行连接。

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev    *        virtualbox   Running   tcp://192.168.99.100:2376   

但是无法通过docker-compose进行连接。

$ docker-compose up

无法连接到Docker守护程序,位于http+unix://var/run/docker.sock,请确认守护程序是否正在运行。

如果守护程序位于非标准位置,请使用DOCKER_HOST环境变量指定URL。

我的Dockerfile和docker-compose.yml在这里。

Dockerfile

FROM centos:centos7
DOCKER_HOST tcp://192.168.99.100:2376

docker-compose.yml

web:
  build: .

为什么无法连接?有什么想法吗?


85
docker-machine 是否以 root 用户身份运行?我在 Ubuntu 上遇到了相同的问题,原因是套接字权限不足,使用 sudo 命令可以解决。 - SLD
9
对于Linux用户,你可能需要被添加到docker用户组中 - Batandwa
12
只需运行:sudo docker-compose up。 - Girish Gupta
1
对于使用Ubuntu的用户,应该使用sudo命令,而不应将用户添加到docker组中。请查看已接受答案中的评论:https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo - kas
1
以管理员身份运行,感谢 Kas! - Michael Paccione
显示剩余2条评论
34个回答

350

对我来说,简单的解决方案是:sudo docker-compose up


更新于2016-3-14:在docker安装过程(或docker-compose?)的某个阶段,建议并提供了一个示例,将您的用户名添加到“docker”组中。这样可以避免在所有docker命令之前都需要使用“sudo”,如下所示:

~ > docker run -it ubuntu /bin/bash
root@665d1ea76b8d:/# date
Mon Mar 14 23:43:36 UTC 2016
root@665d1ea76b8d:/# exit
exit
~ > 

仔细查看安装命令的输出(包括docker和docker-compose的第二个安装命令),您将找到必要的步骤。这里也有记录:https://subosito.com/posts/docker-tips/

不用sudo!

每次执行命令时都累了吗?不想再输入sudo docker了吗?是的,有方法可以解决这个问题。尽管自然情况下docker需要root用户,但我们可以为docker操作提供一个等同于root的组。

您可以创建一个名为docker的组,然后将所需的用户添加到该组中。在重新启动docker服务之后,用户将无需每次执行docker操作时都键入sudo。作为root用户,它在Shell命令中是什么样子的?看这里:

> sudo groupadd docker
> sudo gpasswd -a username docker
> sudo service docker restart 

完成!

更新于2017-3-9

Docker安装说明已在此处更新。

Linux后安装步骤

本节包含配置Linux主机以更好地与Docker配合使用的可选过程。

以非root用户身份管理Docker

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

如果您不想在使用docker命令时使用sudo,请创建名为docker的Unix组并将用户添加到其中。当Docker守护程序启动时,它会使Unix套接字的所有权可读/写,由docker组拥有。

要创建docker组并添加您的用户:

# 1. Create the docker group.
$ sudo groupadd docker

# 2. Add your user to the docker group.
$ sudo usermod -aG docker $USER

# 3. Log out and log back in so that your group membership is re-evaluated.

# 4. Verify that you can run docker commands without sudo.
$ docker run hello-world

这个命令会下载一个测试图像并在一个容器中运行。当容器运行时,它会打印一条信息性消息然后退出。


1
同样的,出于某些原因,sudo是使它正常工作的唯一方式 :O :O :O - Jamie Hutber
23
不必注销账户,可以使用命令:newgrp docker - Thiago Falcao
啊,详细的回答带有子问题 :-) - nomadSK25
1
回复:“对我来说简单的解决方案是:sudo docker-compose up”。但当我尝试时,出现了以下错误提示:“sudo: docker-compose: 命令未找到”。 - Mike B
在将我的用户添加到“docker”组后,这对我起作用了,我可以运行应用程序。 - Lucas Aimaretto
1
感谢@ThiagoFalcao在这里提供newgrp。 - CharlesS

103

Docker机器正在运行中。但您需要导出一些环境来连接到Docker机器。默认情况下,docker CLI客户端试图使用http+unix://var/run/docker.sock(如错误消息所示)与守护程序通信。

请使用eval $(docker-machine env dev)导出正确的环境变量,然后再次尝试。您还可以仅运行docker-machine env dev以查看它将要导出的环境变量。请注意,其中之一是DOCKER_HOST,正如错误消息建议您可能需要设置的那样。


3
你可以将这个命令(eval "$(docker-machine env default)")放到你的bin/postactivate文件中,以确保它始终是最新的。 - Dannid
1
我在哪里找到 bin/postactivate 文件? - lszrh
1
或者您忘记安装Docker:```$ eval $(docker-machine env dev)找不到命令“docker-machine”,但可以通过以下方式进行安装:sudo snap install docker``` - R OMS

71

如果您使用 sudo 启动了 Docker,则应该使用 sudo 运行 docker-compose up,例如:sudo docker-compose up


1
当我运行sudo docker-compose build而不是docker-compose build时,它对我起作用了。 - Abu Noman Md Sakib

64

我通过以下方法解决了Ubuntu 20.0.4的问题:

sudo chmod 666 /var/run/docker.sock

然后

sudo service docker start && docker-compose up -d

参考链接


6
答案不正确,请再做更多的研究。您正在让每个人都可以访问套接字。https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo - Benjamin
2
@LiveWireBT 这是解决方案,已经解决了问题。您能解释一下这里的最佳实践是什么吗? - M. Rostami
非常感谢。我已经开始抓狂了。 - M4X_
这解决了我的问题,666对套接字有影响吗? - Olivier JM
这解决了我的问题,谢谢。 - Md Atiqul Haque

32

当您遇到一个错误时:

错误:无法连接到位于 http+docker://localhost 的 Docker 守护程序 - 它正在运行吗?

解决方案如下:

  1. 首先,尝试验证远程/本地机器上的Docker服务是否已正常运行sudo service docker status

    如果没有 - 运行sudo service docker startsudo systemctl start docker(取决于某些 Linux 版本,请参见 Docker 入门指南)。

  2. 其次,以sudo方式启动Dockersudo docker-compose up


31

默认情况下,Docker守护进程始终以root用户身份运行,因此您需要在Docker命令之前加上sudo

如果您不想在使用docker命令时使用sudo,请创建一个名为docker的Unix组,并将用户添加到其中。当docker守护进程启动时,它会使Unix套接字的所有权可读/可写的docker组。

创建docker组并添加您的用户:

  1. 创建docker组。

    $ sudo groupadd docker

  2. 将您的用户添加到docker组中。

    $ sudo usermod -aG docker $USER

  3. 注销并重新登录以重新评估您的组成员资格。

  4. 验证您是否可以无需sudo运行docker命令。

    $ docker run hello-world

此命令下载测试镜像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出。

上述步骤来自官方Docker文档


我们如何在安装了 Docker 的 Windows 上实现这一点? - Jeff Cook
除此之外,我为了解决docker-compose问题所做的是将执行“docker-compose”的用户设置为“/usr/local/bin/docker-compose”的所有者,然后重新启动服务。 - Sam
可以使用 su - $USER 命令来刷新 group 成员身份,以避免频繁注销和登录。 - Stuart Cardall

19

sudo systemctl start docker - 启动Docker服务。

然后运行 sudo docker-compose up

我使用Fedora 26,尝试解决相同的问题,最终进入了Fedora 开发者页面上的 Docker ComposeFedora 开发者页面上的 Docker ,这帮助了我。

可能社区认为Docker服务应该随系统启动并一直在后台运行,但对我来说并不那么明显,这也是为什么没有像这个答案这样受欢迎的原因之一。

Fedora 开发者页面上有如何启用Docker随系统启动的指示:

sudo systemctl enable docker


如果你在Mac上运行,请将systemctl替换为launchctl - Rohit Swami

12

快速解决此问题的方法:

只需在您的docker命令之前添加sudo,例如


sudo docker-compose up


9

如果您正在使用Linux系统

尝试使用命令 sudo docker-compose up


8

需要以root权限运行。 sudo docker-compose up --build


在Ubuntu 20.0上工作。谢谢 - Rahal Kanishka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接