Docker란 무엇인가?
Docker는 애플리케이션을 격리된 환경에서 실행할 수 있도록 해주는 컨테이너 기반 가상화 플랫폼입니다. 개발 및 배포 환경의 일관성을 보장하며, 시스템 자원을 효율적으로 사용할 수 있습니다.
기본 설치 및 설정
Linux 환경(CentOS 기준)에 Docker를 설치하고, 국내 사용자를 위한 레지스트리 미러를 설정하는 방법은 다음과 같습니다:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.xuanyuan.me"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
이 설정을 통해 이미지 다운로드 속도를 크게 향상시킬 수 있습니다.
주요 명령어 요약
이미지 관리
- 검색:
docker search nginx(현재 네트워크 문제로 제한적) - 다운로드:
docker pull nginx:1.26.0 - 목록 확인:
docker images - 삭제:
docker rmi [IMAGE_ID 또는 태그]
컨테이너 운영
백그라운드에서 Nginx 컨테이너를 실행하려면:
docker run -d --name web-server -p 88:80 nginx:1.26.0
-d: 백그라운드 실행--name: 컨테이너 이름 지정-p 88:80: 호스트 88번 포트 → 컨테이너 80번 포트 매핑
운영 상태 확인 및 조작
- 실행 중인 컨테이너 보기:
docker ps, 전체 보기docker ps -a - 중지/시작/재시작:
docker stop/start/restart [NAME|ID] - 리소스 모니터링:
docker stats(실시간 업데이트) - 로그 확인:
docker logs web-server - 내부 진입:
docker exec -it web-server /bin/bash - 삭제:
docker rm [NAME|ID](실행 중인 경우-f옵션 필요)
데이터 영속성: 볼륨과 바인드 마운트
바인드 마운트 (Bind Mount)
호스트의 특정 디렉터리를 컨테이너 내부 경로에 연결합니다:
docker run -d -p 88:80 -v /app/html:/usr/share/nginx/html --name site-a nginx:1.26.0
호스트의 /app/html/index.html 수정이 즉시 컨테이너에 반영됩니다.
볼륨 마운트 (Volume Mount)
Docker가 자체적으로 관리하는 저장 공간을 사용합니다:
docker run -d -p 89:80 -v static-html:/usr/share/nginx/html -v config-nginx:/etc/nginx --name site-b nginx:1.26.0
볼륨 관련 명령어:
docker volume ls: 볼륨 목록 조회docker volume create custom-vol: 볼륨 생성docker volume inspect config-nginx: 볼륨 정보 확인
비교: 바인드 마운트 vs 볼륨 마운트
| 구분 항목 | 바인드 마운트 | 볼륨 마운트 |
|---|---|---|
| 관리 주체 | 사용자 직접 관리 | Docker 엔진 자동 관리 |
| 저장 위치 | 호스트의 명시적 경로 | Docker 내부 경로 (예: /var/lib/docker/volumes) |
| 수명 주기 | 컨테이너와 독립적, 호스트 디렉터리 유지 | 컨테이너 삭제 후에도 유지 (직접 삭제 필요) |
| 보안 및 격리 | 낮음 (호스트 파일 시스템 노출) | 높음 (엔진 차원에서 격리) |
| 권한 문제 | 빈번함 (UID/GID 불일치) | 해결됨 (Docker가 처리) |
| 클러스터 지원 | 제한적 (단일 노드) | 확장 가능 (NFS, Ceph 등 연동) |
| 주요 사용처 | 개발 시 코드 동기화, 설정 공유 | DB 데이터 저장, 다중 컨테이너 공유 |
네트워킹: 컨테이너 간 통신
기본 통신 방식
기본적으로 각 컨테이너는 고유 IP를 가지며, 호스트의 포트를 통해 외부와 통신합니다.
커스텀 네트워크 사용
서로 다른 컨테이너가 이름으로 직접 통신할 수 있도록 하려면:
docker network create app-network
docker run -d --name api-server --network app-network nginx:1.26.0
docker run -d --name client-app --network app-network nginx:1.26.0
이후 client-app 내부에서 curl http://api-server로 접근 가능합니다.
실습 예제: Redis 마스터-슬레이브 구성
Bitnami 제공 Redis 이미지를 사용하여 복제 구조를 구성합니다.
마스터 노드 실행
docker run -d \
--name redis-master \
--network app-network \
-p 6379:6379 \
-v /app/redis-data/master:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
bitnami/redis
디렉터리 권한 문제를 방지하기 위해:
mkdir -p /app/redis-data/master
chmod -R 777 /app/redis-data/master
슬레이브 노드 실행
docker run -d \
--name redis-slave \
--network app-network \
-p 6380:6379 \
-v /app/redis-data/slave:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \
-e REDIS_MASTER_HOST=redis-master \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
bitnami/redis
MySQL 컨테이너 배포
docker run -d \
--name mysql-db \
-p 3306:3306 \
-v /app/mysql/conf:/etc/mysql/conf.d \
-v /app/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=myapp \
mysql:8.0.42-oracle
외부 DB 클라이언트로 접속하여 정상 동작 확인 가능합니다.
Docker Compose를 이용한 멀티 컨테이너 관리
다수의 서비스를 한 번에 정의하고 실행할 수 있는 도구입니다.
docker-compose.yml 예시
name: wordpress-stack
services:
db:
container_name: mysql-db
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
volumes:
- db-data:/var/lib/mysql
- ./mysql-conf:/etc/mysql/conf.d
restart: always
networks:
- frontend
wp:
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-content:/var/www/html
restart: always
networks:
- frontend
volumes:
db-data:
wp-content:
networks:
frontend:
Compose 명령어
docker compose up -d: 백그라운드에서 모든 서비스 시작docker compose down: 서비스 종료 (볼륨은 유지)docker compose down -v --rmi all: 볼륨 및 이미지도 함께 제거docker compose start/stop [서비스명]: 특정 서비스만 제어docker compose scale wp=2: 워드프레스 인스턴스 2개로 확장
파일명이 compose.yaml 또는 docker-compose.yml이면 자동 인식되며, 다른 이름일 경우 -f 옵션으로 지정합니다.