Docker에서 systemctl
을 사용할 일이 생겼다. 당연하게 될 줄 알았는데 사용하는데 애 좀 먹었다. 그 과정을 정리해 본다.
당시 CentOS 7
를 사용하고 있었고 Docker
는 macOS
에서 실행하고 있었다.
해당 환경에서 오류가 발생하는데 찾고 찾아도 정말 답이 없어서 CentOS 8
으로 써야 하나 했다... CentOS 8
은 privileged
값 같은 것 설정하지 않아도 그냥 잘 되었던 것으로 알고 있다.
Docker에서 systemctl
가 안 되는 것은 CentOS
에 국한된 것이 아니라 Docker
컨테이너를 띄우면 발생할 수 있는 문제이었다.
결론: 사용 방법
- Windows에서는 문제가 없었다.
- macOS의 경우
~/Library/Group\ Containers/group.com.docker/settings.json
의deprecatedCgroupv1
값을true
으로 변경하고Docker Desktop
완전 종료 후 실행해야 한다.(재시작 X) - Mac의 M 시리즈도 잘 된다. (테스트해봄)
- 해당 이슈와 관련하여 찾아보면 많이 등장하는
cgroup
관련 볼륨 마운트 할 필요 없고/usr/sbin/init
,privileged
지정하고exec
으로bash
으로 접근해서 사용하면 된다. (애초에 호스트가 리눅스가 아니라 상관 없다.) - 찾아보면 다들
cgroup
볼륨 마운트 예시만 있는데 나는mac
이라서 관련 디렉터리가 없는데 그래서 안되는 건가 한참 헤맸지만 그런 것은 아니었다.
문제
CentOS
apachectl
와 같은 시스템 명령이 동작하지 않았습니다."Failed to get D-Bus connection: Operation not permitted"
오류가 발생합니다.컨테이너를 실행할 때
--privileged
옵션을 추가하여 컨테이너에 더 많은 권한을 부여할 수 있다고 하는데 해당 옵션을 주더라도 해결되지 않았습니다.아래의 명령으로 잘 동작하는지 테스트 했습니다.
sudo yum install at
sudo systemctl enable atd
# 해당 부분에서 에러 발생
sudo systemctl start atd
sudo systemctl status atd
echo "sleep 5; echo 'Hello World' > /tmp/test.txt" | at now
트러블슈팅
오류 메시지 기반으로 검색
당시 systemctl
입력 당시 나오는 오류 메시지로 계속 검색하면서 나온 글을 스크랩한 것입니다.
대부분 글에서 하는 내용은 privileged
를 활성화하고 /usr/sbin/init
으로 실행해라 이었습니다.
mac
에서 추가적으로 설정하라는 값 알려주는 글 (이 글이 맞았습니다)- M 시리즈 맥은 어차피
CentOS 7
안된다는 글 (아닙니다 테스트 해보니까 잘 됩니다) - 다들 블로그 글에 있는 건데 자세한 설명
- 복잡하고
Dockerfile
직접 작성해서 수행하는 글
macOS에서 deprecatedCgroupv1
값 false
처리 이후 종료 후 재시작 시도
[Docker] 컨테이너에서 systemctl 사용 문제 글을 보고 뭔가 재시작
이 아닌 종료 후 시작에 대한 힌트를 얻었다.
왜냐면 위에서 여러 글을 보면서 테스트 하던 중 한번은 systemctl
이 되었던 적이 있었기 때문이다. 그리고 그 과정에서 OS 재부팅
을 한 적이 있는데 그러면서 자연스럽게 Docker
가 다시 시작되고 문제가 해결된 것이라고 생각했다.
deprecatedCgroupv1
값 변경 후 Docker
를 종료 후 재시작하니 잘 되는 것을 보았고 트리거 조건을 찾기 시작했다.
가정은 아래와 같다.
- OS 재부팅 때문?
- Docker 설정때문?
- Docker 종료 후 재시작 때문?
가정 테스트
deprecatedCgroupv1
값을false
로 바꾸고- docker-compose
down
후 다시up
: 잘됨 - docker
재시작
: 잘됨 - docker
재시작
후down
후 다시up
: 잘됨 - docker
종료
후재시작
: 안됨
- docker-compose
deprecatedCgroupv1
값을true
로 바꾸고- docker
종료
후재시작
: 잘됨
- docker
- docker 공장 초기화 후
deprecatedCgroupv1
값 바꾸면?- 공장 초기화 후
~/Library/Group\ Containers/group.com.docker/settings.json
의deprecatedCgroupv1
값이false
으로 변경되는 것을 봄 - 값을
true
로 바꾸고 종료 후 시작하니까 잘됨
- 공장 초기화 후
다른 플랫폼 테스트
- 애플 실리콘
M1 MacBook Air
,M2 MacBook Air
으로 잘 되는 것을 확인함
- Windows
deprecatedCgroupv1
값을 변경하지 않아도 잘됨
마무리
Docker에서 당연히 되는 기능이라고 생각했는데 안되어서 당황했다.
대부분의 글에서 cgroup
관련 볼륨 마운트 예시만 나오고 나는 mac
이라서 관련 디렉터리가 없는데 그래서 안되는 건가 한참 헤매고, Docker Desktop의 settings.json 을 변경 후 재시작이 아닌 종료 후 시작해야 한다는 것을 몰라서 한참 또 헤맸다.
결론을 보면 별것이 아닌데 한참 헤맸다. 누군가 이 글을 보고 헤매는 시간을 줄였으면 좋겠다.