컨테이너 기술은 운영 체제 수준에서 가상화를 제공하여, 여러 애플리케이션이 동일한 운영 체제에서 독립적으로 실행될 수 있게 합니다.
컨테이너는 호스트 운영 체제의 커널을 공유하면서, 필요한 애플리케이션과 의존성만 포함하여 실행됩니다.
이는 가상 머신과 달리 별도의 운영 체제가 필요하지 않아, 자원 사용이 효율적이고 시작 시간이 빠릅니다.
가상 머신(Virtual Machine)은 하이퍼바이저를 통해 물리적 서버 위에 완전한 운영 체제를 실행하는 기술입니다.
각 가상 머신은 독립적인 운영 체제를 가지며, 이는 자원 사용이 많고 시작 시간이 느립니다. 가상 머신은 다양한 운영 체제를 동일한 하드웨어에서 실행할 수 있어, 이기종 시스템 간의 이식성이 높습니다.
하이퍼바이저는 가상화 기술의 핵심 요소로, 단일 호스트 컴퓨터에서 여러 개의 가상 머신(VM)을 동시에 실행할 수 있게 해주는 소프트웨어입니다.
하이퍼바이저는 물리적 하드웨어의 자원을 가상화하여 각 가상 머신에 할당하고, 이를 통해 다양한 운영 체제가 독립적으로 실행될 수 있게 합니다.
특징 | 컨테이너 | 가상 머신 |
---|---|---|
운영 체제 | 호스트 OS의 커널 공유 | 독립적인 OS 필요 |
자원 사용 | 효율적, 낮은 메모리 사용 | 높은 메모리 사용 |
시작 시간 | 빠른 시작 시간 (수초) | 느린 시작 시간 (수분) |
이식성 | 동일 OS 계열에서만 가능 | 다양한 OS 지원 |
크기 | 작은 이미지 크기 (MB) | 큰 이미지 크기 (GB) |
Docker는 컨테이너 기술을 구현하는 인기 있는 플랫폼으로, Dockerfile을 통해 컨테이너 이미지를 생성합니다. Dockerfile은 이미지 생성에 필요한 명령어를 포함한 파일입니다.
Docker 이미지는 읽기 전용으로, 실행 중에 변경 사항은 볼륨을 통해 저장할 수 있습니다.
컨테이너 이미지는 정적 파일로, 실행 가능한 코드를 포함하여 컴퓨팅 시스템에서 컨테이너를 생성할 수 있게 합니다. 이 이미지는 불변성을 가지며, 환경에 구애받지 않고 일관되게 배포될 수 있습니다.
컨테이너 이미지는 애플리케이션 코드, 런타임 환경, 시스템 유틸리티, 라이브러리, 구성 파일 등을 포함합니다.
컨테이너 이미지는 레이어로 구성됩니다. 각 레이어는 이전 이미지에 추가된 변경 사항을 나타내며, 이를 통해 다양한 구성 요소를 재사용할 수 있습니다.
이러한 레이어링은 유니언 파일 시스템을 통해 구현되며, 이는 여러 레이어를 하나의 파일 시스템으로 통합하여 컨테이너가 실행될 때 사용됩니다.
컨테이너 이미지를 빌드하는 과정은 주로 Dockerfile을 사용하여 수행됩니다. Dockerfile은 이미지 빌드에 필요한 명령어를 포함한 텍스트 파일입니다.
Dockerfile 생성: Dockerfile에 필요한 명령어를 작성합니다. 예를 들어, 베이스 이미지 지정, 파일 복사, 명령어 실행 등이 포함됩니다.
이미지 빌드: docker build
명령어를 사용하여 Dockerfile을 기반으로 이미지를 생성합니다. 이 과정에서 각 명령어는 새로운 레이어를 생성합니다.
이미지 저장 및 배포: 생성된 이미지는 Docker Hub와 같은 레지스트리에 푸시되어 다른 사용자가 가져다 쓸 수 있습니다.
컨테이너 이미지는 애플리케이션 배포의 효율성을 높이는 중요한 요소입니다. Dockerfile을 통해 이미지 빌드를 자동화하고, 최적화된 레이어링을 통해 이미지 크기를 줄일 수 있습니다. 이러한 기술은 현대의 클라우드 네이티브 애플리케이션 개발에서 필수적입니다.
컨테이너 오케스트레이션은 여러 컨테이너의 배포, 관리, 확장을 자동화하는 기술입니다.
Kubernetes는 가장 인기 있는 오케스트레이션 도구로, 컨테이너의 생명 주기를 관리하고 워크로드를 자동화합니다. Kubernetes는 Master Node와 Worker Node로 구성되며, POD라는 단위로 컨테이너를 관리합니다.
cp –rf /config/collaboration/cloud /config/workspace/
cd /config/workspace/cloud/container/00.container-linux
파일 복사: /config/collaboration/cloud
디렉토리의 내용을 /config/workspace/
로 복사합니다.
디렉토리 이동: /config/workspace/cloud/container/00.container-linux
디렉토리로 이동합니다.
sudo docker build --tag container-linux:1.0 .
container-linux:1.0
이라는 이름의 Docker 이미지를 생성합니다.sudo docker images
mkdir ./mydata
sudo docker run --rm -d -v $(pwd)/mydata:/mydata --name my-first-container container-linux:1.0
공유 디렉토리 생성: 현재 작업 디렉토리 내에 mydata
라는 폴더를 생성합니다.
Docker 컨테이너 실행: container-linux:1.0
이미지를 기반으로 my-first-container
라는 이름의 컨테이너를 실행합니다. -v
옵션을 사용하여 호스트의 mydata
디렉토리를 컨테이너의 /mydata
디렉토리와 마운트합니다.
sudo docker ps
sudo docker exec -it my-first-container /bin/bash
실행 중인 컨테이너 목록 확인: 현재 실행 중인 Docker 컨테이너 목록을 출력합니다.
컨테이너에 접속: my-first-container
에 접속하여 내부에서 명령어를 실행할 수 있습니다.
cd mydata
ls
mydata 디렉토리로 이동: 컨테이너 내부에서 /mydata
디렉토리로 이동합니다.
디렉토리 내용 확인: 현재 디렉토리 내의 파일 목록을 출력합니다.
cp webserver.py ./mydata
cd ./mydata
ls
python webserver.py
호스트에서 파일 복사: 호스트의 webserver.py
파일을 mydata
디렉토리로 복사합니다.
컨테이너 내부에서 파일 실행: 컨테이너 내부에서 webserver.py
파일을 실행합니다.
tar 명령어는 여러 개의 파일과 디렉토리를 하나의 파일로 묶거나 풀 때 사용됩니다. Docker 이미지를 만드는 과정에서 필요한 프로그램과 패키지를 설치된 상태로 복사하여 다른 환경에서 사용할 수 있도록 하는 파일들의 묶음으로 생각할 수 있습니다.
Docker 이미지: 필요한 프로그램과 패키지가 설치된 상태로 복사하여 다른 환경에서 실행할 수 있는 파일들의 묶음입니다.
Docker 컨테이너: Docker 이미지를 기반으로 실행되는 격리된 환경입니다.
tar 명령어: 여러 파일을 하나의 파일로 묶는 명령어로, Docker 이미지 생성 과정에서 유사한 개념으로 이해할 수 있습니다.
이러한 과정은 Docker를 사용하여 웹 서비스를 실행하는 데 필요한 단계를 설명하며, Docker의 장점인 환경 독립성과 효율적인 자원 사용을 활용하여 애플리케이션을 배포하는 방법을 보여줍니다.
Docker Engine은 Docker 이미지를 빌드하고, 컨테이너를 실행하며, 오케스트레이션, 볼륨 관리, 네트워킹 확장을 담당하는 핵심 구성 요소입니다.
Docker Engine은 사용자가 Docker 명령어를 통해 컨테이너를 관리할 수 있게 합니다.
Containerd: Docker Engine과 독립적으로 사용할 수 있는 컨테이너 런타임입니다. 컨테이너 이미지를 저장하고 전송하며, runc를 호출하여 컨테이너를 시작하고 관리합니다.
runc: 컨테이너의 실행을 담당하는 프로세스로, OCI(Open Container Initiative) 런타임을 따릅니다. runc는 컨테이너의 프로세스를 시작하고 관리하는 표준적인 방법을 제공합니다.
Docker는 네임스페이스와 cgroup을 사용하여 컨테이너 간의 자원을 격리합니다.
프로세스 테이블: 각 컨테이너는 독립적인 프로세스 테이블을 가지며, 다른 컨테이너의 프로세스에 접근할 수 없습니다.
CPU, 메모리 장치: 컨테이너에서 사용할 수 있는 CPU와 메모리 범위를 제한할 수 있습니다.
파일 시스템: 각 컨테이너는 독립적인 루트 파일 시스템을 가지며, 특정 디렉토리를 루트로 보이게 할 수 있습니다.
네트워크: 네트워크 네임스페이스를 사용하여 각 컨테이너에 독립적인 네트워크 설정을 제공합니다. 가상 NIC(veth)를 통해 컨테이너 내부 네트워크를 구성합니다.
네임스페이스는 컨테이너 내 프로세스를 격리하여 독립적으로 관리할 수 있게 합니다. 네임스페이스는 프로세스, 네트워크, 마운트, PID, IPC 등 다양한 리소스를 격리합니다.
cgroup은 프로세스에 할당된 리소스를 제한하는 메커니즘입니다. CPU, 메모리, I/O 등의 자원을 제어하여 컨테이너가 사용할 수 있는 자원을 관리합니다.
Union File System은 Docker 이미지 관리에 사용되는 기술로, 레이어링과 Copy-on-Write 방식을 활용합니다.
레이어링: 여러 읽기 전용 레이어와 읽기-쓰기 가능한 상위 레이어로 구성됩니다. 변경 사항은 상위 레이어에 저장됩니다.
Copy-on-Write: 파일을 수정할 때, 원본 파일은 그대로 유지하고 변경 사항만 새로운 레이어에 복사하여 저장합니다.
마운트된 디렉터리 병합: 여러 소스 디렉터리를 단일 디렉터리로 병합하여 사용자에게 제공합니다.
Docker 이미지는 여러 레이어로 구성되며, 각 레이어는 독립적으로 관리됩니다. 이미지를 수정하거나 업데이트할 때, 변경 사항은 새로운 레이어에 저장되므로 기존 이미지는 불변성을 유지합니다.
이는 이미지 재사용성을 높이고 빌드 시간을 단축하는 데 유리합니다.
Docker 컨테이너는 각자 가상 NIC를 할당받아 독립적인 네트워크 설정을 가집니다. 동일 호스트 내의 컨테이너 간 통신은 bridge 네트워크를 통해 이루어지며, NAPT(Network Address and Port Translation)를 사용하여 포트를 지정하여 연결할 수 있습니다.
컨테이너와 호스트 시스템 간에 파일 시스템을 공유하기 위해 볼륨 마운트를 사용합니다. 이는 컨테이너가 종료되더라도 데이터를 유지할 수 있는 방법입니다. 볼륨 마운트는 컨테이너 내부의 특정 디렉토리를 호스트의 디렉토리와 연결하여 데이터를 공유합니다.
docker inspect
명령어는 컨테이너나 이미지의 상세 정보를 출력합니다. 이를 통해 컨테이너의 네트워크 설정, 볼륨 마운트 정보 등을 확인할 수 있습니다. 예를 들어, 컨테이너의 IP 주소나 네트워크 설정을 확인할 때 유용합니다.
컨테이너 기술은 가상 머신과 달리 효율적이고 빠른 애플리케이션 배포를 가능하게 합니다. Docker와 같은 플랫폼을 통해 쉽게 컨테이너 이미지를 생성하고, Kubernetes와 같은 오케스트레이션 도구를 사용하여 대규모 시스템을 관리할 수 있습니다. 이러한 기술은 현대의 클라우드 네이티브 애플리케이션 개발에서 필수적입니다.
DB 뿐만 아니라 이제는 도커도 하시나요? 진짜 IT 최적화 인재 ㅜㅜ