[Infra] Docker란?(feat. Docker, Docker File, Docker Compose)

1. Docker란?

Docker는 컨테이너 기술을 활용해 애플리케이션을 신속하고 일관되게 배포할 수 있는 오픈소스 플랫폼이다. 애플리케이션과 해당 애플리케이션이 동작하는 데 필요한 라이브러리, 환경 설정, 의존성 등을 하나의 컨테이너에 패키징하여 어디서든 동일하게 실행할 수 있도록 한다.

 


 

2. Docker가 필요한 이유

(1) 환경 차이에 의한 오류 방지

  • "내 로컬에서는 잘 되는데, 서버에서는 안 돼요" 문제를 해결할 수 있음
  • 애플리케이션 실행에 필요한 환경을 컨테이너에 통째로 담아 어디서든 같은 환경을 재현할 수 있음

(2) 배포 및 확장 용이

  • 컨테이너는 애플리케이션을 빠르게 배포하고, 필요할 때 쉽게 확장할 수 있음
  • 스케일 아웃(Scale-out) 방식으로 동일한 컨테이너를 여러 개 띄워 트래픽을 분산 처리함

(3) 시스템 자원 절약

  • 컨테이너는 가상 머신과 달리 OS를 공유하므로 가볍고 빠르게 실행됨
  • 프로세스 단위로 동작하여 필요한 부분만 컨테이너화할 수 있음

(4) 일관된 개발 환경 유지

  • 개발 환경, 테스트 환경, 배포 환경이 모두 동일하므로 환경 불일치로 인한 문제가 줄어듦
  • 여러 명의 개발자가 동일한 컨테이너 환경에서 작업할 수 있음

 


 

3. Docker 작동 방식

 Docker는 코드를 실행하는 표준 방식을 제공하며 컨테이너를 위한 운영 체제이다. 가상 머신이 서버 하드웨어를 가상화하는 방식과 비슷하게(직접 관리해야 하는 필요성 제거) 컨테이너는 서버 운영 체제를 가상화한다. Docker는 각 서버에 설치되며 컨테이너를 구축, 시작 또는 중단하는 데 사용할 수 있는 간단한 명령을 제공한다.

 

Hypervisor : 단일 물리적 머신에서 여러 가상 머신을 실행하는데 사용할 수 있는 소프트웨어

 


 

4. Docker를 사용하기 위한 툴

(1) Docker CLI

  • Docker 명령어를 통해 컨테이너를 실행하고 관리하는 도구

 

(2) Docker Desktop

  • Docker 엔진, CLI, Docker Compose 등을 포함한 GUI 기반 도구

 

(3) Docker Hub

  • Docker 이미지를 저장하고 공유할 수 있는 공식 레지스트리
  • MySQL, Nginx 등 여러 오픈소스 애플리케이션 이미지를 쉽게 받아와 사용할 수 있음

 


 

 

5. Docker Container와 Image

(1) Docker Container

  • 이미지를 기반으로 실제 실행되는 인스턴스
  • 컨테이너는 독립적으로 실행되며, 애플리케이션의 동작 환경을 제공함
  • 가벼우며 빠르게 생성되고, 제거될 수 있음

 

(2) Docker Image

  • 컨테이너 실행에 필요한 모든 것을 포함하는 불변(Immutable)의 패키지
  • 애플리케이션, 라이브러리, 환경 설정 등을 담아 배포 및 실행의 표준이 됨
  • 이미지는 빌드되어 Docker Hub 등 레지스트리에 업로드하거나 로컬에서 보관됨

 

레지스트리 : 도커 이미지를 관리하는 일종의 저장소

 


 

6. Docker Hub

  • Docker 이미지를 공유하고 저장하는 클라우드 레지스트리 서비스
  • 공식 이미지를 통해 애플리케이션을 쉽게 설치하고 활용할 수 있음

7. Dockerfile이란?

  • Docker 이미지를 만들기 위한 스크립트 파일
  • 애플리케이션과 필요한 환경을 정의하여 이미지를 자동으로 생성함
  • 코드 한 줄 한 줄이 이미지 생성 과정으로 기록됨

 

Dockerfile 예시

# 1. 베이스 이미지 설정
FROM eclipse-temurin:17-jdk

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 의존성 캐싱을 위한 JAR 복사 및 빌드(gradle 사용)
COPY ./build/libs/*.jar app.jar

# 4. 컨테이너에서 실행할 명령어
CMD ["java", "-jar", "app.jar"]

# 5. 포트 개방
EXPOSE 8080

 

  • FROM : 기반이 되는 이미지 지정
  • COPY : 로컬 파일을 이미지에 복사
  • CMD : 컨테이너가 실행될 때 수행할 명령를 설정

 


 

8. Docker Compose란?

  • 여러 컨테이너를 동시에 관리하는 도구
  • WAS, DB 등 복수의 컨테이너를 하나의 파일에서 정의하고 동시에 실행할 수 있음
  • 컨테이너 간 네트워크, 볼륨 등의 설정을 쉽게 관리

 

docker-compose.yml 예시

version: '3.8'
services:
  db:
    image: mysql
    container_name: mysql-container
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: roomescape
    volumes:
      - ~/mysql-data:/var/lib/mysql
    ports:
      - "3307:3306"
    networks:
      - roomescape-network

  app:
    build: .
    container_name: roomescape-container
    ports:
      - "8081:8080"
    depends_on:
      - db
    networks:
      - roomescape-network

networks:
  roomescape-network:
    driver: bridge

 

  • services : 컨테이너 정의 목록
  • app : 애플리케이션 컨테이너 정의
  • db : 데이터베이스 컨테이너 정의
  • volumes : 데이터 영속화를 위한 볼륨 설정

 

참고 자료

https://tecoble.techcourse.co.kr/post/2022-09-20-docker-basic/

 

이론과 실습을 통해 이해하는 Docker 기초

본 포스팅은 도커에 대한 자세한 개념, 도커 기본 명령어, 컨테이너 실행 실습, 도커 컴포즈, 도커 이미지 빌드, 도커 허브에 이미지 배포 등 전반적인 도커 기초에 대한 내용을 다룬다. 도커 (Dock

tecoble.techcourse.co.kr

 

https://aws.amazon.com/ko/docker/

 

Docker란 무엇입니까? | AWS

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리,

aws.amazon.com

 

https://www.dnsstuff.com/what-is-hypervisor

 

What Is a Hypervisor? Hypervisor Meaning, Types, and Examples - DNSstuff

Hypervisors allow for effective management of the virtual machine environment. Read definitions, examples, and types of hypervisor software on DNSstuff!

www.dnsstuff.com