我在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
无法在http+unix://var/run/ Docker连接到Docker守护进程。袜子——它在跑吗?
如果它位于非标准位置,则使用DOCKER_HOST环境变量指定URL。
我的Dockerfile和docker-compose。Yml在这里。
Dockerfile
FROM centos:centos7
DOCKER_HOST tcp://192.168.99.100:2376
docker-compose.yml
web:
build: .
为什么不能连接?什么好主意吗?
对我来说简单的解决方案: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服务后,用户不再需要输入
Sudo每次都做docker操作。它在壳上是什么样子
命令吗?作为根,你可以这样做:
> 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守护进程总是以根用户运行。
如果在使用docker命令时不想使用sudo,可以创建一个名为docker的Unix组并向其添加用户。当docker守护进程启动时,它使docker组可以读/写Unix套接字的所有权。
创建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
这个命令下载一个测试映像,并在容器中运行它。当容器运行时,它打印一条信息消息并退出。
有人查过日志吗?
在我的例子中,/var/log/upstart/docker.log中的错误信息是:
Listening for HTTP on unix (/var/run/docker.sock)
[graphdriver] using prior storage driver "aufs"
Running modprobe bridge nf_nat failed with message: , error: exit status 1
Error starting daemon: Error initializing network controller: Error creating default "bridge" network: can't find an address range for interface "docker0"
值得一提的是,我打开了vpn,所以:
$ sudo service openvpn stop
$ sudo service docker restart
$ docker-compose |start
$ sudo service openvpn start
这就是解决办法。
默认情况下,docker守护进程总是以root用户运行,因此你需要在docker命令前加上sudo。
如果在使用docker命令时不想使用sudo,可以创建一个名为docker的Unix组并向其添加用户。当docker守护进程启动时,它使docker组可以读/写Unix套接字的所有权。
创建docker组并添加用户:
创建docker组。
$ sudo groupadd docker
将您的用户添加到docker组。
$ sudo usermod -aG docker $USER
登出并重新登录,以便重新评估组成员资格。
验证您可以在没有sudo的情况下使用docker命令。
$ docker run hello-world
这个命令下载一个测试映像,并在容器中运行它。当容器运行时,它打印一条信息消息并退出。
上面列出的步骤来自Docker官方文档。
我也有同样的症状
唯一不同的是,它只发生在docker-compose构建期间
Docker ps工作正常。
在版本2中发生过。X和3.x。
重启docker服务,然后机器…
甚至重新安装docker + docker-compose。
我试过各种方法,但都没用。
最后,我尝试使用docker build“手动”构建Dockerfile。
显然,我在Docker上下文中的文件/文件夹上有一个权限问题。在开始构建时,它试图读取上下文,但失败了,并出现了正确的错误消息。
然而,这个错误消息没有传播到Docker -compose,这只是显示无法连接到Docker守护进程在http+unix://var/run/ Docker。袜子——它在跑吗?
发现解决方案是简单地将文件/文件夹添加到.dockerignore文件中,因为构建不需要它。另一种解决方法可能是嚼碎或chmod。
不管怎样,这可能会帮助人们遇到同样的问题,这与docker和显示的误导性错误消息没有任何关系。
来自@srfrnk的回答适合我。
在我的情况下,我有下一个码头工人。yml文件:
nginx:
build:
context: ./
dockerfile: "./docker/nginx.staging/Dockerfile"
depends_on:
- scripts
environment:
NGINX_SERVER_NAME: "some.host"
NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
NGINX_ERROR_LOG_LEVEL: debug
NGINX_BACKEND_HOST: scripts
NGINX_SERVER_ROOT: /var/www/html
volumes:
- ./docker-runtime/drupal/files:/var/www/html/sites/default/files:rw
ports:
- 80:80
./docker-运行时所有者和组-是root当其他文件所有者-我的用户。
当我尝试构建nginx时
Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
我添加了./docker-runtime到.dockerignore,它解决了我的问题。