https://youtu.be/xewZYX1e5R8?si=2FSrqIj7JjdHdked
널널한 개발자님의 Docker? 그 전에 Process 영상을 보면서, 블로그에 정리해야 겠다는 생각이 들었고
들었던 내용을 바탕으로, 몇몇 블로그의 내용들을 참고해서 글을 작성하였습니다.
도커 컨테이너는 독립적인 환경에서 애플리케이션을 실행할 수 있도록 도와주는 기술입니다. 이미지를 기반으로, 도커 컨테이너의 작동 방식을 이해하는 데 도움이 되는 몇 가지 중요한 개념을 설명하겠습니다.
컨테이너와 호스트 OS
컨테이너는 호스트 OS에서 실행되며, 해당 OS의 커널을 공유합니다.
도커는 리눅스 커널을 사용하여 컨테이너를 격리하고, 각 컨테이너는 자체 파일 시스템, 네트워크 인터페이스 및 프로세스 공간을 가집니다. 이로 인해 컨테이너는 효율적이고 경량화된 실행 환경을 제공합니다.
컨테이너의 독립성과 격리
컨테이너는 독립적으로 실행됩니다. 하나의 컨테이너에서 실행되는 프로세스는 다른 컨테이너나 호스트 시스템의 프로세스와 격리되어 있어, 애플리케이션 간의 충돌을 방지합니다. 이러한 독립성은 도커 컨테이너의 핵심 강점 중 하나입니다.
각 컨테이너는 격리된 프로세스 공간을 가지므로, 한 컨테이너에서 발생한 문제나 보안 위협이 다른 컨테이너나 호스트 시스템에 영향을 미치지 않습니다. 도커는 이를 통해 안정성과 보안성을 높입니다.
그런데 어떻게 이것들이 모든 서버 환경에 관계없이 똑같이 동작할 수 있을까요?
바로 Docker가 만들어주는 Image라는 것 덕분입니다. 이미지란 애플리케이션을 실행시키는 데 필요한 모든 SW와 설정 값들을 담고 있는 파일입니다. 보통 어플리케이션 실행을 위해서는 OS,Java,웹서버,데이터베이스 같은 것이 필요하고 이런 것들은 설치순서나 복잡한 설정이 필요합니다.
그런데 이미지는 이런것을 합해서 묶어버리고 뿐만 아니라 어떤 순서로 설치해야하는 지도 모두 담고 있어요. 그렇기 때문에 어떤 환경에서도 이 이미지라는 것을 사용하면 똑같이 동작하게 되는 거죠.
Docker는 이러한 이미지를 만들어 잘 포장시켜주고, 이미지가 잘 동작할 수 있도록 표준화도 시켜줍니다.
이렇게 만들어진 이미지는 Docker Hub 라는 Docker 이미지공유 사이트에 올릴 수도 있고, 개인 저장소에 저장도 할 수 있습니다. Docker Hub 에서 전세계의 개발자들이 올려둔 이미지도 언제든 가져다 쓸 수 있습니다.
호스트 커널 공유
컨테이너는 호스트 시스템의 커널을 공유하기 때문에 가상 머신보다 훨씬 가볍습니다. 가상 머신은 자체 운영 체제 전체를 포함하고 있어 메모리와 CPU 자원을 더 많이 소모하지만, 도커 컨테이너는 호스트 커널을 공유하므로 자원 소모가 적습니다.
이미지와 컨테이너
도커 이미지는 컨테이너의 실행 환경을 정의합니다. 이미지는 파일 시스템, 애플리케이션 코드, 라이브러리, 설정 파일 등을 포함하고 있으며, 이를 기반으로 컨테이너가 생성됩니다. 이미지는 불변성이 특징이며, 한 번 생성된 이미지는 변경되지 않습니다.
성능 이점
도커 컨테이너는 가상 머신보다 더 빠르고 효율적입니다. 컨테이너는 경량이며, 호스트 커널을 공유하므로 오버헤드가 적습니다. 이는 더 빠른 시작 시간과 높은 밀도의 애플리케이션 실행을 가능하게 합니다.
리눅스 컨테이너
리눅스 컨테이너는 운영체제 커널을 제외한 나머지 모든 프로세스와 독립적인 1개 이상의 프로세스를 실행하는 기술을 말합니다. 컨테이너에 프로그램을 포장해서 다른 프로세스들과 독립적으로 실행하는 방식입니다. 리눅스 컨테이너에 더 많은 기능을 추가하고 쉽게 사용할 수 있게 만든 프로그램이 바로 도커(Docker) 엔진입니다. 도커는 사실상 컨테이너의 표준으로 자리잡았습니다.
가상 머신과의 차이
가상 머신(VM)은 하드웨어를 에뮬레이션합니다. 호스트 OS 위에서 하이퍼바이저가 필요하며, 그 위에서 게스트 OS가 돌아가면서 가상의 독립된 컴퓨터로 동작합니다. 하이퍼바이저를 통해 자원을 할당받고 게스트 OS까지 동작시켜야 하기 때문에 상당히 비효율적입니다. 반면, 도커 컨테이너는 호스트 OS 상에서 동작하는 프로세스로, 다른 프로세스와 같은 계층에서 실행되지만 프로세스 단위로 독립된 환경에서 실행됩니다.
리눅스 컨테이너 구현
리눅스 컨테이너를 구현하려면 리눅스 시스템 콜인 chroot, namespace, cgroup, union mount 등의 기능을 활용해야 합니다.
- cgroup (Control Group)
cgroup은 프로세스 그룹이 사용하는 시스템 자원을 제한, 관리, 격리하는 리눅스 커널 기능입니다. cgroup은 CPU 시간, 시스템 메모리, 네트워크 대역폭 등의 자원을 제어합니다. 이를 통해 특정 프로세스들에 할당되는 자원을 제한하고 관리할 수 있습니다.
- namespace
namespace는 리눅스 커널에서 제공하는 프로세스 격리 기술입니다. 각 프로세스는 독립적인 네임스페이스 내에서 실행되어, 다른 프로세스와의 충돌을 방지합니다. 리눅스 네임스페이스의 종류로는 mnt(파일 시스템 마운트), pid(프로세스), net(네트워크), ipc(Interprocess Communication), uts(hostname), user(UID) 등이 있습니다.
- union mount
유니온 마운트는 여러 디렉토리를 하나의 마운트에서 표현되도록 겹쳐 놓은 것을 말합니다. 이를 통해 도커 이미지는 여러 레이어로 구성되며, 필요한 애플리케이션 환경을 효율적으로 제공할 수 있습니다.
- chroot
chroot는 프로세스가 실행되는 루트를 변경하는 시스템 콜입니다. 이를 통해 특정 프로세스는 변경된 루트 디렉토리를 기준으로 파일 시스템을 탐색하게 되어, 다른 파일에 접근할 수 없게 됩니다.
이미지와 컨테이너의 관계
이미지는 프로그램 설치 CD와 같고, 컨테이너는 그 프로그램을 실행한 프로세스입니다. 컨테이너로 무엇을 하든 이미지에는 변화가 없으며, 서로 독립적입니다. 컨테이너에 새로운 파일을 추가하면 새로운 이미지로 만들 수 있으며, 이는 컨테이너가 레이어 구조로 이루어져 있기 때문입니다. 모든 변경사항은 최상단 레이어에 쓰여지며, 컨테이너가 삭제되면 모두 사라지게 됩니다. 이러한 도커 컨테이너의 특성 덕분에 Git처럼 버전 관리를 할 수 있게 됩니다.
참고 자료
- 널널한 개발자 TV - 도커? 그전에 프로세스 !
'Computer Science > Server' 카테고리의 다른 글
[쇼핑몰 ERD] 소규모 쇼핑몰 Entity Relationship Diagram 설계 (6) | 2024.09.19 |
---|---|
상품 전체 리스트 API 부하 테스트 결과 분석. [JMeter] (1) | 2024.07.22 |
클라우드와 온프레미스 : 클라우드 컴퓨팅의 구조 (4) | 2024.07.21 |
[Server] 세션 기반 인증 VS 토큰 기반 인증 (0) | 2024.06.13 |