在Docker for Mac上访问Docker守护程序远程API

12
我正在运行Docker for OSX,并且在使用Docker远程API时遇到了问题。
我的情况是这样的:
- Docker守护程序原生运行在OSX上(https://www.docker.com/products/docker#/mac,因此不是boot2docker变体) - Jenkins作为docker镜像运行
现在我想使用Jenkins docker-build-step插件构建一个docker镜像,但我希望它使用主机上的docker守护程序,因此在Jenkins设置中,DOCKER_URL应该是类似于:2375的东西。(这样做的原因是如果我已经在主机上安装了docker,则不需要在jenkins容器中安装它)。
是否有一种方法可以实现这一点,或者Docker for Mac目前不支持这一点?我尝试通过调整export DOCKER_OPTS或DOCKER_HOST选项来解决,但仍然在调用http://localhost:2375/images/json时收到连接拒绝的错误。
基本上,问题更多地涉及启用Docker for OSX远程API,使用案例从Jenkins docker容器调用它。

如果我按照https://dev59.com/m5jga4cB1Zd3GeqPPcxX的答案操作,我会遇到此错误:Invalid bind address format: -H unix:///var/run/docker.sock -H tcp://localhost:2376 - Mark Pardijs
仅从主机共享Docker套接字到容器,这个怎么样?jenkins: ... volumes: - /var/run/docker.sock:/var/run/docker.sock - Lauri
1
这似乎是一个有效的选项,但现在我得到了一个“Permission denied”而不是“connection refused”。/var/run/docker.sock是一个符号链接,指向~/Library/Containers/com.docker.docker/Data/s60,但即使我以自己的用户重新创建符号链接,我仍然会收到“Permission denied”的错误... [INFO] I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: Permission denied - Mark Pardijs
3个回答

33

你可以考虑使用socat。它解决了我的问题,似乎和你的问题相似。

socat TCP-LISTEN:2375,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock &

使用以下方式可以使你能够从Docker容器中访问macOS主机的Docker API:tcp://[主机IP地址]:2375

在macOS上可以安装socat,如下所示:

brew install socat

请参考此处对该主题的长期讨论:插件:Docker在Mac OS X上无法通过unix://连接


0

我曾经遇到过相同的问题,但是是与mysql有关。我需要将我的docker主机上的端口43306暴露给运行在端口3306上的docker镜像mysql。

解决方案:

使用-p参数创建你的docker镜像。

例如:

#> docker run -p 0.0.0.0:43306:3306 --name mysql-5.7.23xx -e MYSQL_ROOT_PASSWORD=myrootdba -d mysql/mysql-server:5.7.23 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

现在我可以从我的主机Docker服务器上的43306端口连接到MySQL Docker镜像。

0
如果您已经将SSH公钥添加到远程服务器上,那么您也可以使用这个SSH凭据来连接Docker。对于这种方法,您不需要在服务器上配置远程API。
当连接到macOS的Docker桌面版时,您可以使用SSH(在Mac上启用后)。
docker -H ssh:user@192.168.64.1 images

或者

export DOCKER_HOST=ssh:user@192.168.64.1
docker images

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