docker 容器尽管是从 docker-compose 创建的,但彼此看不到

docker containers not seeing each other despite created from docker-compose

我 运行 在本地主机中使用 Airflow 2.1.2:

docker-撰写

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: Dockerfile-python3
    image: analytics-airflow
    env_file:
      - ./environtment_config/airflow_config/airflow.env
    container_name: analytics-container-3
    volumes:
      - ./database_utils:/database_utils
      - ./maintenance:/maintenance
      - ./utils:/utils
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./datawarehouse:/datawarehouse
    ports:
      - "8080:8080"
    command: webserver
  scheduler:
    container_name: analytics-scheduler
    build:
      context: .
      dockerfile: Dockerfile-python3
    env_file:
      - ./environtment_config/airflow_config/airflow.env
    volumes:
      - ./database_utils:/database_utils
      - ./maintenance:/maintenance
      - ./utils:/utils
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./datawarehouse:/datawarehouse
    ports:
      - "8793:8793"
    command: scheduler

Docker 文件

FROM apache/airflow:2.1.2-python3.8

ENV PYTHONPATH "${PYTHONPATH}:/"

RUN pip install -r environtment_config/docker_src/requirements.pip

Airflow.env

#Execution behaviour variables
_AIRFLOW_WWW_USER_CREATE=True
_AIRFLOW_WWW_USER_USERNAME=admin
_AIRFLOW_WWW_USER_PASSWORD=admin
_AIRFLOW_DB_UPGRADE=true
#Building variables
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth'
AIRFLOW__CORE__SQL_ALCHEMY_CONN= sqlite:////opt/airflow/airflow.db
AIRFLOW__CORE__EXECUTOR=SequentialExecutor
AIRFLOW__WEBSERVER__SECRET_KEY=localhost
AIRFLOW__CORE__FERNET_KEY=
AIRFLOW__LOGGING__REMOTE_LOGGING= False
AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER=

UI 表明调度程序不是 运行ning:

如果我运行docker ps

CONTAINER ID   IMAGE                COMMAND                  CREATED             STATUS                       PORTS                                       NAMES
1d509c71c804   airflow2   "/usr/bin/dumb-init …"   42 minutes ago      Up 42 minutes (healthy)      8080/tcp                                    scheduler
f1a945f1df01   airflow2   "/usr/bin/dumb-init …"   About an hour ago   Up About an hour (healthy)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   container-3

我通过以下方式修复了连接到网络服务器容器的问题:

docker exec -it container-3 bash
airflow scheduler

所以解决方法是 运行 在同一个容器中提供两种服务,但我不明白为什么它不适用于两个不同的容器,因为它们都是用 docker-compose 创建的,他们应该看到彼此。

另外,每个服务实现一个容器也很重要,因为我将能够提高多个调度程序容器并使用 HA Scheduler,并扩展服务器。

此外,如果单个容器日志中的两个服务 运行 将混合在一起,因此如果其中一个服务发生问题将很难调试。

知道如何解决吗?或者为什么会这样?

你的问题不是调度器没有直接与网络服务器通信,而是你使用了sqlite和Sequential executor。基本上每个容器都有一个单独的 sqlite 数据库,调度程序和网络服务器实际上通过数据库进行通信。

您看到的警告是其结果。

在 Airflow 2.1.3 中,您会在 UI 中看到有关使用 SQLite 和顺序执行程序的额外警告(尽管您已经在日志中看到了有关警告)。

如果你想使用 Airflow 来处理任何真正重要的事情,包括单独的容器和 运行 快速(并行处理任务),你应该至少使用 Postgres 或 MySQL 数据库和 LocalExecutor。然后你就不会看到警告,Airflow 会工作得更快(基本上一切都应该开始并行工作)。

如果您想了解如何使用 DockerCompose 来获得一些灵感(包括当所有内容都分离到每个服务的单独容器中时它是如何工作的),您可以查看我们的快速入门:https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html (但这也仅用于开发 - 虽然它使用 CeleryExecutor,所以如果你想将它用于更重要的事情 quick-start/take 看看 Airflow,那么你必须基于它制作你自己的 DockerCompose)。 =12=]

对于任何真正严肃的事情 - 我建议改为 https://airflow.apache.org/docs/helm-chart/stable/index.html