🚀 Docker는 컨테이너(Container) 기반 가상화 기술로, 애플리케이션과 환경을 패키징하여 어디서든 동일한 환경에서 실행할 수 있도록 도와주는 도구입니다.
이 문서에서는 Docker의 개념, 주요 명령어, 이미지 & 컨테이너 관리, 네트워크, 볼륨, 최적화 전략, Docker Compose 및 실전 활용법을 정리합니다.
⚡ 1. Docker란?
Docker는 컨테이너(Container) 기반 가상화 기술로, 애플리케이션과 실행 환경을 패키징하여 어디서나 동일한 환경에서 실행할 수 있도록 도와준다.
✅ Docker의 주요 특징
• 경량 가상화 → 기존의 VM과 달리 호스트 OS 커널을 공유하여 빠르고 가벼움
• 일관된 실행 환경 → 운영체제(OS)와 애플리케이션을 묶어서 실행 가능
• 애플리케이션 배포 최적화 → 어디서나 동일한 환경에서 실행할 수 있음
• 마이크로서비스 아키텍처(MSA) 및 CI/CD(배포 자동화) 지원
✅ 컨테이너(Container) 기반 가상화 기술
✅ OS 커널을 공유하여 가상 머신(VM)보다 가볍고 빠름
✅ 개발 환경과 운영 환경을 일치시키는 데 최적화
✅ 마이크로서비스 아키텍처(MSA) 및 CI/CD(배포 자동화)에 유용
🔹 VM vs Docker 비교
항목 | 가상 머신(VM) | Docker 컨테이너 |
실행 속도 | 느림 | 빠름 |
OS 포함 여부 | 각 VM마다 OS 포함 | 호스트 OS 공유 |
리소스 사용량 | 높음 | 낮음 |
애플리케이션 격리 | 완전한 OS 격리 | 프로세스 단위 격리 |
배포 방식 | 무겁고 복잡 | 가볍고 유연 |
🚀 Docker를 사용하면 애플리케이션을 가볍고 빠르게 배포 및 실행할 수 있음!
🚀 Docker는 VM보다 가볍고 빠르며, 개발과 운영 환경을 일치시키는 데 유용함.
⚡ 2. Docker Hub란?
Docker Hub는 Docker 이미지를 저장하고 공유할 수 있는 공식 레지스트리.
✅ Docker Hub의 역할
• 공식 이미지(예: nginx, mysql 등) 다운로드 가능
• 사용자 정의 이미지를 업로드하고 공유 가능
• CI/CD 파이프라인과 연동 가능
✅ Docker Hub 사용 방법
🔹 Docker Hub에서 이미지 다운로드
docker pull nginx
• Docker Hub(https://hub.docker.com/)에서 nginx 이미지 다운로드
🔹 Docker Hub에서 특정 버전의 이미지 다운로드
docker pull nginx:1.21
• Nginx 1.21 버전 이미지 다운로드
🔹 Docker Hub에 이미지 업로드 (Push)
1. Docker Hub 로그인
docker login
2. 이미지 태깅
docker tag myimage mydockerhubusername/myimage:v1
3. 이미지 업로드
docker push mydockerhubusername/myimage:v1
• Docker Hub에 이미지 업로드 후 다른 서버에서도 다운로드 가능
⚡ 3. Docker 기본 개념 (이미지, 컨테이너)
✅ Docker 이미지(Docker Image)
• 프로그램 실행에 필요한 OS + 애플리케이션을 포함한 패키지
• 어디서든 동일한 환경을 재현 가능
✅ Docker 컨테이너(Docker Container)
• Docker 이미지를 실행한 상태
• 여러 개의 컨테이너를 독립적으로 실행 가능
📌 비유하자면…
• Docker 이미지 = 프로그램 설치 파일 (.exe)
• Docker 컨테이너 = 실행된 프로그램
⚡ 4. Docker 기본 명령어
✅ 1) Docker 이미지 관련
docker pull nginx # Docker Hub에서 Nginx 이미지 다운로드
docker images # 로컬에 저장된 이미지 목록 확인
docker rmi nginx # 특정 Docker 이미지 삭제
✅ 2) Docker 컨테이너 관련
docker run nginx # Nginx 컨테이너 실행 (이미지가 없으면 자동 다운로드)
docker ps # 실행 중인 컨테이너 목록 확인
docker ps -a # 종료된 컨테이너 포함하여 확인
docker rm 컨테이너ID # 컨테이너 삭제 (앞 3자리만 입력 가능)
✅ 3) 컨테이너 실행 방식
docker run -d nginx # 백그라운드 모드로 실행 (-d: detached mode)
docker stop 컨테이너ID # 컨테이너 중지
docker kill 컨테이너ID # 컨테이너 강제 종료
docker start 컨테이너ID # 중지된 컨테이너 다시 시작
⚡ 5. Docker 네트워크
✅ 컨테이너 간 네트워크 통신을 관리하는 방법
docker network ls # 현재 사용 가능한 Docker 네트워크 확인
docker network create mynetwork # 새로운 네트워크 생성
docker run -d --network mynetwork --name nginx-1 nginx # 특정 네트워크에 컨테이너 추가
docker run -d --network mynetwork --name nginx-2 nginx # 동일한 네트워크에 컨테이너 추가
• 같은 네트워크 내에 있는 컨테이너들은 서로 이름을 통해 통신 가능
⚡ 6. Docker 볼륨 & 바인드 마운트 & 데이터 관리
✅ 컨테이너 내부 데이터를 유지하는 방법
docker volume create myvolume # Docker 볼륨 생성
docker run -d -v myvolume:/app/data nginx # 볼륨을 컨테이너 내부 디렉토리에 마운트
docker volume ls # 모든 볼륨 확인
docker volume inspect myvolume # 볼륨 정보 확인
docker volume rm myvolume # 특정 볼륨 삭제
• 컨테이너가 삭제되더라도 볼륨 데이터는 유지됨
✅ 1) 볼륨(Volume) vs 바인드 마운트(Bind Mount)
항목 | 볼륨(Volume) | 바인드 마운트(Bind Mount) |
관리 주체 | Docker가 관리 | 사용자가 직접 관리 |
데이터 저장 위치 | /var/lib/docker/volumes/ | 사용자가 지정한 경로 |
컨테이너 삭제 시 데이터 | 유지됨 | 유지됨 |
사용 목적 | 데이터 공유 & 영구 저장 | 호스트의 특정 폴더 공유 |
• 볼륨(Volume)은 Docker가 관리하는 스토리지이고, 바인드 마운트(Bind Mount)는 사용자가 직접 지정한 호스트 폴더를 컨테이너와 공유하는 방식입니다.
✅ 2) 볼륨(Volume) 사용법
🔹 볼륨 생성 및 컨테이너에 마운트
docker volume create myvolume
docker run -d -v myvolume:/app/data nginx
• 컨테이너가 종료되더라도 myvolume에 저장된 데이터는 유지됨
🔹 볼륨 목록 및 상세 정보 확인
docker volume ls # 생성된 볼륨 목록 확인
docker volume inspect myvolume # 특정 볼륨 상세 정보 확인
🔹 볼륨 삭제
docker volume rm myvolume
• 볼륨이 삭제되면 해당 데이터도 사라짐
✅ 3) 바인드 마운트(Bind Mount) 사용법
🔹 바인드 마운트로 컨테이너와 호스트 폴더 공유
docker run -d -v /Users/mydata:/app/data nginx
• 호스트의 /Users/mydata 디렉토리를 컨테이너의 /app/data로 마운트
🔹 컨테이너 내부에서 바인드 마운트된 폴더 확인
docker exec -it 컨테이너ID ls /app/data
• 컨테이너 내부에서 호스트의 파일을 확인 가능
📌 차이점 정리
• 볼륨(Volume) → Docker가 관리하는 데이터 저장소 (영구 데이터 저장)
• 바인드 마운트(Bind Mount) → 호스트의 특정 폴더를 직접 컨테이너에 연결 (개발 편리)
⚡ 7. Dockerfile & 이미지 빌드
✅ Dockerfile 예제
# 베이스 이미지 설정
FROM nginx:latest
# 커스텀 index.html 파일 추가
COPY index.html /usr/share/nginx/html/
# 컨테이너 시작 시 실행할 명령어 설정
CMD ["nginx", "-g", "daemon off;"]
✅ 이미지 빌드 & 실행
docker build -t mynginx .
docker run -d -p 8080:80 mynginx
• 커스텀 Nginx 이미지 빌드 후 실행
⚡ 8. Docker Compose
✅ Compose 파일 예제 (docker-compose.yml)
version: "3.8"
services:
web:
image: nginx
ports:
- "8080:80"
app:
image: myapp
depends_on:
- db
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
✅ Compose 실행
docker-compose up -d
• 여러 컨테이너를 한 번에 실행 가능
⚡ 9. Docker 최적화 및 레이어 관리
✅ Docker 레이어 확인
docker history nginx
• 이미지의 레이어별 변경 사항 확인
✅ Docker 빌드 시 캐시 최적화
• COPY 같은 명령어는 변경이 많을 수 있으므로 하단에 배치하여 캐시 활용을 극대화
• RUN 명령어 하나가 새로운 레이어를 생성하므로 명령어를 줄이고 합치는 것이 좋음
⚡ 10. 기타 유용한 Docker 명령어
✅ Docker 컨테이너 유지 (단발성 실행 방지)
docker run -d mycontainer tail -f /dev/null
• 컨테이너가 종료되지 않도록 유지
✅ 특정 컨테이너, 이미지 일괄 삭제
docker ps -a --format '{{.Names}}' | grep '^mycontainer' | xargs -r docker rm
docker images --format '{{.Repository}}' | grep '^myimage' | xargs -r docker rmi
• 특정 접두어(mycontainer 또는 myimage)로 시작하는 컨테이너 및 이미지 삭제
✅ 실시간 컨테이너 로그 확인
docker logs -f 컨테이너ID
docker logs --timestamps 컨테이너ID
• 로그를 실시간으로 모니터링 가능 (-f 옵션 사용)
✅ Docker 볼륨 용량 확인
df -h
docker system df
• 디스크 사용량 및 불필요한 리소스 정리 가능
⚡ 11. 결론
✅ Docker는 가볍고 빠른 컨테이너 기반 가상화 솔루션
✅ 이미지, 컨테이너, 네트워크, 볼륨 등을 활용하여 유연한 개발 환경 구성 가능
✅ Dockerfile을 이용해 이미지를 커스텀하고, Compose로 여러 컨테이너를 관리할 수 있음
✅ 효율적인 레이어 캐시 활용을 통해 최적화 가능
🚀 Docker를 잘 활용하면 개발과 배포가 훨씬 쉬워진다!
'Infra > Container' 카테고리의 다른 글
[Kubernetes] K8s Cluster (0) | 2025.03.04 |
---|---|
[Kubernetes] 쿠버네티스 (K8s) (0) | 2025.03.03 |