skip to Main Content

Problem Definition

I am trying to use two docker-compose.yml files (each in separate directories) on the same host machine, one for Airflow and the other for another application. I have put Airflow’s containers in the same named network as my other app (see the below compose files) and confirmed using docker network inspect that the Airflow containers are in the network. However when I make a curl from the airflow worker container the my_keycloak server I get the following error:

Error

Failed to connect to localhost port 9080: Connection refused

Files

Airflow docker-compose.yml

version: '3'
x-airflow-common:
  &airflow-common
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.0}
  environment:
    &airflow-common-env
    AIRFLOW__CORE__EXECUTOR: CeleryExecutor
    AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
    AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow
    AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0
    AIRFLOW__CORE__FERNET_KEY: ''
    AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
    AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
    AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth'
  #added working directory and scripts folder 6-26-2021 CP
  volumes:
    - ./dags:/opt/airflow/dags
    - ./logs:/opt/airflow/logs
    - ./plugins:/opt/airflow/plugins
  user: "${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-50000}"
  depends_on:
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres-db-volume:/var/lib/postgresql/data
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "airflow"]
      interval: 5s
      retries: 5
    restart: always

  redis:
    image: redis:latest
    ports:
      - 6379:6379
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 30s
      retries: 50
    restart: always

  airflow-webserver:
    <<: *airflow-common
    command: webserver
    #changed from default of 8080 because of clash with baton docker services 6-26-2021 CP
    ports:
      - 50309:8080
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:50309/health"]
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always

  airflow-scheduler:
    <<: *airflow-common
    command: scheduler
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo
    healthcheck:
      test: ["CMD-SHELL", 'airflow jobs check --job-type SchedulerJob --hostname "$${HOSTNAME}"']
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always

  airflow-worker:
    <<: *airflow-common
    command: celery worker
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo
    healthcheck:
      test:
        - "CMD-SHELL"
        - 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"'
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always

  airflow-init:
    <<: *airflow-common
    command: version
    environment:
      <<: *airflow-common-env
      _AIRFLOW_DB_UPGRADE: 'true'
      _AIRFLOW_WWW_USER_CREATE: 'true'
      _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}
      _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo

  flower:
    <<: *airflow-common
    command: celery flower
    ports:
      - 5555:5555
    #added so that airflow can interact with baton 6-30-2021 CP
    networks:
      - baton_docker_files_tempo
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:5555/"]
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always

volumes:
  postgres-db-volume:
#added baton network so that airflow can communicate with baton cp 6-28-2021
networks:
  baton_docker_files_tempo:
    external: true

other apps docker-compose file

version: "3.7"
services:
  db:
    image: artifactory.redacted.com/docker/postgres:11.3
    ports:
      - 11101:5432
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: keycloaks156
    networks:
      - tempo
  keycloak:
    image: registry.git.redacted.com/tempo23/tempo23-server/keycloak:${TEMPO_VERSION:-develop}
    container_name: my_keycloak
    environment:
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: admin
      KEYCLOAK_DEFAULT_THEME: redacted
      KEYCLOAK_WELCOME_THEME: redacted
      PROXY_ADDRESS_FORWARDING: 'true'
      KEYCLOAK_FRONTEND_URL: http://localhost:9080/auth
      DB_VENDOR: postgres
      DB_ADDR: db
      DB_USER: postgres
      DB_PASSWORD: postgres
    ports:
      - 9080:8080
    networks:
      - tempo
    depends_on:
      - db
  db-migrate:
    image: registry.git.redacted.com/tempo23/tempo23-server/db-migrate:${TEMPO_VERSION:-develop}
    command: "-url=jdbc:postgresql://db:5432/ -user=postgres -password=postgres -connectRetries=60 migrate"
    restart: on-failure:3
    depends_on:
      - db
    networks:
      - tempo

  keycloak-bootstrap:
    image: registry.git.redacted.com/tempo23/tempo23-server/server-full:${TEMPO_VERSION:-develop}
    command: ["keycloakBootstrap", "--config", "conf/single.conf"]
    depends_on:
      - db
    restart: on-failure:10
    networks:
      - tempo
  server:
    image: registry.git.redacted.com/tempo23/tempo23-server/server:${TEMPO_VERSION:-develop}
    command: [ "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "conf/single.conf" ]
    environment:
      AKKA_PARALLELISM_MAX: "2"
      DB_THREADPOOL_SIZE: "4"
      UNSAFE_ENABLED: "true"
      DOCKER_BIND_HOST_ROOT: "${BIND_ROOT}"
      DOCKER_BIND_CONTAINER_ROOT: "/var/lib/tempo2"
      MESSAGING_HOST: "server"
      PUBSUB_TYPE: inmem
      TEMPOJOBS_DOCKER_TAG: registry.git.redacted.com/tempo23/tempo23-server/tempojobs:${TEMPO_VERSION:-develop}
      NUM_WORKER: 1
      ASSET_CACHE_SIZE: 500M
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - "${BIND_ROOT}:/var/lib/tempo2"
    ports:
      - 2551:2551 # akka port
      - 8080:8080 # application http port
      - 8081:8081 # executor http port
      - 5005:5005 # debug port
    networks:
      - tempo
    restart: always
    depends_on:
      - db
networks:
  tempo:
  


2

Answers


  1. No matter where each container resides (any docker-compose file on the same machine). The only thing matter is network as you have mentioned in your question, they are on the same network, so they can see each other on network. But the misunderstanding is where the container are isolated from each other. Therefore instead of localhost you should pass the container-name and execute the curl with it.

    Try running:

    curl keycloak:9080
    
    Login or Signup to reply.
  2. Read carefully the doc on ports.

    It allows to expose a container port to a host port.

    Between services in the same network you can just reach a service on service-name:port, in this case keycloak:8080 instead of localhost:9080

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search