Docker API не доступен из контейнера - PullRequest
0 голосов
/ 21 февраля 2020

Я могу делать вызовы cUrl для Docker API, но если я запускаю тот же сценарий из контейнера (docker -compose), я не могу достичь какой-либо конечной точки API.

Мои запросы выглядят так :

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

Причиной может быть использование localhost, но я пока не могу найти решение. Любые предложения?

РЕДАКТИРОВАТЬ: Вот краткий обзор стека, который я использую (Api-Platform https://api-platform.com/). Каждый контейнер подключен к мостовой сети api_default:

  • php = Symfony приложение на основе
  • nginx = NGINX веб-сервер
  • psql = Размещает основную базу данных
  • мс sql = Используется для синхронизации c данных
  • ...

У меня есть оболочка скрипт в моем контейнере "php", предназначенный для доступа к Docker API. Подводя итог, я прошу контейнер "ms sql" синхронизировать c с внешней службой, а затем я прошу контейнер "psql" скопировать эти данные (экспорт / импорт выполняется с помощью файлов CSV через общие тома).

Проблема в следующем:

  • Если я выполняю команду docker-compose exec php bin/console app:sync (Symfony, которая запускает скрипт), все работает нормально: контейнеры взаимодействуют через docker .sock с Docker API и я могу синхронизировать c мои базы данных.
  • Но если я запускаю тот же скрипт с конечной точкой API (localhost: 8080 / api / syn c) или через VueJS app (Ax ios), API Docker никогда не возвращает nany ответ.

Ниже приведена часть моего сценария:

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", ...]
      }'

А вот способ, которым я вызовите мою команду Symfony в контроллере конечной точки api:

 /**
  * @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 ]

1 голос
/ 21 февраля 2020

Да. Если вы хотите установить связь между одним docker контейнером и другим docker контейнером, по крайней мере, вам нужно использовать имя службы вместо localhost, потому что, как сказал @BMW, localhost относительно машины вы находитесь, и с точки зрения контейнера localhost - это сам контейнер.

Недавно у меня была похожая ситуация, когда было недостаточно использовать имя службы. Я также должен был создать сеть и добавить каждый сервис в эту сеть. Как это:

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

networks:
  backend:
    driver: bridge
1 голос
/ 21 февраля 2020

локальный хост, который вы пытаетесь подключить, является локальным хостом в контейнере, который вы запускаете curl

, который вы должны найти и заменить его хостом ip

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...