본문으로 건너뛰기

Docker에서 systemctl 사용 방법

 · reading-time-plural

Docker에서 systemctl 을 사용할 일이 생겼다. 당연하게 될 줄 알았는데 사용하는데 애 좀 먹었다. 그 과정을 정리해 본다.

당시 CentOS 7 를 사용하고 있었고 DockermacOS 에서 실행하고 있었다.

해당 환경에서 오류가 발생하는데 찾고 찾아도 정말 답이 없어서 CentOS 8 으로 써야 하나 했다... CentOS 8privileged 값 같은 것 설정하지 않아도 그냥 잘 되었던 것으로 알고 있다.

Docker에서 systemctl 가 안 되는 것은 CentOS 에 국한된 것이 아니라 Docker 컨테이너를 띄우면 발생할 수 있는 문제이었다.

결론: 사용 방법

  • Windows에서는 문제가 없었다.
  • macOS의 경우 ~/Library/Group\ Containers/group.com.docker/settings.jsondeprecatedCgroupv1 값을 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 으로 실행해라 이었습니다.

macOS에서 deprecatedCgroupv1false 처리 이후 종료 후 재시작 시도

[Docker] 컨테이너에서 systemctl 사용 문제 글을 보고 뭔가 재시작 이 아닌 종료 후 시작에 대한 힌트를 얻었다.

왜냐면 위에서 여러 글을 보면서 테스트 하던 중 한번은 systemctl 이 되었던 적이 있었기 때문이다. 그리고 그 과정에서 OS 재부팅 을 한 적이 있는데 그러면서 자연스럽게 Docker 가 다시 시작되고 문제가 해결된 것이라고 생각했다.

deprecatedCgroupv1 값 변경 후 Docker 를 종료 후 재시작하니 잘 되는 것을 보았고 트리거 조건을 찾기 시작했다.

가정은 아래와 같다.

  • OS 재부팅 때문?
  • Docker 설정때문?
  • Docker 종료 후 재시작 때문?

가정 테스트

  • deprecatedCgroupv1 값을 false 로 바꾸고
    • docker-compose down 후 다시 up : 잘됨
    • docker 재시작 : 잘됨
    • docker 재시작down 후 다시 up : 잘됨
    • docker 종료재시작 : 안됨
  • deprecatedCgroupv1 값을 true 로 바꾸고
    • docker 종료재시작 : 잘됨
  • docker 공장 초기화 후 deprecatedCgroupv1 값 바꾸면?
    • 공장 초기화 후 ~/Library/Group\ Containers/group.com.docker/settings.jsondeprecatedCgroupv1 값이 false 으로 변경되는 것을 봄
    • 값을 true 로 바꾸고 종료 후 시작하니까 잘됨

다른 플랫폼 테스트

  • 애플 실리콘
    • M1 MacBook Air , M2 MacBook Air 으로 잘 되는 것을 확인함
  • Windows
    • deprecatedCgroupv1 값을 변경하지 않아도 잘됨

마무리

Docker에서 당연히 되는 기능이라고 생각했는데 안되어서 당황했다.

대부분의 글에서 cgroup 관련 볼륨 마운트 예시만 나오고 나는 mac 이라서 관련 디렉터리가 없는데 그래서 안되는 건가 한참 헤매고, Docker Desktop의 settings.json 을 변경 후 재시작이 아닌 종료 후 시작해야 한다는 것을 몰라서 한참 또 헤맸다.

결론을 보면 별것이 아닌데 한참 헤맸다. 누군가 이 글을 보고 헤매는 시간을 줄였으면 좋겠다.


parkgang
태그 🏷