도커 Docker, 더 자세하게

이숭늉·2025년 5월 22일
0

DevOps

목록 보기
8/19
post-thumbnail

🐋 도커 Docker, 더 자세하게

이전 글에서 도커의 탄생 배경과 기능, 구성 요소에 대해 간단하게 작성했지만, 좀 더 자세한 정리를 위해 추가 글을 작성한다.

도커란?

도커(Docker)는 어플리케이션을 그 실행 환경과 함께 패키징하여, 어떤 환경에서도 동일하게 실행할 수 있도록 하는 컨테이너 기반 오픈소스 가상화 플랫폼이다. 2013년 리눅스 기반 기술을 바탕으로 처음 출시되었으며, 경량화된 가상화 환경을 제공해 개발과 배포, 운영의 일관성을 높여준다.

도커 전체 구조


도커는 크게 다음 세 가지 주요 구성 요소로 이루어져 있다.

  • 도커 클라이언트
    사용자가 도커와 상호작용할 수 있도록 해주는 명령줄 도구(CLI). 다양한 명령어를 통해 컨테이너, 네트워크, 볼륨 등을 제어할 수 있다.
  • 도커 호스트
    도커가 설치되어 실제로 컨테이너를 실행하는 서버. 이는 물리 서버가 될 수도 있고버클라우드나 가상 머신일 수도 있다.
    여기에는 도커 데몬이 동작하며, 클라이언트로부터 명령을 받아 커넽이너를 생성, 관리하고 필요한 이미지를 레지스트리에서 가져온다.
  • 도커 레지스트리
    도커 이미지를 저장하거나 배포하는 중앙 저장소. 대표적으로는 Docker Hub가 있으며, 개인 또는 조직이 자체 프라이빗 레지스트리를 운영할 수도 있다.

👉 전체적인 흐름 : 사용자가 도커 클라이언트에서 명령어를 입력하면
-> 도커 호스트의 도커 데몬이 명령어를 처리 -> 도커 호스트에 이미지가 존재하지 않는다면 도커 레지스트리에서 가져오고 -> 컨테이너를 실행

🖼️ 도커 이미지

도커 이미지는 컨테이너를 생성하기 위한 실행 가능한 패키지. 하나의 이미지에는 어플리케이션 실행에 필요한 코드, 라이브러리, 설정 파일, 종속성 등이 모두 포함되어 있어, 어떤 환경에서도 동일한 실행 결과를 보장.

이미지 구조

도커 이미지는 여러 개의 레이어로 구성되어 있어, 중복 저장을 줄이고, 변경된 부분만 다시 빌드하여 스토리지와 빌드 성능을 최적화한다.

이미지 구성 요소

  • 이미지 매니페스트 : 해당 이미지가 어떤 레이어로 구성되어 있는지, 어떤 플랫폼을 지원하는지 등의 메타데이터를 포함
  • 레이어: 도커 이미지의 실제 데이터가 저장된 부분. 이미지의 모든 변경은 레이어로 분리되어 저장되며, 중복을 방지하고 캐싱을 통해 빌드 성능을 향상시킴.
  • 이미지 인덱스 : 동일한 이미지 태그에 대해 다양한 아키텍처(AMD64, ARM64..)를 지원할 수 있도록 멀티 플랫폼 이미지의 매핑 정보를 제공.

Dockerfile과 이미지 빌드

  • 도커 이미지는 Dockerfile이라는 빌드 스크립트를 기반으로 생성된다. Dockerfile의 각 명령어는 하나의 레이어로 변환되어 이미지가 아래에서 위로 쌓인다.
