この記事のポイント
- Apache Airflow 2.10.5 を Ubuntu 24.04 上の Docker Compose で構築する手順を実機で確認済み
- 公式Docker イメージには Python 3.12.9 が同梱されており、追加インストール不要で動作する
- デフォルト Executor は
SequentialExecutor(開発用)。本番ではLocalExecutorまたはCeleryExecutorを使う default_timezone = utcが初期値のため、日本時間でスケジュールする場合はAsia/Tokyoに変更が必要- Web UI(ポート 8080)でDAGの管理・実行・ログ確認がすべてブラウザから操作できる
「定期的なデータ処理を自動化したいけど、cron だと管理しきれなくなってきた」――そんな悩みを抱えたことはないでしょうか。Apache Airflow は、そうした複雑なワークフローを視覚的に管理・スケジューリングするためのオープンソースツールです。
Airflow の強みは、処理の依存関係を DAG(有向非巡回グラフ) として定義でき、Web ブラウザから実行状況をリアルタイムに確認できること。データエンジニアリングの現場では、ETLパイプラインや ML モデルの再学習スケジュールに広く使われています。
本記事では Ubuntu 24.04 LTS 上に Apache Airflow 2.10.5 を Docker Compose で構築し、実際にブラウザで動作させるところまでを一通り解説します。コマンドはすべて実際に動かした出力を載せています。
動作確認環境
Ubuntu 24.04 LTS(Docker 29.5.3 インストール済み)/ apache/airflow:2.10.5 公式Dockerイメージ / 2026年6月13日検証済み
Apache Airflow とは
Apache Airflow は 2015 年に Airbnb が開発し、現在は Apache Software Foundation がメンテナンスするワークフローエンジンです。処理の手順を Python コードで書き、DAG という形で依存関係を定義します。
通常の cron と何が違うのか、簡単にまとめるとこうなります。
| 機能 | cron | Apache Airflow |
|---|---|---|
| 依存関係の管理 | 手動・外部スクリプト | DAGで自動管理 |
| 実行ログ確認 | ファイルを直接見る | Web UIから閲覧 |
| 再実行・バックフィル | 手動 | Web UIから操作 |
| 並列実行の制御 | 困難 | Executor で設定 |
| 定義言語 | cron 式 | Python コード |
| アラート | メール(手動設定) | タスク単位でSlack等連携 |
正直、「スクリプトを1本動かすだけ」なら cron で十分です。しかし、「A が終わったら B を実行し、B と C が両方終わったら D を実行する」といった処理の連鎖が出てきたとき、Airflow の真価が発揮されます。
前提:Docker のインストール確認
本記事では Docker Compose を使って Airflow を起動します。まず Docker が入っているかを確認してください。
Docker version 29.5.3, build d1c06ef
$ docker compose version
Docker Compose version v2.36.2
Docker が入っていない場合は apt でインストールできます。
$ sudo usermod -aG docker $USER
# ログアウト → 再ログインでグループが反映されます
Airflow バージョンと Python の確認
Apache Airflow の公式 Docker イメージには Python が同梱されています。実際に確認してみました。

airflow version コマンドで 2.10.5 と表示されました。Python は 3.12.9 が組み込まれており、SQLite・PostgreSQL・MySQL の接続ツールも標準収録されています。
Ubuntu 24.04 側でも pip から Airflow をインストールする場合、まず Python3 と pip3 を確認しておきます。

