인프런 커뮤니티 질문&답변

윤준영님의 프로필 이미지

작성한 질문수

Jenkins를 이용한 CI/CD Pipeline 구축

실습21) AWS EC2에 Tomcat 서버 설치하기

Docker 개념 문의

작성

·

403

0

학습중에 궁금한부분이 생겨서 문의드립니다

제가 알기로는 docker 컨테이너를 실행해도

리눅스의 경우 커널같은 코어한 부분은 쉐어한다고 알고있는데요

낮은 버전의 우분투에서 도커오 높은 버전의 우분투 이미지를 돌려도 정상적으로 돌아갈까요?

답변 1

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

Docker Desktop 형태로 Docker engine을 기동하실 때에는 Docker Desktop이 설치된 Host PC의 모든 리소스와 라이브러리를 공유한다기 보다는 사용에 필요한 최소한의 정보 및 필수 정보를 공유하는 것으로 알고 있습니다. Docker 컨테이너가 가상 머신이 아니기 때문에, 말씀하신 개념으로 이해하시는 것보다는 Docker에서 말하는 컨테이너는 그냥 프로세스들의 설정이라고 이해하시는 것이 좋을 것 같습니다. SW를 실행할 새로운 가상 머신을 생성하는 것이 아니라, 터미널에서 새 프로세스를 시작하는 것처럼 기존 OS에서 프로세스를 시작하게 됩니다. "컨테이너화된" 프로세스와 일반 프로세스의 차이점 중 몇가지를 나열하면 다음과 같습니다.

1. 호스트의 루트 파일 시스템을 사용하는 대신 /에 다른 파일 시스템을 마운트한다(일반적으로 컨테이너 이미지와 함께 제공되는 파일 시스템). 호스트 파일 시스템의 일부는 새 프로세스의 루트 파일 시스템 아래에 마운트될 수 있다. 예를 들어, docker run -v /u/myprogram-data:/var/data/myprogram을 사용하여 컨테이너화된 프로세스는 /var/data/myprogram/file을 읽거나 쓸 때 /u/myprogram-data/file을 사용하게 된다.

2. 컨테이너화 된 프로세스를 위한 별도의 프로세스 공간을 생성하여 자신과 하위 프로셋를 볼 수 있지만 호스트에서 실행 중인 다른 프로세스는 볼 수 없다.

3. 컨테이너의 사용자는 호스트의 사용자와 다른 별도의 사용자 네임스페이스를 생성한다. 예를 들어 컨테이너화된 프로세스의 UID 1234는 컨테이너화되지 않은 프로세스의 UID 1234와 동일하지 않다.

4. "가상 라우터"와 호스트 네트워크 인터페이스 간의 주소 변환을 사용하여 고유한 IP 주소가 있는 별도의 네트워크 인터페이스 집합을 만들 수 있다. (예: 호스트는 포트 8080에서 패킷을 수신하면 컨테이너 프로세스의 가상 네트워크 인터페이스에 있는 포트 80으로 전달할 수 있다.)

Docker는 다른 커널을 사용하지 않으며, 실행되는 커널은 항상 호스트 커널입니다. 호스트 커널이 실행하려는 컨테이너의 소프트웨어와 ”호환될 수 있는 상태“면 작동하고, 그렇지 않으면 작동하지 않게 됩니다. 말씀하신 것처럼 낮은 버전의 리눅스(Host PC)에서 상위 버전의 리눅스(Docker)를 컨테이너 형태로 기동하실 때에도, Host PC에 의존적이라기 보다는 기동에 필요한 최소한의 리소스를 공유하면서, 기동하고자 하는 도커 이미지에 해당되는 컨테이너를 기동하게 됩니다. 따라서, 도커 이미지 자체가 어떠한 내용으로 빌드 되었는지에 따라 실행되는 컨테이너가 달라질 것이고, 해당 도커 이미지 역시, 이미지가 생성된 플랫폼에 맞춰 생성되었다면, Docker Desktop에서 실행하는 데에는 무리가 없습니다. 다만, 다른 플랫폼에서 생성된 이미지는 실행할 수 없기 때문에, 이부분 유의하셔서 실행해 보시면 좋을 것 같습니다.

이상, 컨테이너에 대한 몇가지 내용과 의견을 작성해 보았습니다. 궁금하신 사항이 있으시면 다시 글 남겨 주세요.

감사합니다.