当前位置: 首页 > 知识库问答 >
问题:

无法从容器中访问Docker API

子车芷阳
2023-03-14

我可以对Docker API进行cUrl调用,但是如果我从容器(docker-comals)运行相同的脚本,我就无法到达任何API终结点。

我的请求如下:

$ curl --unix-socket /var/run/docker.sock -X POST http:/localhost/containers/json

原因可能是使用了localhost,但我现在还找不到解决方案。有什么建议吗?

编辑:下面是我正在使用的堆栈(Api平台)的简要摘要https://api-platform.com/).每个容器都连接到“api_默认”网桥网络:

  • 基于php=Symfony的应用程序

我确实有一个外壳脚本在我的"php"容器,这是为了达到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", ...]
      }'

下面是我在apiendpoint控制器中调用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个答案

齐俊达
2023-03-14

是的。如果您想在一个docker容器和另一个docker容器之间通信,至少需要使用服务名称,而不是localhost,因为正如@BMW所说,localhost与您所在的机器相关,从容器的角度来看,localhost就是容器本身。

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

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

networks:
  backend:
    driver: bridge
孟佑运
2023-03-14

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

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

 类似资料:
  • 我有一个关于这个问题的问题https://hub.docker.com/r/jupyter/scipy-notebook.我正在尝试使用docker compose运行此图像: 组成: Dockerfile 我用手够不着它http://locahost:8888 .... 网址。我使用Windows10作为主机,并尝试从这个docker compose和这些工作中访问其他服务。

  • 问题内容: 我已经创建了hashicorp保管库部署并配置了kubernetes auth。保管库容器从Pod内部调用kubernetes api进行k8s身份验证,并且该调用失败,并显示500个错误代码(连接被拒绝)。我正在将docker用于Windows kubernetes。 我将以下配置添加到Vault中以进行kubernetes身份验证机制。 payload.json 我得到了预期的20

  • tl;如果在Docker容器中运行,一个RestController正确回答,另一个则不正确。 该服务有两个API 和。 它们都是通过docker compose运行的。 返回。 返回一个空的200响应。正如预期的那样。 应该返回一个200响应和一个每次调用API时都会增加的数字。可悲的是,事实并非如此。 在本地运行该服务可以提供预期的结果。 maven spotify插件用于从以下创建图像。 我

  • 问题内容: 我使用docker-compose和以下配置部署了标准的Jenkins Docker映像: 在阅读了许多SO问题之后,我测试了将Root添加到docker用户组,并验证Container中的用户是Root with 。 当我尝试使用“ Docker URL = unix:///var/run/docker.sock”在Jenkins UI中添加Docker访问时,出现错误消息“ **o

  • 我试图在mi本地环境中创建docker容器。我们有一个Micronaut(Java)应用程序和一个MySQL数据库。 我用以下内容为数据库创建了一个容器: 当我从我的应用程序中连接到docker之外的Embbbed服务器时,我们可以毫无问题地连接。Mi应用程序。yml有下一个配置: 然后我尝试创建Micronaut应用程序映像,并在容器上运行它。我的Dockerfile包含: 我首先生成JAR:

  • 我在Amazon linux ec2上安装了dd-agent。如果我直接在主机上运行我的python脚本(我使用了名为"dogstatsd-python"的SDK),所有指标都可以发送到datadog(我登录到datadoghq.com并在那里看到了指标)。脚本类似: 然而,我启动了一个docker容器,并从容器内部运行相同的脚本: '172.14.0.1'是主机的IP,它是用命令提取的 根本没有