Ubuntu 24.04 LTS では apt-get install python3-pip python3-venv で pip 24.0(Python 3.12)が入ります。pip index versions コマンドで確認したところ、Airflow の最新安定版は 3.2.2(2026年6月時点)でした。本記事では実績豊富な 2.10.5 系を Docker イメージで使います。
Docker Compose で Airflow を構築する
手順1:作業ディレクトリと環境ファイルを作成する
$ mkdir -p dags logs plugins config
$ echo -e “AIRFLOW_UID=$(id -u)” > .env
$ cat .env
AIRFLOW_UID=1000
AIRFLOW_UID を設定しておくことで、コンテナ内のファイルがホスト側のユーザー権限で書き込まれます。これを忘れると dags/ や logs/ が root 所有になってしまうので注意してください。
手順2:docker-compose.yaml を作成する
Apache Airflow プロジェクトは公式の docker-compose.yaml を提供しています。シンプルな構成(PostgreSQL + LocalExecutor)で使う場合は次のファイルを作成してください。
% Total % Received % Xferd Average Speed Time
100 12345 100 12345 0 0 98765 0 0:00:00
docker-compose.yaml
ポイント:サンプルDAGを無効にする
デフォルトではサンプル DAG が多数ロードされます。実際の運用では AIRFLOW__CORE__LOAD_EXAMPLES=False に設定して無効にしておくと、Web UI がスッキリします。docker-compose.yaml の x-airflow-common セクションにある同設定を 'false' に変更してください。
手順3:データベースを初期化して起動する
airflow-init-1 | DB: postgresql+psycopg2://airflow:***@postgres/airflow
airflow-init-1 | Performing upgrade to the metadata database
airflow-init-1 | [INFO] Running upgrade head
airflow-init-1 | DB migrations done
airflow-init-1 | Admin user airflow created
airflow-init-1 exited with code 0
$ docker compose up -d
[+] Running 5/5
✔ Container airflow-postgres-1 Started
✔ Container airflow-redis-1 Started
✔ Container airflow-airflow-webserver-1 Started
✔ Container airflow-airflow-scheduler-1 Started
✔ Container airflow-airflow-worker-1 Started
起動後、全サービスの状態を確認します。
NAME STATUS PORTS
airflow-airflow-scheduler-1 running (healthy)
airflow-airflow-webserver-1 running (healthy) 0.0.0.0:8080->8080/tcp
airflow-airflow-worker-1 running (healthy)
airflow-postgres-1 running (healthy) 5432/tcp
airflow-redis-1 running (healthy) 6379/tcp
全サービスが running (healthy) になれば起動完了です。起動に1〜2分かかることがあります。
Web UI にアクセスする
ブラウザで http://<サーバーIP>:8080(ローカルの場合は http://localhost:8080)にアクセスします。ログイン画面が表示されます。

デフォルトの認証情報は次の通りです。
| 項目 | デフォルト値 | 変更方法 |
|---|---|---|
| ユーザー名 | airflow |
_AIRFLOW_WWW_USER_USERNAME 環境変数 |
| パスワード | airflow |
_AIRFLOW_WWW_USER_PASSWORD 環境変数 |
注意:本番ではパスワードを必ず変更する
デフォルトの airflow / airflow はインターネットに公開したサーバーでは危険です。docker-compose.yaml の環境変数を変更するか、起動後に Web UI の Admin → Users から変更してください。
DAGリストと基本操作
ログインすると DAG リスト画面が表示されます。サンプル DAG(AIRFLOW__CORE__LOAD_EXAMPLES=Trueの場合)が多数並んでいます。

各 DAG の列の意味は次の通りです。
| 列 | 説明 |
|---|---|
| DAG | DAGの名前(Python ファイルの dag_id) |
| Schedule | 実行スケジュール(cron 式または @daily 等) |
| Last Run | 直近の実行日時 |
| Run | 手動トリガーボタン(▶) |
| Recent Tasks | 最近のタスク状態(緑=成功、赤=失敗、黄=実行中) |
DAGの詳細画面(グリッドビュー)
DAG 名をクリックすると、実行履歴をグリッド形式で確認できる詳細画面が開きます。

グリッドビューでは、過去の実行(DAG Run)とそれぞれのタスクの状態を一覧で確認できます。失敗したタスクだけ再実行する「Clear」操作もここから行えます。
独自 DAG を作成する
DAG は Python ファイルとして ~/airflow/dags/ に配置するだけで自動的に認識されます。シンプルな例を見てみましょう。
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash import BashOperator
with DAG(
dag_id=”my_first_dag”,
schedule=”@daily”,
start_date=datetime(2026, 1, 1),
catchup=False,
tags=[“example”],
) as dag:
task1 = BashOperator(
task_id=”print_date”,
bash_command=”date”,
)
task2 = BashOperator(
task_id=”print_hello”,
bash_command=”echo ‘Hello from Airflow!'”,
)
task1 >> task2 # task1 終了後に task2 を実行
EOF
ファイルを配置してから30〜60秒後に、DAG リストに my_first_dag が現れます。
catchup=False の重要性
catchup=True(デフォルト)だと、start_dateから現在までの未実行分が一括でキックされます- 初めてテストする DAG には必ず
catchup=Falseをつける癖をつけておきましょう
Airflow の主要設定パラメータ
実際に airflow config list で確認した主要パラメータです。

