EKS – Docker 개요

애플리케이션 개발, 배포, 실행을 위한 플랫폼

Docker는 애플리케이션을 개발, 배포, 실행하는 과정을 획기적으로 단순화하는 오픈소스 플랫폼으로 특히 배포와 실행에 있어 탁월한 강점을 가진다

Docker의 등장 배경

환경 설정의 복잡성 해결 – Java
  • 기존에는 Java 애플리케이션(.jar)을 실행하려면, 해당 시스템의 정확한 버전의 Java(JRE / JDK)가 설치되어 있어야 했다. 예를 들어 Java 17로 개발된 .jar을 Java 11이 설치된 시스템에서 실행할 수 없었다. 이는 개발자 간 코드 공유 시 환경 설정 문제로 이어져 많은 불편함을 초래했다. Docker는 이러한 환경 설정 종속성 문제를 해결하기 위해 등장했다

Docker 이미지와 컨테이너 – 핵심 개념

Docker 이미지 (Image)

Docker 이미지는 특정 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 불변의 패키지이다. 애플리케이션 코드, 런타임(예: Java 17), 시스템 도구, 라이브러리, 환경 설정 등 모든 종속성을 하나의 “압축 파일” 형태로 묶어놓은 것이다

  • 완전한 실행 압축 파일: 이미지는 그 자체로 완전하며, 추가적인 환경 설정 없이 어디서든 애플리케이션을 실행할 수 있도록 설계되었다
  • 재사용성: 한번 만들어진 이미지는 여러 환경에서 동일하게 사용될 수 있다

Docker 컨테이너 (Container)

Docker 컨테이너는 Docker 이미지를 실행하기 위한 경량의 독립적인 실행 환경이다. 이미지를 기반으로 생성되며, 애플리케이션이 격리된 환경에서 실행될 수 있도록 가상화 기술을 제공한다

  • 가상화된 경량 PC: 컨테이너는 기존의 VirtualBox나 VMware와 같은 가상 머신(VM)보다 훨씬 가볍고 빠르게 동작하는 가상화 기술을 사용한다. 주로 Alpine Linux와 같은 경량 리눅스 운영체제를 기반으로 하여 시스템 부하를 최소화한다
  • 격리된 환경: 각 컨테이너는 호스트 OS와 격리되어 독립적으로 실행된다. 따라서 컨테이너 간 또는 컨테이너와 호스트 OS 간의 충돌을 방지한다
  • 일회성 실행 환경: 컨테이너는 실행 후 제거될 수 있으며, 필요한 경우 언제든지 이미지로부터 새로운 컨테이너를 생성할 수 있다

Docker 이미지 생성 및 활용

Docker Hub: 이미지 저장소

Docker Hub는 다양한 도커 이미지를 공유하고 찾을 수 있는 클라우드 기반 저장소이다. Nginx, MySQL과 같은 유명한 프로그램의 공식 이미지는 물론, 사용자들이 직접 만든 이미지도 업로드하고 다운로드할 수 있다

  • docker pull [이미지명]:[버전]: Docker Hub에서 이미지를 다운로드하는 명령어이다. 버전 정보가 없으면 최신 버전을 다운로드 한다
    • 예: docker pull nginx:1.12 또는 docker pull mysql
  • docker images: 로컬에 다운로드된 이미지 목록을 확인할 수 있다

Docker 이미지 직접 만들기

개발자는 Dockerfile이라는 스크립트를 작성하여 자신의 애플리케이션에 특화된 Docker 이미지를 직접 만들 수 있다

Docker 컨테이너 실행 및 관리

docker run: 컨테이너 실행 명령어

docker run 명령어는 특정 Docker 이미지를 기반으로 컨테이너를 생성하고 실행한다

  • docker run [옵션] [이미지명]
    • -d (detached mode): 컨테이너를 백그라운드에서 실행한다. 이 옵션이 없으면 터미널을 닫거나 명령어를 종료하면 컨테이너도 함께 종료된다. 배포 환경에서는 필수적으로 사용된다
    • -p [외부 포트]:[내부 포트] (port mapping): 호스트 시스템의 포트와 컨테이너 내부의 포트를 연결(매핑)한다
      • 외부 포트: 호스트 시스템에서 컨테이너에 접근할 때 사용할 포트이다 (예: 8080)
      • 내부 포트: 컨테이너 내부에서 애플리케이션이 실제 사용하는 포트이다 (예: Nginx의 기본 포트 80, Spring Boot의 기본 포트 8080)
      • 필수: 이 포트 매핑 없이는 호스트 시스템에서 컨테이너 내부의 애플리케이션에 접근할 수 없다. 컨테이너는 격리된 환경이므로 외부에서 직접 접근이 불가능하기 때문이다
    • 예시: docker -run -d -p 8080:80 nginx
      • Nginx 이미지를 사용하여 컨테이너를 백그라운드에서 실행한다
      • 호스트의 8080번 포트로 들어오는 요청을 컨테이너 내부의 Nginx 80번 포트로 전달한다
      • 웹 브라우저에서 localhost:8080으로 접속하면 컨테이너 내부의 Nginx 웹 서버에 접근할 수 있다

컨테이너 관리 명령어

  • docker ps: 현재 실행 중인 컨테이너 목록을 확인할 수 있다
  • docker –version: Docker 클라이언트 버전을 확인한다
  • docker stop [컨테이너 ID 또는 이름]: 실행 중인 컨테이너를 중지한다
  • docker rm [컨테이너 ID 또는 이름]: 중지된 컨테이너를 삭제한다
  • docker exec -it [컨테이너 ID 또는 이름] /bin/bash: 실행 중인 컨테이너 내부로 접속하여 터미널 명령어를 실행할 수 있다

Docker의 주요 이점

  • 배포 용이성: 애플리케이션과 모든 환경 설정을 이미지 하나로 패키징하여, 어떤 환경(개발 PC, 테스트 서버, 클라우드 서버 등)에서도 일관된 방식으로 쉽게 배포하고 실행할 수 있다
  • 환경 일관성: “내 컴퓨터에서는 되는데, 서버에서는 안 됩니다”와 같은 환경 불일치 문제를 근본적으로 해결한다
  • 격리성: 각 애플리케이션이 독립적인 컨테이너에서 실행되므로, 서로 영향을 주지 않고 안정적으로 동작한다
  • 경량화: 기본 VM보다 훨씬 가벼운 컨테이너 기술을 사용하여 시스템 자원 소모가 적고, 시작 속도가 빠르다
  • 확장성: 필요에 따라 동일한 이미지를 사용하여 여러 컨테이너를 쉽게 생성하고 확장할 수 있다

출처 – eks를 활용한 spring 운영서버 배포(feat. devops의 모든것)