TL;DR

  • Podman의 루트리스 UNIX 도메인 소켓을 DOCKER_HOST에 지정하면 docker-compose를 비롯한 대부분의 Docker 생태계 도구를 사용할 수 있음.
  • Podman의 사용자 네임스페이스에서는 컨테이너 내부의 루트 사용자가 호스트 사용자에 매핑되고, 다른 UID와 GID는 각각 /etc/subuid와 /etc/subgid에 정의된 범위에 매핑됨.
  • 사용자 권한으로 podman.socket을 활성화하고 DOCKER_HOST 환경 변수를 설정하면 Compose 명령을 평소처럼 실행할 수 있음.
  • podman unshare와 podman mount를 사용하면 컨테이너를 시작하지 않고도 컨테이너 사용자 소유 파일을 다루거나 실행 중인 컨테이너 파일에 접근할 수 있음.
  • 로그아웃 뒤에도 컨테이너를 실행하려면 사용자 지속 실행(user lingering)을 활성화해야 하며, 루트리스 Docker도 DOCKER_HOST 설정으로 사용할 수 있음.

Podman 소켓 활성화 및 시작

  • 사용자 권한으로 systemctl --user enable --now podman.socket을 실행하면 Podman 소켓이 활성화되고 시작됨.
  • 소켓은 ${XDG_RUNTIME_DIR}/podman/podman.sock에 생성되며, ${XDG_RUNTIME_DIR}은 사용자별로 자동 마운트되는 비공개 임시 파일 시스템(tmpfs)임.
  • 이 명령에는 systemd 세션이 필요함. sudo는 systemd 세션을 만들지 않으므로 지원되지 않음.
  • wheel 그룹에 속해 있다면 일부 리눅스 배포판에서 systemd-container 패키지에 포함된 machinectl shell --uid=your-username을 사용할 수 있음. 또는 TTY나 SSH로 사용자 계정에 로그인할 수 있음.
  • 이 안내는 Podman과 docker-compose가 배포판의 패키지 관리자를 이용하는 등의 방식으로 이미 설치된 상태를 전제로 함.

Docker 호스트로 소켓 노출

  • docker-compose 같은 도구는 DOCKER_HOST 환경 변수를 읽음. export DOCKER_HOST="unix://${XDG_RUNTIME_DIR}/podman/podman.sock"으로 변수를 설정하면 Podman 소켓을 가리킴.
  • 설정을 영구적으로 유지하려면 Zsh의 ~/.zshrc 등 셸 설정 파일에 해당 줄을 추가하면 됨.

docker-compose 사용

  • 소켓을 연결한 뒤 docker-compose config, docker-compose up -d, docker-compose ps, docker-compose down --volumes를 평소처럼 실행할 수 있음.
  • 리눅스 배포판에 따라 docker-compose 대신 docker compose 명령을 사용할 수 있으며, 동작은 동일함.
  • 셸에 alias docker-compose='docker compose' 별칭을 추가할 수 있음.

팁과 요령

루트 권한 Docker 중지 및 비활성화

  • Docker가 설치되어 있지만 아직 제거할 계획이 없다면 루트 권한으로 systemctl disable --now docker.service docker.socket을 실행하고 rm -f /var/run/docker.sock을 실행해 Docker systemd 서비스와 소켓을 중지·비활성화하고 소켓 파일을 제거할 수 있음.
  • 이 명령은 Docker 데이터를 삭제하지 않음.
  • 다시 사용하려면 루트 권한으로 systemctl enable --now docker.service를 실행하면 됨.

docker 명령 사용

  • podman 명령은 docker와 같은 인수를 받음.
  • docker 명령을 계속 사용해도 됨. docker-compose와 마찬가지로 DOCKER_HOST 변수를 읽고 Podman 소켓과 통신할 수 있음.

podman unshare

  • 컨테이너를 시작하지 않고 루트 권한 환경을 열려면 podman unshare를 사용할 수 있음. 이 명령은 sudo -i와 비슷하게 새 셸을 시작하지만, 호스트의 실제 루트 권한이 아니라 사용자 네임스페이스 안의 루트 권한을 부여함.
  • 이 셸에서 chown이나 chmod 등을 사용해 컨테이너 사용자 소유 파일을 다룰 수 있음.

podman mount

  • podman mount로 실행 중인 컨테이너의 파일에 접근할 수 있음.
  • 먼저 podman unshare를 실행한 뒤 podman mount container-name-or-id가 반환하는 경로로 이동하면 됨.
  • 이후 평소 사용하는 터미널 사용자 인터페이스(TUI) 편집기로 컨테이너 내부 파일을 편집할 수 있음.

루트리스 Docker

  • Podman으로 전환할 준비가 되지 않았다면 Docker의 루트리스 설치를 사용할 수 있으며, 자세한 내용은 Docker 문서를 참고할 수 있음.
  • 설치 및 시작 후에는 DOCKER_HOST를 unix://${XDG_RUNTIME_DIR}/docker.sock으로 설정해야 함.
  • 루트리스 Docker에는 podman unshare와 podman mount에 해당하는 기능이 없지만, unshare와 nsenter로 비슷한 작업을 수행할 수 있음.

사용자 지속 실행

  • 기본 설정에서는 사용자 계정의 마지막 systemd 세션이 종료될 때 Podman 컨테이너도 중지됨.
  • 로그아웃 후에도 컨테이너를 계속 실행하려면 루트 권한으로 loginctl enable-linger your-username을 실행해 사용자 지속 실행을 활성화해야 함.

함께 보기

  • Lobsters 댓글
  • Podman Compose — 몇 년 전 마지막으로 사용한 뒤 크게 발전함.