본문 바로가기
Technology/Docker

[Docker] - 도커(Docker) 개념 및 정의, 운영체제별 활용 방법

by nam_ji 2025. 2. 27.

도커(Docker) 개념 및 정의, 운영체제별 활용 방법

도커란

  • Docker는 컨테이너 기반의 가상화 기술로, 애플리케이션을 독립적으로 실행할 수 있도록 경량화된 환경을 제공합니다.
  • 컨테이너를 사용하면 종속성을 포함한 애플리케이션을 패키징하여 운영체제(OS)와 관계없이 동일한 환경에서 실행할 수 있습니다.
  • 도커의 주요 개념으로 이미지(Image), 컨테이너(Container), 볼륨(Volume)이 있으며, 이 개념들을 운영체제별로 살펴보겠습니다.

도커 이미지(Image)

1. 개념 및 정의

  • 이미지(Image)는 애플리케이션 실행에 필요한 모든 요소(코드, 라이브러리, 의존성, 환경 설정 등)를 포함한 불편(Immutable)의 패키지입니다.
  • 즉, 컨테이너를 생성하기 위한 템플릿(blueprint) 역할을 합니다.

2. 이미지 특징

  • 레이어(Layer) 구조: 이미지 내부는 여러 개의 레이어로 구성되며, 캐싱을 활용하여 효율적으로 관리됩니다.
  • 불변성(Immutable): 이미지는 변경될 수 없으며, 변경이 필요하면 새로운 이미지를 생성해야 합니다.
  • 경량성(Lightweight): 가상머신(VM)보다 가볍고 빠르게 실행됩니다.

3. 운영체제별 Docker Image 관리

1. inux

  • 리눅스에서는 기본적으로 overlay2 스토리지 드라이버를 사용하여 이미지 레이어를 효율적으로 관리합니다.
  • 이미지를 저장하는 기본 경로: /var/lib/bocker
  • 기본 명령어:
# 이미지 확인:
docker images
# 이미지 다운로드:
docker pull ubuntu:latest
# 이미지 삭제:
docker rmi ubuntu:latest

2. window

  • Windows에서는 windowsfilter 스토리지 드라이버를 활용하며, Windows용 도커 이미지는 Linux 이미지와 호환되지 않습니다.
  • Windows의 기본 저장 경로: C:\ProgramData\DockerDesktop
  • 기본 명령어:
# 이미지 확인:
docker images
이미지 다운로드:
docker pull mcr.microsoft.com/windows/servercore:ltsc2022
이미지 삭제:
docker rmi mcr.microsoft.com/windows/servercore:ltsc2022

3. Mac

  • Mac의 Docker Desktop은 Linux VM을 활용하여 동작하므로, 이미지 관리는 Linux와 유사합니다.
  • Mac의 기본 저장 경로: ~/Library/Container/com.docker.docker/Data/vms/0
  • 이미지 관리 방법은 Linux와 동일합니다.

도커 컨테이너 (Container)

1. 개념 및 정의

  • 컨테이너(Container)는 도커 이미리를 기반으로 실행되는 격리된 환경입니다.
  • 애플리케이션과 모든 실행 환경이 포함되어 있어, 어디서든 동일한 실행 환경을 보장합니다.

2. 컨테이너 특징

  • 경량성(Lightweight): 호스트 OS 커널을 공유하므로 VM보다 빠르고 적은 리소스를 사용합니다.
  • 이식성(Portability): 한 환경에서 실행한 컨테이너를 다른 환경에서도 동일하게 실행할 수 있습니다.
  • 격리성(Isolation): 각 컨테이너는 자체 네트워크, 파일 시스템 및 프로세스를 가집니다.

3. 운영체제별 Docker Image 관리

1. Linux

# 컨테이너 실행:
docker run -d --name my-container ubuntu:latest
# 실행 중인 컨테이너 확인:
docker ps
# 컨테이너 중지 및 삭제:
docker stop my-container
docker rm my-container

