Docker compose не может получить доступ к портам других контейнеров

#docker #shell #networking #docker-compose

#docker #оболочка #сеть #docker-compose

Вопрос:

У меня есть 2 контейнера, работающих с docker compose. Один из контейнеров выполняет сценарий оболочки, который должен проверить, запущен ли другой контейнер и работает ли он на порту 9990.

Несмотря на то, что контейнер запускается, сценарий оболочки ничего не выдает.

    keycloak:
      image: jboss/keycloak:latest
      volumes: 
        - ./imports/cache_reload/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
        - ./imports/themes/custom/:/opt/jboss/keycloak/themes/custom-theme/
        - ./imports/realm/realm-export.json:/opt/jboss/realms/custom-import.json
      environment:
        DB_VENDOR: MYSQL
        DB_ADDR: mysql
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_PASSWORD: password
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: Pa55w0rd
      ports:
        - 8080:8080
      depends_on:
        - mysql
  keycloak_installer:
    image: solr:6.6-alpine
    volumes:
      - ./imports/scripts/import-realm.sh:/docker-entrypoint-initdb.d/init.sh
    depends_on: 
      - keycloak
 

Сценарий оболочки выглядит следующим образом:

 echo "MOIN LEUDE TRYMACS HIER!"

while ! nc -z localhost 9990; do
    sleep 1
    echo "Waiting for keycloak server startup 9990..."

    echo "$(nc -z localhost 9990)"
done
 

Печатается первое echo, но затем больше ничего не печатается.

На порту 9990 выполняется перехват ключей контейнера.

Пожалуйста, помогите, спасибо

Комментарии:

1. С точки зрения контейнера «установщик» localhost , это контейнер «установщик». Имена хостов, доступных для подключения к другим контейнерам, см. в разделе Создание сети в Compose ; вы должны иметь возможность использовать имя службы Compose keycloak в качестве имени хоста.

2. Я пробовал while ! nc -z keycloak 9990; это все то же самое. есть идеи? большое спасибо!

Ответ №1:

Вы должны более подробно изучить сеть в docker compose.

Чтобы решить вашу проблему, вам нужно :

  1. Добавьте сеть в свой файл docker compose для каждого контейнера (существует сеть по умолчанию, но для понимания механизма вы можете определить ее явно). Это должно выглядеть следующим образом (например, в разделе «Порты») для первого контейнера (с именем keycloak):
      ports:
       - 8080:8080  
     networks:
       - keycloak_network
 

Во втором контейнере (с именем keycloak_installer) (вы должны предоставить порт, который хотите запросить в первом контейнере):

     depends_on: 
      - keycloak
    networks:
      - keycloak_network
 
  1. В вашем скрипте явно вызывается второй контейнер, который теперь будет доступен по сети. Вы должны изменить свой код следующим образом :
     nc -z keycloak_installer 9990
 

Комментарии:

1. Вам не нужно выполнять ни одну из частей шага 1. Compose создает default сеть и присоединяет к ней контейнеры, если вы ничего не делаете; «разоблачить» как глагол почти ничего не значит в современном Docker; соединения между контейнерами полностью игнорируются ports: .

2. Спасибо за ваш отзыв. Я отредактировал свой ответ, я думаю, четко определите сеть, которую легче понять. Что касается порта, вы правы, это на всякий случай, но в этом нет необходимости, я его удалил.