Accelerate how you build, share, and run applications
도커는 개발자가 지루한 환경 구성이나 관리 없이 어디서나 애플리케이션을 구축, 공유, 실행 및 검증할 수 있도록 지원합니다. -Docker 공식사이트의 설명 what is docker?
https://www.docker.com/#build
즉 Docker는 애플리케이션을 컨테이너라는 가벼운 가상 환경에서 실행할 수 있도록 도와주는 플랫폼이다. 이 컨테이너는 애플리케이션이 실행되기 위한 모든 종속성(라이브러리, 설정 파일, 코드 등)을 하나의 패키지로 묶어주는 역할을 하며, 이를 통해 어떤 환경에서도 일관된 방식으로 애플리케이션을 실행이 가능하게 만든다.
주요 개념으로는
이미지(Images)
Docker 이미지란 애플리케이션과 그 애플리케이션이 실행되기 위한 모든 것(코드, 런타임, 라이브러리, 환경 변수 등)을 포함한 탬플릿이다. 이 이미지를 기반으로 컨테이너 생성이 가능하다.
컨테이너(Container)
컨테이너는 이미지를 실행한 상태로, 애플리케이션이 독립된 환경에서 동작하는 가상하된 공간이다. 여러 컨터이너를 동시에 실행이 가능하고, 서로 독립적으로 동작하면서 필요한 리소스를 공유가 가능하다.
Dockerfile
Docker 이미지를 빌드하기 위한 명령어들을 나열한 텍스트 파일이다. 예를 들어, 어떤 OS를 사용할지, 어떤 프로그램을 설치할지 등을 명시할 수 있다.
레지스트리(Registry)
이미지를 저장하고 공유하는 공간이다. Docker Hub가 대표적인 공개 레지스트리이며, 개인이나 조직별로 레지스트리를 구축이 가능하다.
Docker의 아키텍처
Docker는 클라이언트-서버 아키텍처를 기반으로 한다.
주요구성
Docker Daemon (dockerd):
Docker 엔진의 핵심 부분으로, 컨테이너와 이미지를 관리합니다. Docker Daemon은 시스템에서 실행되며, API 요청을 수신하고, 컨테이너를 생성, 시작, 정지하는 등의 작업을 수행합니다.
Docker CLI (Command Line Interface):
사용자가 Docker Daemon과 상호작용하기 위한 명령줄 도구입니다. 사용자는 이 CLI를 통해 이미지 생성, 컨테이너 실행 등의 명령을 실행할 수 있습니다.
Docker Registry:
Docker 이미지의 저장소입니다. Docker Hub는 기본적으로 제공되는 공개 레지스트리이며, 개인 레지스트리를 구축할 수도 있습니다. 레지스트리에서 이미지를 다운로드하거나 업로드할 수 있습니다.
Docker의 주요 구성 요소
이미지 (Image)
Immutable:
• 이미지는 변경할 수 없는 불변의 객체입니다. 한 번 빌드된 이미지는 어떤 환경에서도 동일하게 동작한다.
계층화 (Layering):
• Docker 이미지는 여러 개의 계층으로 구성된다. 각 계층은 이전 계층의 변경 사항을 포함하고 있으며, 변경이 없으면 공유할 수 있다. 이로 인해 저장공간이 절약되고, 업데이트가 용이해진다.
컨테이너 (Container)
경량화:
• 컨테이너는 필요한 라이브러리와 설정만 포함하고 있어 리소스를 최소화한다.
격리:
• 각 컨테이너는 독립적인 환경에서 실행되므로 서로의 영향을 받지 않는다. 여러 컨테이너가 동일한 호스트에서 실행될 수 있지만, 각 컨테이너는 독립적으로 동작한다.
Dockerfile
• 스크립트 언어:
• Dockerfile은 Docker 이미지를 만들기 위한 명령어를 포함하는 텍스트 파일이다. FROM, RUN, COPY, CMD와 같은 명령어를 사용하여 이미지의 구성 요소를 정의한다.
#!/bin/bash
# base 이미지 설정
FROM openjdk:17-jdk-slim
# jar 파일을 컨테이너 내부에 복사
COPY build/libs/*.jar app.jar
# 외부 호스트 8080 포트로 노출
EXPOSE 8080
# 실행 명령어
CMD ["java", "-jar", "app.jar"]
Docker의 작동 방식
1. 이미지 빌드:
• Dockerfile을 기반으로 이미지를 생성한다. 이 과정에서 모든 종속성과 설정이 포함된다.
2. 컨테이너 실행:
• 생성된 이미지를 사용하여 컨테이너를 시작합니다. 이때 컨테이너가 실행되면서 애플리케이션이 작동한다.
3. 컨테이너 관리:
• Docker는 여러 컨테이너를 생성하고 관리할 수 있는 명령어를 제공한다. 예를 들어, docker ps로 현재 실행 중인 컨테이너 목록을 확인할 수 있다.
EX) docker hub에서 redis이미지 다운받기
docker pull redis -> redis 이미지 받기
docker images -> 다운 받은 도커 이미지 목록 확인하기
docker run -it -d --rm -p 6379:6379 redis:6.2
docker run : 컨테이너를 실행시켜라
-it : 실행중인 컨테이너의 터미널 접근을 가능하게 해라
-d : 컨테이너를 백그라운드에서 실행시켜라
--rm : 컨테이너가 종료되면 시스템에서 컨테이너를 자동으로 제거해라
-p : 컨테이너 포트를 6379로 지정해라
호스트_포트:컨테이너_포트
ex) docker run -p 8080:8080 spring-app
ex) docker run -p 8080:8080 spring-app
- 8080:8080에서 앞쪽의 8080은 호스트 시스템의 포트, 뒤쪽의 8080은 컨테이너 내부의 포트이다.
- 호스트의 포트 8080으로 들어오는 요청은 컨테이너 내부의 포트 8080으로 전달된다.
- 외부에서 http://localhost:8080으로 접근하면 컨테이너 내에서 실행 중인 Spring Boot 애플리케이션이 응답한다.
ex ) docker run -p 9090:8080 spring-app
- 여기서 9090은 호스트 시스템의 포트이고, 8080은 컨테이너 내부의 포트이다.
- 이제 외부에서 http://localhost:9090으로 접근하면, 여전히 컨테이너 내부의 8080 포트에서 실행되는 애플리케이션이 응답하게 된다.
docker ps -> 실행중인 도커 컨테이너 정보를 보여줘라
docker exec -it {실행중인 컨테이너 ID} redis-cli -p 6379:6379 -> 컨테이너 ID에 터미널로
접근하여 특정 명령어를 수행해라
Docker의 장점
개발 환경 통일:
• Docker를 사용하면 개발자와 운영팀 간에 일관된 환경을 유지할 수 있습니다. “내 컴퓨터에서는 잘 되는데”라는 문제를 줄일 수 있다.
CI/CD 통합:
• Docker는 지속적 통합(CI) 및 지속적 배포(CD) 도구와 잘 통합되어 자동화된 배포 파이프라인을 구축하는 데 유용하다.
마이크로서비스 아키텍처 지원:
• Docker는 마이크로서비스 아키텍처를 쉽게 구현할 수 있도록 도와줍니다. 각 서비스는 독립적인 컨테이너로 실행되며, 필요에 따라 개별적으로 확장할 수 있다.
상태 관리:
• Docker Compose를 사용하면 여러 컨테이너를 정의하고 관리하는 YAML 파일을 작성하여 복잡한 애플리케이션 환경을 쉽게 구축할 수 있다.
실제 활용 사례
웹 애플리케이션 배포:
• 여러 언어와 프레임워크를 사용하는 애플리케이션을 쉽게 배포할 수 있다.
데이터베이스 컨테이너:
• MySQL, PostgreSQL 등 데이터베이스를 컨테이너로 실행하여 개발 및 테스트 환경을 구축할 수 있다.
테스트 환경:
• 일관된 테스트 환경을 제공하여 자동화된 테스트를 쉽게 실행할 수 있다.
요약하자면
Docker 이미지
Docker 이미지는 컨테이너를 생성하기 위한 템플릿으로, 애플리케이션과 실행에 필요한 모든 종속성을 포함하는 불변의 파일입니다. 여러 계층으로 구성되며, 이미지에서 컨테이너를 생성할 수 있다.
Docker 컨테이너
Docker 컨테이너는 이미지를 기반으로 실행된 독립된 환경이다. 컨테이너는 가상 머신과 달리 가볍고, 같은 호스트에서 여러 컨테이너를 동시에 실행할 수 있습니다. 컨테이너는 애플리케이션을 독립적으로 실행하기 위한 일종의 격리된 공간이다.
Dockerfile
Dockerfile은 Docker 이미지를 생성하기 위한 설정 파일입니다. 여러 명령어를 사용하여 이미지 구성 요소(베이스 이미지, 라이브러리 설치, 코드 복사 등)를 정의하며, 이를 통해 이미지를 자동으로 빌드할 수 있다.
docker-compose
docker-compose는 여러 컨테이너를 정의하고 관리할 수 있는 도구로, YAML 파일을 사용해 애플리케이션의 다양한 서비스(데이터베이스, 웹 서버 등)를 컨테이너로 구성하고 쉽게 실행할 수 있다. 이를 통해 복잡한 애플리케이션을 간편하게 실행하고 관리할 수 있다.