컨테이너란 무엇인가요?

컨테이너란 무엇인가요?

컨테이너는 애플리케이션의 각 구성 요소를 위한 격리된 프로세스예요. 자체 포함(self-contained), 격리(isolated), 독립(independent), 이식 가능(portable)한 특성을 가져, 어디서나 동일하게 실행돼요. 이 가이드에서 컨테이너의 개념과 Docker Desktop GUI로 컨테이너를 실행하는 방법을 배워요.

출처: 문서

본문

설명

세 가지 주요 구성 요소 — React 프론트엔드, Python API, PostgreSQL 데이터베이스 — 로 이루어진 멋진 웹 앱을 개발한다고 상상해 봐요. 이 프로젝트를 작업하려면 Node, Python, PostgreSQL을 설치해야 해요.

팀의 다른 개발자와 같은 버전을 갖추고 있는지 어떻게 확인할까요? CI/CD 시스템과는요? 프로덕션에서 사용하는 것과는요?

앱이 필요로 하는 Python(또는 Node, 데이터베이스) 버전이 머신에 이미 설치된 것에 영향을 받지 않도록 하려면 어떻게 해야 할까요? 잠재적 충돌은 어떻게 관리할까요?

바로 컨테이너가 등장해요!

컨테이너가 무엇일까요? 간단히 말하면, 컨테이너는 앱의 각 구성 요소를 위한 격리된 프로세스예요. 각 구성 요소 — 프론트엔드 React 앱, Python API 엔진, 데이터베이스 — 는 자신만의 격리된 환경에서, 머신의 다른 모든 것과 완전히 격리된 채 실행돼요.

컨테이너를 훌륭하게 만드는 특성들이 이래요. 컨테이너는:

  • 자체 포함 (Self-contained): 각 컨테이너는 호스트 머신에 사전 설치된 의존성에 의존하지 않고 기능하는 데 필요한 모든 것을 갖추고 있어요.
  • 격리 (Isolated): 컨테이너는 격리된 환경에서 실행되므로 호스트와 다른 컨테이너에 미치는 영향이 최소화되어 애플리케이션의 보안이 향상돼요.
  • 독립 (Independent): 각 컨테이너는 독립적으로 관리돼요. 하나의 컨테이너를 삭제해도 다른 컨테이너에는 영향을 주지 않아요.
  • 이식 가능 (Portable): 컨테이너는 어디서나 실행될 수 있어요! 개발 머신에서 실행되는 컨테이너는 데이터 센터나 클라우드 어디에서도 동일하게 동작해요!

컨테이너 대 가상 머신 (VM)

너무 깊이 들어가지 않고 말하면, VM은 자체 커널, 하드웨어 드라이버, 프로그램, 애플리케이션을 가진 완전한 운영 체제예요. 단일 애플리케이션을 격리하기 위해 VM을 띄우는 건 오버헤드가 큽니다.

컨테이너는 실행에 필요한 모든 파일을 가진 단순한 격리된 프로세스예요. 여러 컨테이너를 실행하면 모두 같은 커널을 공유하므로, 더 적은 인프라 위에서 더 많은 애플리케이션을 실행할 수 있어요.

VM과 컨테이너 함께 사용하기

컨테이너와 VM이 함께 사용되는 걸 꽤 자주 볼 수 있어요. 예를 들어 클라우드 환경에서 프로비저닝된 머신은 보통 VM이에요. 하지만 하나의 애플리케이션을 실행하기 위해 하나의 머신을 프로비저닝하는 대신, 컨테이너 런타임이 있는 VM에서 여러 컨테이너화된 애플리케이션을 실행할 수 있어요. 이렇게 하면 리소스 활용도가 높아지고 비용이 절감돼요.

직접 해보기

이 실습에서는 Docker Desktop GUI를 사용해 Docker 컨테이너를 실행하는 방법을 볼게요.

다음 지침에 따라 컨테이너를 실행해요.

  • Docker Desktop을 열고 상단 내비게이션 바의 Search 필드를 선택해요.
  • 검색 입력에 welcome-to-docker를 입력하고 Pull 버튼을 선택해요.
  • 이미지가 성공적으로 풀리면 Run 버튼을 선택해요.
  • Optional settings를 펼쳐요.
  • Container name에 welcome-to-docker를 지정해요.
  • Host port에 8080을 지정해요.
  • Run을 선택해 컨테이너를 시작해요.

축하해요! 방금 첫 컨테이너를 실행했어요! 🎉

