rootless Docker — br_netfilter 로드 실패
Docker 데몬을 rootless 모드로 띄웠더니 시작하다 죽었습니다.
요청을 받아 컨테이너를 만들고 지우는 매니저 프로세스가 하나 있고, 이걸 root 로 띄울 수 없는 상황이었습니다. Docker 데몬에 붙을 수 있다는 건 호스트에서 뭐든 할 수 있다는 뜻이라, 매니저 하나가 뚫리면 호스트가 통째로 넘어갑니다.
그렇다고 일반 사용자로 띄운 매니저를 root 로 뜬 데몬에 그대로 붙이면 컨테이너 레이어에 파일을 쓸 때 소유자가 어긋납니다.
그래서 데몬을 아예 매니저와 같은 사용자로 띄우는 rootless 모드로 갔습니다. 데몬도 컨테이너도 같은 사용자 권한으로 돌면 소유자가 어긋날 일이 없습니다.
br_netfilter 로드 실패로 데몬 종료
로그 끝에 이렇게 나왔습니다.
Running modprobe bridge br_netfilter failed with message:
modprobe: ERROR: could not insert 'br_netfilter': Operation not permitted
failed to start daemon: Error initializing network controller:
error creating default "bridge" network:
cannot restrict inter-container communication:
ensure that the br_netfilter kernel module is loaded
br_netfilter 는 커널 모듈이고, 모듈을 올리는 modprobe 는 커널을 건드리는 작업이라 root 가
필요합니다. rootless 데몬은 root 가 아니니 거기서 Operation not permitted 가 납니다.
컨테이너 간 통신 제한이 br_netfilter를 요구
rootless 데몬도 자기 네트워크 네임스페이스 안에는 docker0 bridge 를 만들고, 호스트와 바깥을
잇는 부분만 slirp4netns 가 맡습니다.
문제는 그 bridge 를 구성하면서 컨테이너 간 통신 제한(inter-container communication)을 같이
걸려고 한다는 겁니다. 그 제한이 br_netfilter 를 요구하지만, 모듈을 올리려면 root 가 필요하니
rootless 데몬은 여기서 멈춥니다.
~/.config/docker/daemon.json 에서 bridge 관련 기능을 끕니다.
{
"iptables": false,
"ip6tables": false,
"bridge": "none"
}
이 매니저는 컨테이너를 호스트 포트로만 노출해서 컨테이너끼리 붙을 일이 없어, 이 기능들을 꺼도 잃는 게 없었습니다. 컨테이너 간 통신이 필요한 구성이면 끄기 전에 그쪽부터 확인해야 합니다. 끄고 나면 데몬이 bridge 구성 단계를 건너뛰고 정상적으로 뜹니다.
사전 준비 사항
데몬이 뜬 뒤에도 rootless 로 가려면 미리 맞춰 둬야 하는 게 몇 가지 있습니다. storage driver 는 overlay2 여야 하고, rootless 데몬은 AUFS 를 못 씁니다.
패키지도 따로 받아야 합니다.
apt-get install -y dbus-user-session docker-ce-rootless-extras uidmap
마지막에 걸린 건 사용자 세션이고, 데몬을 user systemd 서비스로 띄우다 보니 그 사용자가 로그인 상태가 아니면 서비스가 아예 안 붙습니다.
loginctl enable-linger <username>
이걸 안 하면 systemctl --user 가 Failed to connect to bus: No such file or directory 로
실패합니다. machinectl shell <username>@ 로 붙어서 작업하면 세션이 잡힙니다.
rootless 를 택한 이유
매니저 프로세스가 docker cp 같은 방식으로 우회하도록 앱 로직을 고치는 방법도 있었습니다.
다만 사이드 이펙트 검증이 필요하고 공수가 커서, 앱은 그대로 두고 데몬을 매니저와 같은
사용자로 띄우는 쪽을 택했습니다. 둘이 같은 사용자면 권한 문제가 아예 사라집니다.
대신 rootless 로 가면 커널을 건드리는 일이 전부 막히니, 데몬이 기본으로 하려는 것 중에 root 가 필요한 게 뭔지부터 봐야 합니다. bridge 구성이 그중 하나였고, 안 쓰는 기능이면 꺼서 넘어갑니다.
댓글 0