(설명 읽다가 너무 난잡하면 그냥 결론쪽으로 가시면 됩니다. 거기에 3줄 요약 해놨습니다.)
최근 Docker를 기초부터 다시 공부하다가 공식문서에서 다음과 같은 사진을 보게 되었다.

다들 Docker를 공부했다면 한번쯤 접했을 그림이라고 생각한다.
그런데 여기서 내가 들었던 궁금증은 컨테이너 안에 OS가 존재하지 않는다는 점이다. 오히려 그림을 보면, Docker Engine (위 그림에서는 Docker) 밑에 Host OS가 기본적으로 깔려있고, 각 컨테이너가 Host OS를 공유하는 구조인 것을 볼 수 있다. 그 말은, 단순하게 생각하면 HostOS에 따라 뭔가 실행 방식이 달라진다는 의미 아닐까?
그런데 이것만 보고 "에이 그게 뭐, 그냥 OS에 대해 종속적인가보지"라고 할 수는 없다. 구조상 도식도는 저렇게 나와있지만, 우리가 실제로 사용할때 OS에 대하여 종속적인 경험을 해본적은 없다.
당장 필자도 macOS환경에서 개발을 진행하는데, AWS 배포 환경에서는 대부분 ubuntu 환경을 이용한다. 이때 OS가 불일치 한다는 오류를 경험한적은 단 한번도 없다.
결론부터 말하면 "독립적"이다. 아 물론, 사용자 입장에서는 말이다.
이걸 이해하려면 Docker가 사실 Linux Container를 구현했다는 사실을 알아야 한다.
Linux Container는 각 프로세스를 독립된 환경에서 실행할 수 있는 컨테이너 기능을 제공하며, 이를 쓰기 쉽게 만들고 GUI, CLI 버전으로 만들어 배포한게 바로 Docker이다.
이를 따르면, 컨테이너 자체가 Linux의 개념이므로, 컨테이너를 Linux환경에서 실행해야 하니 HostOS가 macOS이던, window이던, Linux를 가상화시켜 그 위에서 Docker를 실행해야한다. 따라서, 사실 HostOS가 어느 OS이던 Docker는 Linux를 기반으로 실행된다.
자 여기까지 이해했다면, 다시 본론으로 돌아와보자. 그래서 결론적으로는 각 컨테이너가 사용자 입장에서는 왜 독립적인가?
앞에서 말했다시피, 결론적으로 Docker는 Linux기반의 프로그램이다. 그리고 Linux에는 사용자 공간(User Space)와 커널 공간(Kernel Space)가 존재한다. 쉽게 말하면 사용자 공간은 사용자가 설정한데로 설치한 응용 프로그램, 라이브러리, 프레임워크가 설정되는 공간이고 커널 공간은 실제 시스템의 호출등을 처리하는 공간이다.
사용자 공간에서는 다른 운영 체제가 있는 것처럼 동작할 수 있다. 예를 들어, macOS 기반의 컨테이너라면, 커널 공간에서 수행되는 기본적인 작업들, 예를 들어 사용자 요청 처리나 자원 관리 등은 리눅스가 처리하지만, 사용자 공간에는 macOS에 맞는 필수 도구들이 설치되고 환경 설정이 이루어진다. 따라서, 사용자 입장에서는 해당 컨테이너가 macOS처럼 보일 수 있지만, 실제로는 리눅스 위에서 동작하는 것이다.
결론적으로, Docker는 리눅스 기반의 컨테이너 기술이지만, 호스트 OS에 맞게 가상화된 리눅스 환경을 제공하여, 사용자 입장에서는 다양한 OS 환경을 사용할 수 있는 것처럼 느껴지게 된다. 그래서 Docker를 사용하면서 OS에 종속적이지 않은 경험을 할 수 있게 되는 것이다.
위에 설명이 너무 난잡해서, 결론만 짧게 정리해보겠습니다.
1. Docker는 사실 Linux container 기반이라 Linux 위에서 실행되야함
2. Linux 기반이긴 한데, 컨테이너 환경에 따라 OS를 흉내내는것처럼 작동이 가능함
3. 그래서 사용자가 사용할때는 OS에 종속적인거 못느끼는거임.
혹시 틀린점이 있다면 바로 피드백 해주시면 감사하겠습니다.
https://hi-ai0913.tistory.com/5
https://www.redhat.com/ko/topics/containers/whats-a-linux-container
https://adjh54.tistory.com/352
https://www.docker.com/resources/what-container/