컨테이너 보기

Docker Desktop 대시보드의 Containers 뷰로 가면 모든 컨테이너를 볼 수 있어요.

이 컨테이너는 간단한 웹사이트를 표시하는 웹 서버를 실행해요. 더 복잡한 프로젝트를 다룰 때는 서로 다른 부분을 서로 다른 컨테이너에서 실행하게 돼요. 예를 들어 프론트엔드, 백엔드, 데이터베이스를 각각 다른 컨테이너로 실행할 수 있어요.

프론트엔드 접근

컨테이너를 실행할 때 컨테이너의 포트 중 하나를 머신에 노출시켰어요. 컨테이너의 격리된 환경을 통해 연결할 수 있게 해 주는 구성을 만든다고 생각하면 돼요.

이 컨테이너의 경우 프론트엔드는 포트 8080에서 접근할 수 있어요. 웹사이트를 열려면 컨테이너의 Port(s) 열에서 링크를 선택하거나 브라우저에서 http://localhost:8080 을 방문해요.

컨테이너 탐색

Docker Desktop은 컨테이너의 다양한 측면을 탐색하고 상호작용할 수 있게 해 줘요. 직접 해보세요.

  • Docker Desktop 대시보드의 Containers 뷰로 이동해요.
  • 컨테이너를 선택해요.
  • Files 탭을 선택해 컨테이너의 격리된 파일 시스템을 탐색해요.

컨테이너 중지

docker/welcome-to-docker 컨테이너는 중지할 때까지 계속 실행돼요.

  • Docker Desktop 대시보드의 Containers 뷰로 이동해요.
  • 중지하려는 컨테이너를 찾아요.
  • Actions 열에서 Stop 동작을 선택해요.

CLI로 컨테이너를 실행하려면 다음 지침을 따라요.

  • CLI 터미널을 열고 docker run 명령으로 컨테이너를 시작해요.
    $ docker run -d -p 8080:80 docker/welcome-to-docker
    
    이 명령의 출력은 전체 컨테이너 ID예요.
  • 축하해요! 첫 컨테이너를 실행했어요! 🎉

실행 중인 컨테이너 보기

docker ps 명령으로 컨테이너가 실행 중인지 확인할 수 있어요.

docker ps

다음과 같은 출력이 보여요.

CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS                      NAMES
 a1f7a4bb3a27   docker/welcome-to-docker   "/docker-entrypoint.…"   11 seconds ago   Up 11 seconds   0.0.0.0:8080->80/tcp       gracious_keldysh

이 컨테이너는 간단한 웹사이트를 표시하는 웹 서버를 실행해요. 더 복잡한 프로젝트를 다룰 때는 서로 다른 부분을 서로 다른 컨테이너에서 실행하게 돼요. 예를 들어 frontend, backend, database를 각각 다른 컨테이너로요.

Tip docker ps 명령은 실행 중인 컨테이너만 보여줘요. 중지된 컨테이너를 보려면 -a 플래그를 추가해 모든 컨테이너를 나열하세요: docker ps -a

프론트엔드 접근

컨테이너를 실행할 때 컨테이너의 포트 중 하나를 머신에 노출시켰어요. 컨테이너의 격리된 환경을 통해 연결할 수 있게 해 주는 구성을 만든다고 생각하면 돼요.

이 컨테이너의 경우 프론트엔드는 포트 8080에서 접근할 수 있어요. 웹사이트를 열려면 컨테이너의 Port(s) 열에서 링크를 선택하거나 브라우저에서 http://localhost:8080 을 방문해요.

컨테이너 중지

docker/welcome-to-docker 컨테이너는 중지할 때까지 계속 실행돼요. docker stop 명령으로 컨테이너를 중지할 수 있어요.

  • docker ps를 실행해 컨테이너의 ID를 얻어요.
  • 컨테이너 ID나 이름을 docker stop 명령에 제공해요.
    docker stop
    
  • Tip ID로 컨테이너를 참조할 때 전체 ID를 제공할 필요는 없어요. 고유하게 만드는 데 충분한 만큼만 제공하면 돼요. 예를 들어 이전 컨테이너는 다음 명령으로 중지할 수 있어요.

    docker stop a1f
    

추가 자료

컨테이너에 대한 추가 지침을 제공하는 링크는 다음과 같아요.

다음 단계

Docker 컨테이너의 기본을 배웠으니, 이제 Docker 이미지에 대해 배울 차례예요. 이미지란 무엇인가요?

더 알아보기 (Learn more)