2. Window

# 컨테이너 실행:
docker run -d --name win-container mcr.microsoft.com/windows/servercore:ltsc2022
# 실행 중인 컨테이너 확인:
docker ps
# 컨테이너 중지 및 삭제:
docker stop win-container
docker rm win-container

3. Mac

  • Mac에서는 기본적으로 Linux 컨테이너를 실행합니다.
  • 컨테이너 실행 방법은 Linux와 동일합니다.

도커 볼륨 (Volume)

1. 개념 및 정의

  • 볼륨(Volume)은 컨테이너의 데이터 저장을 위한 지속 가능한 스토리지입니다.
  • 컨테이너는 기본적으로 데이터를 임시 저장하지만, 컨테이너가 종료되거나 삭제되면 데이터도 함께 사라집니다.
  • 볼륨을 사용하면 컨테이너가 종료되어도 데이터를 유지할 수 있습니다.

2. 볼륨 특징

  • 영속성(Persistence): 컨테이너가 삭제되어도 데이터가 유지됩니다.
  • 격리성(Isolation): 볼륨은 컨테이너와 독립적으로 관리 가능합니다.
  • 성능(Performance): 바인드 마운트보다 성능이 뛰어납니다.

3. 운영체제별 Docker Volume 관리

1. Linux

# 볼륨 생성
docker volume create my-volume
# 볼륨 확인
docker volume ls
# 볼륨을 마운트하여 컨테이너 실행
docker run -d -v my-volume:/app/data ubuntu
# 볼륨 삭제
docker volume rm my-volume

2. Windows

  • Windows에서도 Linux와 동일한 방법으로 볼륨을 관리합니다.
  • 기본 볼륨 경로: C:\ProgramData\Docker\volumes

3. Mac

  • Mac에서도 볼륨은 Linux VM 내부에서 관리되므로, Linux와 동일한 명령을 사용합니다

프로젝트에서 유용한 도커 활용 방법

도커 컴포즈(Docker Compose) 활용

  • 파이썬 FastAPI와 Maria DB, Mongo DB, Redis RabbitMQ 사용 예시
  • 아래 예시는 이런식으로 작성한다는 걸 보여주기 위함입니다.
FROM python:3.10

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
version: "3.8"

services:
  fastapi:
    build: ./app
    container_name: fastapi_app
    ports:
      - "8000:8000"
    depends_on:
      - mariadb
      - mongodb
      - redis
      - rabbitmq
    environment:
      MARIADB_HOST: mariadb
      MONGO_HOST: mongodb
      REDIS_HOST: redis
      RABBITMQ_HOST: rabbitmq

  mariadb:
    image: mariadb:10.5
    container_name: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydatabase
    ports:
      - "3306:3306"
    volumes:
      - mariadb_data:/var/lib/mysql

  mongodb:
    image: mongo:5.0
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db

  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    restart: always
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    ports:
      - "5672:5672"
      - "15672:15672"

volumes:
  mariadb_data:
  mongo_data:
  redis_data:

서버 분리

1. 서버별 역할 및 IP 설정

역할 서버명 서버 IP 실행할 컨테이너
backend_server server1 192.168.0.101 FastAPI (백엔드)
 data_server server2 192.168.0.102 MariaDB, MongoDB (디비)
queue_server server3 192.168.0.103 RabbitMQ (메시지 큐)
cache_server server4 192.168.0.104 Redis (캐시)

2. docker-compose.yml

version: "3.8"

