$sudo systemctl start docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
우분투 컨테이너 내에서 'sudo systemctl start docker'명령어로 Docker를 실행시킬 때 위와 같은 에러 메시지가 발생했습니다.
우선 에러 메시지의 내용을 대충 봤을 때, 'systemd'를 초기화 시스템으로 사용하지 않았다는 내용인 거 같은데,,,
찾아보니 기본적으로 Docker 컨테이너는 호스트 시스템의 커널은 공유하지만, 시스템 레벨의 서비스 관리를 위한 systemd와 같은 초기화 시스템이 컨테이너 내부에서 실행되지 않는다고 합니다.
따라서 systemctl을 사용할 수 없습니다.
그러나 어렵지 않게 해결 방법을 찾을 수 있었습니다.
해결 방법 1번. docker run 명령어에 옵션 추가
컨테이너를 run을 이용해 띄울 때 애초에 모든 호스트 기능 및 장치에 대한 권한을 부여하는 방법입니다.
$ docker run -it -d --privileged --name test_ubuntu ubuntu /sbin/init
위와 같이 '--privileged' 옵션과 '/sbin/init'을 작성해 줍니다.
여기서 '--privileged'는 컨테이너를 privileged모드에서 실행하도록 해서 컨테이너에 대한 모든 호스트 기능 및 장치에 액세스 권한을 부여합니다.
'/sbin/init'은 컨테이너 내에서 systemd를 실행하기 위해 /sbin/init을 시작하도록 합니다. 이는 Dockerfile을 수정하거나 혹은 컨테이너 내에서 수동으로 수정하는 방법도 있습니다.
그러나 저는 이상하게 컨테이너가 실행 중에 멈춘 후 실행이 되지 않아서 포기,,, 그래서 두 번째 방법을 이용해서 해결했습니다.
해결 방법 2번. 컨테이너 내의 Docker 초기화 스크립 직접 실행
$ sudo /etc/init.d/docker start
/etc/init.d 내에 있는 Docker의 초기화 스크립트를 직접 실행하는 방법입니다.
해결 방법 1번과 같은 방법은 컨테이너를 호스트와 같은 위치의 권한을 부여하는 privileged 모드로 실행하는 방법이기에 보안상의 이슈가 될 수 있기에 해결 방법 2번의 방법을 이용하는 것이 좋아 보일 것 같습니다.