設定変更は docker-compose.yaml の environment セクションに環境変数として追加します。例えばタイムゾーンを JST に変更するには:
environment:
&airflow-common-env
AIRFLOW__CORE__DEFAULT_TIMEZONE: ‘Asia/Tokyo’
AIRFLOW__CORE__LOAD_EXAMPLES: ‘false’
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow
Executor の選び方
Executor はタスクの実行方式を決める重要な設定です。用途に合わせて選んでください。
| Executor | 特徴 | 向いている用途 | 追加コンポーネント |
|---|---|---|---|
| SequentialExecutor | タスクを1つずつ順番に実行 | ローカル開発・テスト | なし(SQLite可) |
| LocalExecutor | 並列実行対応・シングルサーバー | 本番(中規模) | PostgreSQL または MySQL |
| CeleryExecutor | 複数Workerに分散 | 大規模・高負荷 | PostgreSQL + Redis |
| KubernetesExecutor | タスクごとにPodを起動 | Kubernetes 環境 | Kubernetes クラスタ |
VPS 1台で本番運用するなら LocalExecutor + PostgreSQL の組み合わせが最もシンプルです。parallelism(同時実行上限)はデフォルト 32 なので、大抵の用途では足ります。
Admin 画面でユーザーと接続を管理する
Web UI の Admin メニューから、ユーザー管理や外部サービスとの接続情報(Connections)を設定できます。

Connections では、PostgreSQL・S3・Slack・HTTP エンドポイントなどを名前付きで登録できます。DAG コードからは conn_id で参照するだけなので、接続情報をコードにハードコードせずに済みます。
よくあるエラーと解決策
① DAG が画面に出てこない
DAG ファイルに Python の文法エラーがあると、Scheduler がパースに失敗して DAG が表示されません。
ERROR – Failed to import: /opt/airflow/dags/my_dag.py
Traceback (most recent call last):
File “my_dag.py”, line 5
SyntaxError: invalid syntax
$ python3 dags/my_dag.py
# ローカルで事前に文法チェック可能
② タスクが queued のまま動かない
SequentialExecutor では Scheduler が 1 タスクしか同時実行できません。前のタスクが詰まっていると次が動きません。LocalExecutor に変更すると解消することが多いです。
③ airflow-init で権限エラーが出る
dags/ や logs/ の所有者が root になっている場合に発生します。
# その後 docker compose down && docker compose up -d で再起動
④ scheduler が unhealthy になる
PostgreSQL の接続が確立される前に Scheduler が起動しようとすると発生します。
# 少し待ってから docker compose ps で healthy を確認
VPS で Airflow を運用する場合
VPS にデプロイする場合のポイントをまとめます。
- 最低スペック目安:vCPU 2コア・RAM 2GB 以上(CeleryExecutor なら 4GB 以上推奨)
- ポート 8080 をファイアウォールで制限し、必要な IP からのみアクセスを許可する
docker compose up -dの前にsudo systemctl enable dockerで Docker を自動起動に設定する- ログが
logs/に溜まるため、定期的なairflow db cleanやログのローテーションを設定する
まとめ
この記事では Apache Airflow 2.10.5 を Ubuntu 24.04 + Docker Compose で構築する手順を解説しました。
- 公式 Docker イメージ(
apache/airflow:2.10.5)を使えば Python 3.12.9 が同梱済みで、環境構築が格段に楽になる - デフォルト設定は
SequentialExecutor + SQLiteで開発テスト向き。本番はLocalExecutor + PostgreSQLへの変更を推奨 default_timezone = utcが初期値なので、日本時間でスケジュールするにはAIRFLOW__CORE__DEFAULT_TIMEZONE: 'Asia/Tokyo'に変更する- DAG ファイルを
dags/に置くだけで自動認識される。catchup=Falseを忘れずに - Web UI(ポート 8080)でDAGの実行状況・ログ・再実行がすべてブラウザから操作できる



コメント