# 베이스 이미지 설정
FROM openjdk:17 
# 컨테이너 내 작업 디렉터리 설정
WORKDIR /app 
# jar 파일의 이름을 변경해서 워킹 디렉터리에 복사
ARG JAR_FILE=target/*.jar 
COPY ${JAR_FILE} memo-app.jar 
# 컨테이너 실행 시 수행할 기본 명령어 정의
ENTRYPOINT ["java", "-jar", "/memo-app.jar"]

도커는 빌드 시 이전 레이어가 바뀌지 않으면 아래 레이어를 재사용한다.
예를 들어, COPY 단계에서 jar파일이 변경되면, 그 이후 단계도 모두 다시 실행됨 따라서 가능한 한 변경이 잦은 명령은 아래쪽에 배치하는 것이 효율적이다.

🔲 도커 컨테이너

도커에서 컨테이너란 도커 이미지를 실행한 인스턴스. 이미지를 기반으로 실제 어플리케이션을 실행하는 환경이며, 다음과 같은 특징을 가짐.

  • 컨테이너는 독립적인 파일 시스템과 실행 환경을 가지며, 서로 간섭 없이 실행된다.
    컨테이너는 다음 명령어로 제어할 수 있다 : run, stop, start, restart, rm
  • 컨테이너는 기본적으로 격리된 환경에서 동작하지만, 네트워크 공유, 볼륨 마운트 등을 통해 유연하게 통신하거나 데이터를 저장할 수 있다.

🌐 도커 네트워크

컨테이너는 격리된 환경에서 실행되지만, 대부분의 어플리케이션은 네트워크를 통해 서로 통신해야 한다.
도커는 이를 위해 컨테이너 간 통신, 호스트와의 통신, 외부 네트워크 연결을 가능하게 하는 가상 네트워크를 제공한다.

기본 구조

도커는 컨테이너를 실행할 때, 호스트의 네트워크 인터페이스를 활용해 내부적으로 가상의 네트워크 인터페이스와 브리지를 구성한다.

  • eth0 : 호스트 머신의 실제 네트워크 인터페이스로, 외부 인터넷과 연결된다.
  • docker0 : 도커가 기본으로 생성하는 브리지 네트워크로, 호스트와 컨테이너 사이를 연결한다.
  • veth(Virtual Ethernet Pair) : 가상 네트워크 인터페이스로, 한쪽 끝은 컨테이너 내부, 다른 한쪽은 브리지에 연결됨. 컨테이너가 생성될 때 자동 생생됨.

흐름 예시 : 외부 요청 -> eth0 -> docker0 -> veth -> 컨테이너 내부 네트워크

네트워크 드라이버

도커는 여러 가지 네트워크 방식(드라이버)을 제공하며, 사용 목적에 따라 선택할 수 있다.

bridge

  • 도커가 생성하는 기본 네트워크 모드
  • 컨테이너들은 같은 브리지 네트워크에 있을 경우 서로 통신 가능
  • IP는 도커 내부 DHCP에 의해 자동 할당됨.
  • 외부와 통신하려면 -p 옵션으로 포트 매핑이 필요
docker run -d --name web1 -- network bridge -p 8080:80 nginx

host

  • 컨테이너가 호스트의 네트워크 스택을 그대로 공유
  • 컨테이너가 호스트의 IP 주소를 그대로 사용하므로, 별도의 포트 매핑이 필요 없음.
  • 성능은 좋지만 컨테이너 간 격리가 사라짐

none

  • 네트워크가 완전히 비활성화된 상태.
  • IP도 없고, DNS도 없고, 외부와 연결 불가능.

사용자 정의 네트워크

명시적으로 네트워크를 설정하지 않으면 기본값 브리지 네트워크가 사용된다. 하지만 복잡한 컨테이너 구성에서는 사용자 정의 네트워크가 필요하다.

  • 컨테이너 이름을 호스트명으로 인식하여 통신 가능 (DNS 기능 내장)
  • 자동 연결/ 격리/ 보안 정책 설정 가능
  • 복수의 컨테이너를 명확하게 논리적으로 분리할 수 있다.
docker network create my-network
docker run -d --name backend --network my-net my-backend-image
docker run -d --name frontend --network my-net my-frontend-image

🗄️ 도커 스토리지

컨테이너는 삭제되면 컨테이너 내부에 존재하는 파일도 함께 사라진다. 도커 컨테이너 내부에서 사용되거나 생성되는 데이터를 컨테이너 실행 여부와 상관없이 유지할 수 있는 방법으로 등장한 것이 바로 도커 스토리지이다. 이를 활용하면 컨테이너 외부에도 데이터를 저장할 수 있어 데이터의 영속성을 보장할 수 있다.

스토리지 3가지 방식

Bind Mount
: 호스트의 특정 디렉터리를 컨테이너에 그대로 연결하는 방식

docker run -v /my/host/path:/data my-image
# /my/host/path : 도커 호스트의 실제 디렉터리
# /data : 컨테이너 내부에서 접근하는 경로
  • 실시간으로 파일 동기화 가능하나, 도커가 디렉터리 내용을 관리하지 않으므로 보안이 떨어질 수 있다.
  • 개발 중 실시간 코드 변경을 반영하고자 할 때 사용된다.

Volume
: 도커가 자체적으로 볼륨을 생성하고 관리하는 방식

# 먼저 볼륨 생성
docker volume create my-volume

# 컨테이너 실행 시 볼륨 마운트
docker run -v my-volume:/data my-image
  • 볼륨 데이터는 /var/lib/docker/volumes/ 아래에 저장된다.
  • 이름만 알면 어떤 호스트에서도 재사용 가능
  • 백업/복원/이전이 쉬우며 보안이 뛰어나다.
  • MySQL, PostgreSQL 같은 DB 컨테이너의 데이터를 저장할 때 주로 사용된다.

tmpfs

docker run --tmpfs /app/tmp:rw,size=100m my-image
# 컨테이너 내부의 /app/tmp 경로에 대해 tmpfs를 마운트
  • 데이터를 디스크가 아닌 RAM에 저장하며, 컨테이너가 종료되면 데이터는 자동 삭제된다.
  • 디스크 I/O가 없기 때문에 속도가 매우 빠르다.
  • 일시적인 캐시, 세션 데이터 저장 시 사용된다.

이상으로 도커에 대한 글을 마치겠다. 이번 글을 작성하면서 잠시 잊어버렸던 도커에 대해 다시 떠올리고 정리할 수 있었다. 다음 글에서는 컨테이너 오케스트레이션 도구인 쿠버네티스에 대해 알아볼 것이다.

profile
부지런히 살자

0개의 댓글