[Docker] 도커 이해하기

cup-wan·2025년 1월 26일
3

Docker

목록 보기
1/1
post-thumbnail

도커?

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly.

➡️ 도커는 애플리케이션을 컨테이너라는 단위로 패키징하고 실행할 수 있도록 해주는 오픈 소스 가상화 플랫폼

기존의 가상 머신(Virtual Machine)의 경우 OS를 통으로 올려야 했기 때문에 용량도 크고 실행 속도도 느리다는 단점이 존재함.
도커 컨테이너는 호스트 OS 위에서 필요한 라이브러리 및 실행 환경만 공유해 빠르고 가볍게 구동 가능

가상 머신 vs 컨테이너(도커)

  • 가상 머신
    • 하드웨어 위에 Host OS + Hypervisor (중간 관리자 역할) + 여러 Guest OS
    • 각 VM 환경이 완벽하게 격리되고 영향을 주지 않음
    • 용량과 성능 측면에서 무겁고 오버헤드가 많이 발생
  • 컨테이너 (도커)
    • Host OS 위에 컨테이너 단위로 애플리케이션과 필요한 라이브러리 및 종속성 패키징
    • Docker 컨테이너는 호스트 커널을 공유해 가볍고 빠르게 실행됨
    • 여러 컨테이너 실행 시 각 컨테이너는 격리되지만 공유 리소스를 사용해 높은 효율성 유지 가능

도커를 사용하는 이유

1. 이식성 (Portability)
: 개발 PC와 서버 환경이 달라도, 도커 이미지만 있으면 동일한 환경을 재현할 수 있음

2 확장성
: 필요하다면 빠르게 컨테이너 용량을 늘려 부하를 분산할 수 있음

3. 신속한 배포
: 컨테이너 실행 및 중지가 빨라 (VM 대비) 빌드-테스트-배포 사이클이 짧아짐

4. Docker Hub의 존재
: 컨테이너 이미지를 공유하고 배포하는 저장소, 타인의 이미지를 받아서 즉시 실행해 볼 수 있는 것 (필자의 MySQL 설치 방식)

+) 도커와 컨테이너

도커를 처음 접하면 컨테이너가 도커인가? 할 수 있지만 컨테이너 기술 중 하나가 도커인 것이지 둘이 같은 의미가 아니다.
도커 이전 Linux Containers (LXC) 등 다른 컨테이너 기반 가상화 기술이 존재했고 현재도 도커 외에도 Podman(Redhat), containerd, CRI-O 등 다양한 컨테이너 기술이 존재한다.
또한 도커 컨테이너가 어떻게 격리되어 동작되는지는 리눅스 Namespaces 와 cgroups를 기반으로 가상머신처럼 보이지만 사실은 단일 리눅스 커널 내의 격리된 프로세스라 이해할 수 있다.

아키텍쳐

“Docker uses a client-server architecture. The Docker client talks to the Docker daemon, which does the heavy lifting of building, running, and distributing your Docker containers. The Docker client and daemon can run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate using a REST API, over UNIX sockets or a network interface. Another Docker client is Docker Compose, that lets you work with applications consisting of a set of containers.”

도커는 클라이언트 - 서버(데몬) 아키텍쳐를 기본으로 한다. 데몬이 컨테이너 관리를 대신 해주기 때문에 클라이언트 명령만 알면 편리하게 컨테이너를 다룰 수 있다.

  • 도커 데몬 Docker Daemon

    • 백그라운드에서 동작, 실질적으로 컨테이너를 생성,중지,삭제하는 "서버 역할"을 맡음
    • docker run, docker build 등의 명령어를 입력하면 도커 클라이언트가 이 명령을 데몬에 전달하고 데몬이 이 일을 처리

  • 도커 클라이언트 Docker Client

    • 터미널에서 사용하는 docker 명령어나, GUI 기반 도커 관리 툴 모두 도커 클라이언트
    • 내부적으로는 Docker REST API를 통해 데몬과 통신

  • 도커 레지스트리 Docker Registries

    • 도커 이미지를 저장하는 역할 (레포지토리 느낌 싹)
    • Docker Hub가 대표적인 공개 레지스트리로 회사 내부망에서만 사용가능한 사설 레지스트리도 구 성 가능
    • 이미지를 매번 같은 환경으로 공유 및 배포하는 장점

  • 도커 객체 Docker Objects

    • 도커 사용 시 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 등의 객체를 만들고 사용함

    • 도커 파일 Docker File

      • 도커 이미지를 빌드하기 위한 텍스트 파일
      • 도커 이미지를 구성하는 명령어 + 설정
      • 도커 파일을 사용하면 반복적인 이미지 빌드 자동화 가능
    • 도커 이미지 Docker Image

      • 도커 컨테이너를 실행하는 데 필요한 파일과 설정을 포함하는 가볍고 독립적인 실행 가능한 패키지
      • 레지스트리에서 가져올 수 있고, 도커 파일을 사용해 빌드할 수 있음
    • 도커 컨테이너 Docker Container

      • 도커 이미지의 인스턴스. 격리된 환경에서 실행되며 운영체제 수준의 가상화 기술을 사용해 프로세스 격리

간단한 예제 코드

  1. 기본적인 자바 코드
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Docker with Java!");
    }
}
  1. 이 코드에 맞는 Dockerfile 생성
# (1) 사용할 베이스 이미지 지정 (OpenJDK 17)
FROM openjdk:17

# (2) 컨테이너 내부에서 작업 디렉토리 생성 및 설정
WORKDIR /app

# (3) 현재 디렉토리(호스트)의 Hello.java를 /app 디렉토리에 복사
COPY Hello.java .

# (4) 도커 이미지 빌드 시 컴파일 수행
RUN javac Hello.java

# (5) 컨테이너 실행 시 main 메서드를 가진 클래스 실행
CMD ["java", "Hello"]
  1. 도커 이미지 빌드 + 컨테이너 실행
# 현재 디렉토리에 있는 Dockerfile을 이용하여
# my-java-app 이라는 이름의 이미지를 빌드
docker build -t my-java-app .
docker run --rm my-java-app
  1. 콘솔에 "Hello, Docker with Java!" 확인


아주 간단하게 도커 겉핥기를 해봤는데 시리즈로 구상 중이라 컨테이너 간 통신 (도커 네트워크), 도커 볼륨, 컴포즈, Jenkins 연동 등 프로젝트 실례로 돌아오겠습니다

profile
아무것도 안해서 유죄 판결 받음

0개의 댓글

관련 채용 정보