services:
  # Backend Server (FastAPI)
  fastapi:
    build: ./app
    container_name: fastapi_app
    ports:
      - "8000:8000"
    profiles:
      - backend
    depends_on:
      - mariadb
      - mongodb
      - redis
      - rabbitmq
    environment:
      MARIADB_HOST: 192.168.1.102  # data_server IP
      MONGO_HOST: 192.168.1.102  # data_server IP
      REDIS_HOST: 192.168.1.104  # cache_server IP
      RABBITMQ_HOST: 192.168.1.103  # queue_server IP

  # Data Server (MariaDB, MongoDB)
  mariadb:
    image: mariadb:10.5
    container_name: mariadb
    restart: always
    profiles:
      - data
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydatabase
    ports:
      - "3306:3306"
    volumes:
      - mariadb_data:/var/lib/mysql

  mongodb:
    image: mongo:5.0
    container_name: mongodb
    restart: always
    profiles:
      - data
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db

  # Queue Server (RabbitMQ)
  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    restart: always
    profiles:
      - queue
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    ports:
      - "5672:5672"
      - "15672:15672"

  # Cache Server (Redis)
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    profiles:
      - cache
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  mariadb_data:
  mongo_data:
  redis_data:

네트워크 분리

1. 네트워크별 설정

역할 네트워크명
backend backend_network
database data_network
rabbitMQ queue_network
Redis cache_network

2. docker-compose.yml

version: "3.8"

networks:
  backend_network:
    driver: bridge
  data_network:
    driver: bridge
  queue_network:
    driver: bridge
  cache_network:
    driver: bridge

services:
  # FastAPI (Backend)
  fastapi:
    build: ./app
    container_name: fastapi_app
    ports:
      - "8000:8000"
    depends_on:
      - mariadb
      - mongodb
      - redis
      - rabbitmq
    environment:
      MARIADB_HOST: mariadb
      MONGO_HOST: mongodb
      REDIS_HOST: redis
      RABBITMQ_HOST: rabbitmq
    networks:
      - backend_network
      - data_network  # DB 접근 가능
      - queue_network # RabbitMQ 접근 가능
      - cache_network # Redis 접근 가능

  # MariaDB (SQL Database)
  mariadb:
    image: mariadb:10.5
    container_name: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydatabase
    ports:
      - "3306:3306"
    volumes:
      - mariadb_data:/var/lib/mysql
    networks:
      - data_network # FastAPI와만 연결됨

  # MongoDB (NoSQL Database)
  mongodb:
    image: mongo:5.0
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db
    networks:
      - data_network # FastAPI와만 연결됨

  # RabbitMQ (Message Queue)
  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    restart: always
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - queue_network # FastAPI와만 연결됨

  # Redis (Cache)
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - cache_network # FastAPI와만 연결됨

volumes:
  mariadb_data:
  mongo_data:
  redis_data:

네트워크 격리 효과 확인

1. MariaDB에 FastAPI만 연결되었는지 확인

  • 아래 명령어를 입력하고 응답이 있으면 연결된 겁니다.
docker exec -it mariadb ping fastapi

2. FastAPI에서 MariaDB에 접근 가능하지만 RabbitMQ, Redis는 직접 접근 불가

docker exec -it fastapi ping mariadb  	# 가능
docker exec -it fastapi ping mongodb  	# 가능
docker exec -it fastapi ping rabbitmq  	# 가능
docker exec -it fastapi ping redis  	# 가능

3. MariaDB에서 RabbitMQ 접근 불가

docker exec -it mariadb ping rabbitmq

컨테이너별 접근 제한을 위한 네트워크 분리의 장점

1. 네트워크 격리를 통한 보안 강화

  • FastAPI만 DB, Redis, RabbitMQ에 접근 가능
  • DB서버가 RabbitMQ나 Redis에 직접 접근하는 것을 차단

2. 실제 서버 분리 없이 논리적으로 분리된 효과

  • 하나의 docker-compose.yml에서 마치 여러 개의 서버에서 실행되는 것처럼 설정 가능
  • FastAPI가 모든 네트워크에 연결되지만, 다른 서비스는 필요한 네트워크에만 연결

3. 물리 서버를 추가할 필요 없이 네트워크만 조정하여 확장 가능

  • 예를 들어 RabbitMQ가 다른 서버에서 실행된다면, queue_network를 해당 서버에서 생성