• [Docker] 도커(Docker)란?

    2024. 4. 27.

    by. 지은이: 김지은

    728x90

     

     

    1. 도커(Docker)란?

    컨테이너 기반의 오픈소스 가상화(실제 X) 플랫폼으로, 소프트웨어를 개발, 배포, 실행하기 위한 도구

     

    여기서 컨테이너는 소프트웨어를 실행할 때 필요한 모든 것을 포함하는 격리된 환경을 제공한다.

    이 컨테이너는 라이브러리, 종속성, 설정 등을 포함하여 실행에 필요한 모든 것을 패키징하며

    패키징된 도커 컨테이너는 다른 환경에서도 쉽게 실행할 수 있어서, 개발환경과 실제 운영 환경을 일관성있게 유지하면서

    애플리케이션을 실행할 수 있다.

    또한, 호스트 운영체제(Window, MacOS, Linux)와 독립적으로 작동하기 때문에 호스트 환경에 영향을 주지 않고 실행할 수 있다.

     

    쉽게 말해 소프트웨어를 한 덩어리로 모아서 실행할 수 있는 환경을 제공해주고, 

    모아진 소프트웨어는 실행을 위해 필요한 모든 것을 갖추고 있어서 어디서든 쉽게 실행할 수 있고, 

    운영체제에 구애받지 않고 독립적으로 작동 가능하다

     

    컨테이너 왜 필요할까?

    예를 들어 Node.js를 사용해서 개발을 했을 때 특정 노드 버전을 컨테이너에 고정할 수 있으므로 코드가 항상 정확한 버전으로 실행되도록

    할 수 있으며 개발 환경과 제품 환경간의 일관성을 유지함으로서 개발자간의 환경 차이로 인한 문제를 방지할 수 있다.

     

    그렇다면 도커와 컨테이너는 여러사람이 협업하는 프로젝트에서만 유용할까?

    혼자 작업하는 경우에도 여러개의 프로젝트를 동시에 작업할 때, A프로젝트에서 Nods.js 12버전을 사용하고 B프로젝트에서 Nods.js 14 버전을 사용한다면 충돌할 수 있는데 각 버전을 컨테이너에 보유하고 각각의 프로젝트에는 그들만의 컨테이너가 존재하도록 한다.

     

    2. 가상 머신(VM)과 도커(Docker)

    도커와 VM 둘 다 가상화 기술을 사용해서 하나의 호스트 시스템에서 여러 환경을 운영할 수 있지만, 구현 방식과 가상화 수준에 차이가 있다.

     

    가상 머신(VM)

    VM은 쉽게 말해 컴퓨터 안에 컴퓨터라고 생각하면 된다.

    호스트 시스템(물리적인 컴퓨터) 안에 가상의 컴퓨터를 생성하고 각각의 가상 머신에 운영체제를 설치하여 실행한다.

    이때 하이퍼바이저(Hypervisor) 라는 소프트웨어로 호스트 시스템의 자원(CPU, 메모리, 디스크 등)을 가상화해서 여러개의 가상 머신이 동시에 실행할 수 있도록 지원하며 자원을 공유하면서 독립적인 환경을 유지한다.

     

    하지만, 가상 머신마다 운영체제를 포함하기 때문에 새로운 가상 머신을 생성할 때 마다 새로운 컴퓨터를 구성하는 것과 같기 때문에 무겁고 성능 저하가 있을 수 있다.

     

    도커(Docker)

    도커는 가상 머신과는 다르게 호스트 시스템의 운영체제 커널(운영체제 핵심 기능을 수행)을 공유하면서 프로세스를 격리된 환경에서 실행한다.

    즉, 가상화 컨테이너 안에서 애플리케이션 프로세스를 실행하는 것으로

    VM보다 가볍고 빠르게 실행되며 동일한 호스트에서 여러 개의 컨테이너를 운영할 수 있다.

     

    3. 도커 구성요소

    도커 파일은 컨테이너를 정의하고 빌드하는데 사용되며 이를 통해 이미지가 생성되고, 이미지는 컨테이너를 생성하고 실행하는데 사용

     

    도커 파일

    도커 파일은 도커 이미지를 빌드하기 위한 지시사항을 정의하는 텍스트 파일

    도커 파일에서 명령어로 종속성을 설치하거나 파일 복사, 환경 설정 등을 정의할 수 있으며 도커 클라이언트에 의해 순차적으로 실행되어 이미지를 구성한다.

     

    도커 파일 작성

    • 베이스 이미지 선택(FROM): 어떤 이미지를 기반으로 컨테이너를 생성할 것인지 정의 (ubuntu, node 등)
    • 작업 디렉토리 설정(WORKDIR): 컨테이너 내에서 작업할 위치를 설정해 파일을 추가하거나 명령 실행하는 위치 지정
    • 필요한 파일 및 명령 추가: 파일 복사(COPY), 환경 변수 설정(ENV), 패키지 설치(RUN) 등
    • 포트 노출(EXPOSE): 컨테이너가 실행될 때 개발할 포트 지정
    • 컨테이너 실행 명령(CMD): 컨테이너가 시작될 때 실행할 명령을 지정
    # Node.js 이미지를 베이스로 선택
    FROM node:14
    
    # 작업 디렉토리 설정
    WORKDIR /app
    
    # 호스트의 package.json과 package-lock.json을 복사해서 의존성 설치
    COPY package*.json ./
    RUN npm install
    
    # 현재 디렉토리의 모든 파일을 컨테이저 작업 디렉토리로 복사
    COPY . .
    
    # 컨테이너가 실행될 떄 8090 포트 노출
    EXPOSE 8090
    
    # 애플리케이션 실행
    CMD ["npm", "start"]

     

    이미지

    도커 이미지는 도커 파일을 사용하여 빌드된 실행 가능한 패키지로

    컨테이너를 실행(생성)하기 위한 응용 프로그램과 관련 파일 및 설정 등을 포함한 읽기 전용 템플릿

     

    이미지는 여러 개의 레이어(layer)로 구성되어 있어 파일 시스템의 변경사항을 관리하고 캐시함으로써 이미지를 효율적으로 관리한다.

     

    이미지 레이어 구조

    • 모든 이미지는 베이스 이미지에서 시작되는데 베이스 이미지엔 필수적인 운영체제 파일과 도구를 포함하고 있다.
    • 이후 사용자가 정의한 도커 파일에 따라 이미지 빌드 과정에서 추가된 변경 사항은 베이스 이미지 위에 스택처럼 쌓인다.
    • 이미지는 읽기 전용이므로 이미지를 수정할 땐 새로운 레이어를 추가되는데 변경 사항이 있는 레이어만 새로 생성하고 이전에 사용한 레이어는 재사용되기 때문에 이미지 빌드와 배포가 빠르고 효율적이다.

     

    이미지 생성하기

    • 도커 허브(도커 이미지를 저장하고 공유하는 저장소)에 있는 기존 이미지 다운
    docker pull 이미지_이름
    • 도커 파일로 이미지 빌드
    docker build [옵션: 태그 지정]
    • build한 이미지 목록 보기
    docker images

     

     

    컨테이너

    컨테이너는 이미지를 기반으로 생성된 실행 가능한 가상환경

    각각의 컨테이너는 자체적인 파일 시스템과 네트워크 설정을 가지고 있어 마치 독립된 가상 시스템처럼 동작한다.

     

    컨테이너는 한 호스트 시스템에서 여러 개의 컨테이너를 실행할 수 있고, 각 컨테이너는 다른 컨테이너와 완전히 분리되어있어 서로 영향을 주지 않고 독립적으로 실행한다.

     

    • 컨테이너로 실행하기
    docker run [옵션] 이미지이름
    
    docker run -d --name 컨테이너이름 -p 8090:8090 이미지이름

     

    '-d' 명령어로 백그라운드에서 컨테이너 실행 (터미널을 종료해도 컨테이너 실행 가능)

    '-p' 명령어로 호스트의 특정 포트와 컨테이너 포트를 매핑. 왼쪽에 있는 포트가 호스트 포트, 오른쪽에 있는 포트가 컨테이너 포트로

    외부에서 호스트의 지정된 포트로 접근하면 컨테이너의 지정된 포트로 연결

     

    • 현재 실행중인 컨테이너 목록 확인
    docker ps

     

     

    이미지와 컨테이너 관계

    이미지는 애플리케이션을 실행하기 위한 준비물로 특정 버전의 애플리케이션과 필요한 모든 것들을 포함

    컨테이너는 이미지의 실제 실행 가능한 인스턴스(메모리 상에 실행되고있는 상태)로 이미지를 실행하면 컨테이너가 생성되고 실행

     

    컨테이너 내에서 변경해 저장한 내용은 해당 컨테이너의 최상단 레이어에 저장되어 이미지 레이어엔 영향을 주지 않는다.

    이를 통해 이미지를 실행하여 컨테이너를 생성하면 해당 이미지 파일 시스템 레이어가 읽기 / 쓰기 가능한 상태로 컨테이너에 로드되고

    컨테이너가 실행중에 파일을 수정하거나 데이터를 저장하면 이 변경사항은 컨테이너의 최상단 레이어의 저장되어

    이미지의 기존 레이어엔 영향을 주지 않고 해당 컨테이너에서만 유지된다.

     

     

    댓글