컨테이터 (Container)

ww_ung·2025년 3월 3일

SKALA

목록 보기
6/25
post-thumbnail

저번 시간에는 클라우드 아키텍처와 MSA에 대해 알아보는 시간을 가졌다.
이번 시간에는 좀 더 세부적인 내용인 컨테이너(Container)에 대해 알아볼 것이다.

컨테이너란 무엇일까?

일상생활에서의 컨테이너는 운송에 사용될 목적으로 설계해 제조되는 표준화된 선적용기이다. 컨테이너는 원하는 물건을 목적지로 그대로 운반해주는 특징이 있는데 해당 특징을 그대로 클라우드 아키텍처에 적용하면 된다.

따라서, 클라우드에서의 컨테이너는
클라우드 환경에서 애플리케이션을 효율적으로 배포하고 확장할 수 있도록 지원하는 가상화 기술
인 것이다.
이에 따라 우리는 애플리케이션과 그 실행에 필요한 모든 환경(라이브러리, 종속성 등)을 하나의 단위로 패키징하여 어디서든 동일하게 실행할 수 있게 된다. 당연히 이식성이 뛰어나고, 경량성이나 확장성에서 장점을 가진다.

VM vs 컨테이너

vm은 물리적 컴퓨터(호스트) 위에서 소프트웨어적으로 독립적인 운영체제(OS)를 실행할 수 있도록 해주는 가상화 기술로 이 또한 애플리케이션을 격리하여 실행하는 기술이다.
하지만 컨테이너와는 목적과 구성요소적으로 차이점이 있다.

VM은 각각의 VM마다 독립적인 OS를 구성하게됨으로 Host OS가 Microsoft이더라도 각각의 VM에서 독립적인 OS가 구성이 가능하다(Mac, Linux) 이에 따라 무겁고, 높은 하드웨어 자원이 사용된다. 무겁기 때문에 속도 또한 느리고 배포나 확장도 상대적으로 느리다.
하이퍼바이저 라는 소프트웨어에 가상 서버를 만들어달라고 요청을 보내고, 요청을 받은 하이퍼바이저는 새로운 가상 서버를 생성하고 물리서버가 가진 컴퓨팅 리소스(CPU,메모리,네트워크 등)를 각 가상 서버에 할당해 준다.

반면에 Container는 호스트 OS를 공유하여 운영된다. 따라서 같은 OS를 사용하게 됨으로, 가볍고 낮은 자원을 사용한다. 가볍기 때문에 빠른 속도를 보여주고, 빠른 배포와 확장성이 장점이라고 할 수 있다.

따라서 거대한 이미지사이즈와 느린 시작시간 그리고 VM간의 환경 불일치라는 문제를 환경을 일치시키기 쉽고 OS부팅이 없기에 부팅의 최소화를 통한 빠른 시간과 레이어 개념으로 이미지의 추가/삭제를 통해 VM의 문제를 해결하게 된다.

베어메탈 서버?
원래 하드웨어 상에 어떤 소프트웨어도 설치되어 있는 상태를 (Bare Metal Server)라고 한다.
즉, 가상화를 위한 하이퍼바이저 OS없이 물리 서버를 그대로 제공하는 것이다.
베어메탈 머신?
컨테이너 내부의 비어있는 상태

컨테이너 이미지

위에서 애플리케이션과 그 실행에 필요한 모든 환경(라이브러리, 종속성 등)을 하나의 단위로 패키징하여 어디서든 동일하게 실행할 수 있게 한다고 하였다. 그렇다면 이런 패키징은 어떻게 하는 것일까?

컨테이너는 실행될 때 컨테이너 이미지를 기반으로 생성이 된다.
여기서 이미지는 기본적으로 레이어 구조를 가지며, 여러개의 읽기 전용(READ-ONLY) 계층이 겹쳐진 형태를 의미한다. 우리는 이 이미지를 Docker를 통해 패키징을 진행한다. 도커를 이용해 도커파일(이미지)를 생성하고 해당 이미지를 Docker Hub라는 저장소에서 이미지를 저장하고 서로 공유하거나 개인저장하여 컨테이너 이미지를 빌드하고 실행한다.

FROM python:3.10-alpine
RUN apk add --no-cache bash curl gcc musl-dev linux-headers jq
# FastAPI 및 기타 라이브러리 설치
RUN pip install fastapi uvicorn psutil python-multipart
VOLUME ["/mycode"]
COPY mycode.py /mycode/mycode.py
CMD ["sh", "-c", "echo 'start server' && sleep infinity"]

예를 들면 이런 도커파일이 구성되어있다고 가정하자.

FROM python:3.10-alpine -> 베이스 이미지의 설정
RUN apk -> 패키지 설치
RUN pip install fastapi -> FastAPI 및 기타 라이브러리 설치
VOLUME -> 볼륨 마운트 설정(컨테이너가 종료되어도 데이터가 유지될수있게 경로 설정)
COPY -> 로컬의 mycode.py파일을 컨테이너 내부로 복사(이를 통해 컨테이너 내부에서 실행가능)
CMD -> 컨테이너 실행 시 수행할 명령어 지정(여기서는 서버실행을 하지않고 컨테이너를 계속 유지)

