我可以对Docker API进行cUrl调用,但是如果我从容器(docker-compose)运行相同的脚本,则无法访问任何API端点。
我的请求如下:
$ curl --unix-socket /var/run/docker.sock -X POST http:/localhost/containers/json
原因可能是使用本地主机,但目前无法找到解决方案。有什么建议吗?
编辑:这是我正在使用的堆栈的简要摘要(Api平台https://api-platform.com/)。每个容器都连接到“ api_default”桥接网络:
我的“ php”容器中确实有一个shell脚本,该脚本旨在访问Docker API。总而言之,我请求“ mssql”容器与外部服务同步,然后请求“ psql”容器复制那些数据(通过共享卷对csv文件进行导出/导入)。
问题是:
docker-compose exec php bin/console app:sync
(运行脚本的Symfony命令),则一切正常:容器通过docker.sock与Docker API通信,并且我可以同步数据库。下面是我脚本的一部分:
curl -XPOST -H 'Content-Type: application/json' \
--unix-socket /var/run/docker.sock http:/localhost/containers/mssql/exec \
-d '{
"AttachStdout":true,
"Tty":true,
"Cmd":["/opt/mssql-tools/bin/sqlcmd", ...]
}'
这是我在api端点控制器中调用Symfony命令的方式:
/**
* @Route("/api/sync", name="sync", methods={"GET"})
*/
public function sync(KernelInterface $kernel)
{
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'app:sync'
));
$output = new BufferedOutput();
$application->run($input, $output);
$content = $output->fetch();
return new Response($content);
}
也许我应该将“ localhost”替换为“ api_default”以达到良好的网络,但这行不通...?
答案 0 :(得分:1)
您尝试连接的本地主机是运行curl
您应该找到并替换为其主机IP
答案 1 :(得分:1)
是的。如果要在一个Docker容器和另一个Docker容器之间进行通信,则至少需要使用服务名称而不是localhost
,因为正如@BMW所说,localhost
是相对于机器的从容器的角度来看,本地主机就是容器本身。
最近我也遇到类似的情况,仅使用服务名称还不够。我还必须创建一个网络并将每个服务添加到该网络。像这样:
my_service:
...
...
...
networks:
- backend
networks:
backend:
driver: bridge