Infra/Container

[Docker] Docker 정리

baek-dev 2025. 2. 28. 21:55

🚀 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 HubDocker 이미지를 저장하고 공유할 수 있는 공식 레지스트리.

 

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