이런 식으로 자신의 입맛대로 환경을 구성하고 애플리케이션을 실행시킬 수 있다.

tar(Tape ARchiver)

tar는 여러개의 파일과 디렉토리를 하나의 파일로 묶거나 풀때 사용하는 명령어이자 파일이다.
우리는 도커에서 이미지의 저장, 배포, 백업, 복사와 같은 기능을 효율적으로 처리하기 위해 tar를 사용한다.
특정 이미지를 로컬에서 .tar파일로 저장한 뒤, 다른 서버로 전송하여 이미지를 불러올 수 도 있고,
이미지를 백업하고 나중에 이를 복원하여 동일한 환경을 복구할 수 있다. 불필요한 파일을 제외하고 필요한 것만 패키징하여 최적화를 하여 효율적으로 관리하고 이동할 수 있게 된다.

$ tar cvf image-test.tar /config/workspace/basic /config/workspace/cloud

이렇게 basic 폴더와 cloud 폴더를 image-test.tar로 묶을 수 있고,

sudo docker save container-linux:1.0 –o linux.tar

cvf = .tar로 묶기
tvf = .tar archive 확인하기
xvf = .tar 이미지 풀기

이미지를 .tar 파일로 저장할 수 도 있다.

Docker Networking

크게 2가지 경우를 생각해 볼 수 있는데
Docker컨테이너끼리의 통신과 외부 네트워크와의 통신으로 나눠볼 수 있다.

먼저 Docker 컨테이너간의 통신은
링크 기능을 사용한 통신으로 동일 호스트내 bridge docker0에 접속한 컨테이너간 통신을 진행한다.

그리고 외부와의 통신은
먼저 포트 포워딩을 설정해야 한다. 이를 통해 외부에서 컨테이너에 접근 할 수 있기 때문이다.
그러려면 호스트 시스템과 컨테이너간의 포트 연결을 시켜주는 포트 매핑을 진행해줘야 한다.

docker run -p 8080:80 my_image

위 명령어를 통해 호스트의 8080번 포트는 컨테이너의 80번 포트로 연결이 된다.
즉 외부에서 local:8080으로 접근하면, 해당 요청이 컨테이너의 80포트로 전달이 된다.

conmon(Container Monitor)

컨테이너 런타임에서 컨테이너의 표준 입력/출력/오류를 처리하고, 컨테이너의 상태를 모니터링하는 도구이다.
백그라운드에서 실행되며, 컨테이너의 표준 입출력(log)을 관리하게 되는데,
Podman과 같은 도구에서 자동으로 컨테이너의 PID 1을 대체하여 실행되며,
컨테이너 관리에 필수적인 요소로 사용된다.
컨테이너의 출력과 오류 등을 호스트 터미널로 출력하거나 로그파일로 저장이 되는데

이런 방식으로 출력이 된다.
이를 통해 컨테이너 실행 중 발생한 메시지를 호스트 시스템에서 모니터링 할 수 있게 된다.

컨테이너 흐름

컨테이너 기반 개발을 진행하면서 크게 6단계로 우리는 프로그램을 개발하고 실행할 수 있다.

  1. 프로그램 개발
  • 애플리케이션의 핵심 기능을 개발하는 단계
  • 로컬 개발환경에서 코드를 작성하고 테스트 및 디버깅을 수행한다.
  1. 로컬 실행 단위 및 단위 테스트
  • 프로그램의 각 기능을 독립적으로 실행하고 검증하는 단계
  • 단위 테스트(Unit Test)는 코드가 의도대로 동작하는지 확인한다
  1. Dockerfile 작성
  • 애플리케이션을 컨테이너화 하기 위한 단계
  1. 이미지 빌드
  • 작성한 Dockerfile을 기반으로 컨테이너 이미지를 빌드하는 단계
  • 도커가 도커파일을 읽어들여 해당 이미지 파일을 생성
  • 실행 가능한 애플리케이션 이미지 생성
  1. 이미지 배포
  • 이미지가 로컬에서 빌드되면, 이를 클라우드 환경으로 배포하는 단계
  • 보통 Docker Hub, AWS ECR에 업로드
  • 이미지를 배포하여 다른 환경에서도 실행할 수 있도록 해주는 단계이다.
  1. 이미지 실행
  • 배포된 이미지를 실행하는 단계
  • 컨테이너는 해당 이미지를 기반으로 인스턴스화되어 실행된다.
  1. 프로그램 개발
  • 다시 프로그램 개발 단게로 돌아온다
  • 이는 또다시 컨테이너에서 애플리케이션을 실행하고, 실행중 발견된 문제를 해결하거나 새로운 기능을 개발하는 단계이기 때문이다.

0개의 댓글