애플리케이션 개발, 배포, 실행을 위한 플랫폼
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보다 훨씬 가벼운 컨테이너 기술을 사용하여 시스템 자원 소모가 적고, 시작 속도가 빠르다
- 확장성: 필요에 따라 동일한 이미지를 사용하여 여러 컨테이너를 쉽게 생성하고 확장할 수 있다