无法从容器内访问Docker API

时间:2020-02-21 00:11:10

标签: docker sockets curl docker-compose docker-api

我可以对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 =基于Symfony的应用程序
  • nginx = NGINX Web服务器
  • psql =托管主数据库
  • mssql =用于同步数据
  • ...

我的“ php”容器中确实有一个shell脚本,该脚本旨在访问Docker API。总而言之,我请求“ mssql”容器与外部服务同步,然后请求“ psql”容器复制那些数据(通过共享卷对csv文件进行导出/导入)。

问题是:

  • 如果我执行docker-compose exec php bin/console app:sync(运行脚本的Symfony命令),则一切正常:容器通过docker.sock与Docker API通信,并且我可以同步数据库。
  • 但是,如果我使用api端点(localhost:8080 / api / sync)或通过VueJS应用(Axios)运行相同的脚本,则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”以达到良好的网络,但这行不通...?

2 个答案:

答案 0 :(得分:1)

您尝试连接的本地主机是运行curl

的容器中的本地主机

您应该找到并替换为其主机IP

答案 1 :(得分:1)

是的。如果要在一个Docker容器和另一个Docker容器之间进行通信,则至少需要使用服务名称而不是localhost,因为正如@BMW所说,localhost是相对于机器的从容器的角度来看,本地主机就是容器本身。

最近我也遇到类似的情况,仅使用服务名称还不够。我还必须创建一个网络并将每个服务添加到该网络。像这样:

my_service:
    ...
    ...
    ...
    networks:
      - backend

networks:
  backend:
    driver: bridge
相关问题