Airflow에서 DockerOperator를 사용해 외부 Docker 컨테이너를 실행하려고 할 때, 다음과 같은 에러를 만날 수 있다.
PermissionError(13, 'Permission denied') Failed to establish connection to Docker host unix://var/run/docker.sock
여기서 핵심은 docker_url="unix://var/run/docker.sock" 즉, Airflow 컨테이너 내부에서 호스트의 Docker 소켓에 접근해야 한다.
Airflow는 DockerOperator를 통해 호스트의 Docker 데몬과 통신한다.
일반적으로 다음과 같이 설정한다.
DockerOperator(
task_id="run_container",
image="my_image:latest",
command="bash -c 'echo hello'",
docker_url="unix://var/run/docker.sock",
)
DockerOperator는 내부적으로 다음을 수행한다:
- Docker 소켓(/var/run/docker.sock)을 통해
- 호스트 Docker 데몬에 연결
- 새로운 컨테이너 생성 및 실행
즉, Airflow 컨테이너가 Docker를 실행하는 구조 이기 때문에, Docker 소켓 접근 권한이 반드시 필요하다.

그런데 기본 docker-compose 환경에서 Airflow는 일반 사용자 권한으로 실행되며, var/run/docker.sock 파일은 보통 root 또는 docker 그룹만 접근 가능하다.
따라서 다음과 같은 에러가 발생한다.
PermissionError(13, 'Permission denied') Failed to establish connection to Docker host unix://var/run/docker.sock
docker-compose.yaml 파일에서 airflow-worker 서비스에 user: "0:0" 설정을 추가하면 간단하게 해결 가능하다.
airflow-worker:
user: "0:0"
user: "0:0"는 root 권한 실행을 의미한다.
ex)
services:
airflow-worker:
image: apache/airflow:2.x.x
user: "0:0"
volumes:
- ./dags:/opt/airflow/dags
- /var/run/docker.sock:/var/run/docker.sock
이 설정은 다음과 같은 의미를 가진다:
- Airflow worker가 root 권한을 가진다
- 컨테이너 탈출 시 위험성 증가
따라서 운영 환경에서는 다음 대안을 고려할 수 있다.
대안 1: docker 그룹 권한 사용
: 호스트의 docker 그룹 GID를 맞춰서 실행
대안 2: Docker Remote API + TLS 사용
: docker_url="tcp://host:2376" 방식
대안 3: KubernetesPodOperator 사용
: k8s 환경에서는 더 안전한 구조 가능