본문으로 건너뛰기

Docker에서 systemctl 사용 방법

 · reading-time-plural

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 으로 실행해라 이었습니다.

macOS에서 deprecatedCgroupv1 값 false 처리 이후 종료 후 재시작 시도​

[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.json 의 deprecatedCgroupv1 값이 false 으로 변경되는 것을 봄
    • 값을 true 로 바꾸고 종료 후 시작하니까 잘됨

다른 플랫폼 테스트

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

마무리​

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

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

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


parkgang
태그 🏷