도커(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를 해당 서버에서 생성
'Technology > Docker' 카테고리의 다른 글
[Docker] - 도커(Docker) port 충돌 해결 방법 (0) | 2025.03.12 |
---|---|
[Docker] - 도커(Docker) 이미지 컨테이너 볼륨이란? (0) | 2025.02.27 |
[Docker] - Docker Compose란 (0) | 2024.04.10 |
[Docker] - Docker Prune 명령어 정리 (0) | 2024.04.08 |
[Docker] - Docker(도커)란? (0) | 2024.03.20 |