화. 8월 12th, 2025

G: 안녕하세요, 개발자 여러분! 👨‍💻👩‍💻 현대 개발 환경에서 Docker는 선택이 아닌 필수가 되어가고 있습니다. 가볍고 독립적인 컨테이너를 통해 애플리케이션을 효율적으로 배포하고 관리할 수 있게 해주기 때문이죠. 하지만 처음 접하는 분들에게는 수많은 명령어들이 낯설게 느껴질 수 있습니다.

걱정 마세요! 이 가이드 하나면 Docker의 핵심 개념부터 필수 명령어, 그리고 더 나아가 실무에서 유용하게 쓰일 고급 명령어까지 완벽하게 마스터할 수 있을 거예요. ✨

자, 그럼 Docker의 신세계로 함께 떠나볼까요? 🚢


💡 들어가기 전에: Docker 기본 개념 복습!

명령어를 배우기 전에 Docker의 핵심 구성 요소를 간단히 짚고 넘어갑시다. 이 개념들을 이해하고 나면 명령어들이 훨씬 쉽게 다가올 거예요!

  • 이미지 (Image): 🖼️ 애플리케이션 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 포함하는 읽기 전용 템플릿입니다. ‘붕어빵 틀’이라고 생각하면 쉬워요.
  • 컨테이너 (Container): 📦 이미지를 실행한 독립적인 공간입니다. 이미지는 정적이지만, 컨테이너는 동적으로 실행되고 데이터를 생성할 수 있습니다. ‘붕어빵’ 그 자체죠!
  • 레지스트리 (Registry): ☁️ Docker 이미지를 저장하고 공유하는 곳입니다. 가장 대표적인 곳이 바로 Docker Hub입니다.
  • 볼륨 (Volume): 💾 컨테이너와 호스트(실제 서버) 간에 데이터를 공유하고, 컨테이너가 삭제되어도 데이터가 보존될 수 있도록 돕는 메커니즘입니다. 컨테이너는 휘발성이 강하기 때문에 데이터 영속성을 위해 필수적이에요.
  • 네트워크 (Network): 🔗 여러 컨테이너들이 서로 통신할 수 있도록 해주는 가상 네트워크 환경입니다.

1. 이미지 관리 명령어: 컨테이너의 ‘원천’을 다루다! 🖼️

컨테이너를 만들기 위해서는 먼저 이미지가 필요하겠죠? 이미지와 관련된 필수 명령어들을 알아봅시다.

📥 docker pull: 이미지 다운로드

Docker Hub나 다른 레지스트리에서 이미지를 로컬로 가져오는 명령어입니다.

  • 형식: docker pull [옵션] [이미지 이름][:태그]
  • 예시:
    • 최신 Ubuntu 이미지 다운로드:
      docker pull ubuntu:latest
    • Nginx 웹 서버 이미지 다운로드 (태그를 명시하지 않으면 latest가 기본값):
      docker pull nginx
    • 특정 버전의 Node.js 이미지 다운로드:
      docker pull node:16-alpine

🏗️ docker build: Dockerfile로 이미지 생성

직접 정의한 Dockerfile을 이용해 사용자 지정 이미지를 생성하는 명령어입니다.

  • 형식: docker build [옵션] [빌드 컨텍스트 경로]
  • 예시:
    • 현재 디렉터리(. )의 Dockerfile을 사용하여 my-web-app이라는 이름과 1.0 태그로 이미지 생성:
      docker build -t my-web-app:1.0 .
    • 빌드 캐시를 사용하지 않고 이미지 생성:
      docker build --no-cache -t my-web-app:1.0 .
    • 팁: -t 옵션은 이미지의 이름(name)과 태그(tag)를 지정하여 나중에 쉽게 찾고 사용할 수 있게 해줍니다.

📸 docker images 또는 docker image ls: 로컬 이미지 목록 확인

로컬 시스템에 다운로드되거나 빌드된 이미지들을 보여줍니다.

  • 형식: docker images [옵션]
  • 예시:
    • 모든 로컬 이미지 목록 확인:
      docker images
    • 중간 빌드 이미지(dangling images)까지 포함하여 모든 이미지 목록 확인:
      docker images -a
    • 특정 이미지 이름으로 필터링하여 목록 확인:
      docker images nginx

🗑️ docker rmi 또는 docker image rm: 이미지 삭제

로컬 시스템에서 더 이상 필요 없는 이미지를 삭제합니다. 컨테이너가 해당 이미지를 사용 중이면 삭제되지 않습니다.

  • 형식: docker rmi [옵션] [이미지 이름/ID]
  • 예시:
    • ubuntu:latest 이미지 삭제:
      docker rmi ubuntu:latest
    • 이미지 ID로 삭제 (부분 ID도 가능):
      docker rmi 2a2e4e1a123f # 이미지 ID의 앞 몇 글자로도 삭제 가능
    • 컨테이너가 사용 중이어도 강제로 삭제: (주의: 실행 중인 컨테이너에 영향을 줄 수 있음)
      docker rmi -f my-web-app:1.0

2. 컨테이너 관리 명령어: 애플리케이션을 ‘실행’하다! 📦

이미지를 통해 컨테이너를 생성하고, 실행하고, 관리하는 명령어는 Docker를 사용하는 가장 기본적인 과정입니다.

▶️ docker run: 컨테이너 생성 및 실행

이미지를 기반으로 새로운 컨테이너를 생성하고 실행하는 가장 중요하고 많이 사용되는 명령어입니다.

  • 형식: docker run [옵션] [이미지 이름][:태그] [실행할 명령어]
  • 주요 옵션:
    • -d, --detach: 컨테이너를 백그라운드에서 실행 (데몬 모드).
    • -p, --publish: 호스트 포트와 컨테이너 포트를 연결 (포트 포워딩).
    • --name: 컨테이너에 이름을 부여하여 나중에 쉽게 참조할 수 있게 함.
    • -it: 컨테이너와 상호작용할 수 있는 터미널(TTY)을 할당하고, 표준 입력(interactive)을 열어둠.
    • --rm: 컨테이너가 종료될 때 자동으로 삭제되도록 함. 일회성 작업에 유용.
    • -v, --volume: 볼륨을 연결하여 데이터 영속성 확보.
    • --network: 컨테이너가 사용할 네트워크 지정.
    • -e, --env: 컨테이너 내부에 환경 변수 설정.
  • 예시:
    • Nginx 웹 서버를 백그라운드로 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하며, my-nginx-web이라는 이름 부여:
      docker run -d -p 80:80 --name my-nginx-web nginx
    • Ubuntu 컨테이너를 실행하여 bash 쉘에 접속:
      docker run -it ubuntu bash
    • hello-world 컨테이너를 실행하고, 종료되면 자동으로 삭제:
      docker run --rm hello-world
    • my-data 볼륨을 컨테이너의 /app/data 경로에 마운트하며 컨테이너 실행:
      docker run -d -v my-data:/app/data --name my-app-with-data my-app:1.0

📋 docker ps 또는 docker container ls: 실행 중인 컨테이너 목록 확인

현재 실행 중인 컨테이너들의 목록을 보여줍니다.

  • 형식: docker ps [옵션]
  • 주요 옵션:
    • -a, --all: 모든 컨테이너(실행 중이거나 종료된 컨테이너 모두)를 보여줌.
    • -s, --size: 컨테이너의 크기를 포함하여 보여줌.
    • -q, --quiet: 컨테이너 ID만 보여줌. (다른 명령어와 조합할 때 유용)
  • 예시:
    • 현재 실행 중인 컨테이너 목록 확인:
      docker ps
    • 모든 컨테이너(실행 + 중지) 목록 확인:
      docker ps -a
    • 종료된 모든 컨테이너 ID 확인 (삭제 전 확인용):
      docker ps -a -q --filter "status=exited"

🟢 docker start: 정지된 컨테이너 시작

이전에 stop 명령으로 정지시킨 컨테이너를 다시 시작합니다.

  • 형식: docker start [컨테이너 이름/ID]
  • 예시:
    docker start my-nginx-web

🛑 docker stop: 실행 중인 컨테이너 정지

실행 중인 컨테이너를 정지시킵니다. 데이터는 손실되지 않고 컨테이너 상태가 유지됩니다.

  • 형식: docker stop [컨테이너 이름/ID]
  • 예시:
    docker stop my-nginx-web

🔄 docker restart: 컨테이너 재시작

컨테이너를 정지했다가 다시 시작합니다. 주로 설정 변경 후 적용할 때 사용됩니다.

  • 형식: docker restart [컨테이너 이름/ID]
  • 예시:
    docker restart my-nginx-web

docker rm 또는 docker container rm: 컨테이너 삭제

정지된 컨테이너를 삭제합니다. 실행 중인 컨테이너는 삭제할 수 없으며, 먼저 stop해야 합니다.

  • 형식: docker rm [옵션] [컨테이너 이름/ID]
  • 주요 옵션:
    • -f, --force: 실행 중인 컨테이너도 강제로 삭제 (주의!).
    • -v, --volumes: 컨테이너와 연결된 무명 볼륨(anonymous volumes)도 함께 삭제.
  • 예시:
    • my-nginx-web 컨테이너 삭제:
      docker rm my-nginx-web
    • 종료된 모든 컨테이너 한 번에 삭제:
      docker rm $(docker ps -a -q)

📜 docker logs: 컨테이너 로그 확인

컨테이너의 표준 출력(stdout)과 표준 에러(stderr)를 보여줍니다. 문제 해결 시 필수적입니다.

  • 형식: docker logs [옵션] [컨테이너 이름/ID]
  • 주요 옵션:
    • -f, --follow: 실시간으로 로그를 계속 보여줌 (tail -f와 유사).
    • --tail [숫자]: 로그의 마지막 N줄만 보여줌.
    • --since [시간]: 특정 시간 이후의 로그만 보여줌.
  • 예시:
    • my-nginx-web 컨테이너의 모든 로그 확인:
      docker logs my-nginx-web
    • my-nginx-web 컨테이너의 로그를 실시간으로 확인:
      docker logs -f my-nginx-web
    • my-nginx-web 컨테이너의 로그 중 마지막 20줄만 확인:
      docker logs --tail 20 my-nginx-web

🔗 docker exec: 실행 중인 컨테이너 내부 명령어 실행

실행 중인 컨테이너 내부로 들어가 추가 명령어를 실행할 때 사용합니다. 디버깅이나 컨테이너 내부 환경 확인에 매우 유용합니다.

  • 형식: docker exec [옵션] [컨테이너 이름/ID] [실행할 명령어]
  • 주요 옵션:
    • -it: 상호작용 터미널 모드 (컨테이너 내에서 쉘 명령을 직접 입력할 때 필수).
  • 예시:
    • my-nginx-web 컨테이너 내부로 들어가 bash 쉘 실행:
      docker exec -it my-nginx-web bash
    • my-nginx-web 컨테이너 내부의 /etc/nginx 디렉터리 파일 목록 확인:
      docker exec my-nginx-web ls /etc/nginx

3. 볼륨 관리 명령어: 데이터 영속성 확보! 💾

컨테이너는 기본적으로 휘발성이기 때문에, 중요한 데이터는 볼륨을 통해 관리해야 합니다.

docker volume create: 볼륨 생성

명명된(named) 볼륨을 생성합니다. 이렇게 생성된 볼륨은 여러 컨테이너에서 재사용할 수 있습니다.

  • 형식: docker volume create [볼륨 이름]
  • 예시:
    docker volume create my-app-data

📊 docker volume ls: 볼륨 목록 확인

생성된 볼륨들의 목록을 보여줍니다.

  • 형식: docker volume ls [옵션]
  • 예시:
    docker volume ls

🔍 docker volume inspect: 볼륨 상세 정보 확인

특정 볼륨의 상세 정보를 JSON 형식으로 보여줍니다. 실제 저장 경로 등을 확인할 수 있습니다.

  • 형식: docker volume inspect [볼륨 이름]
  • 예시:
    docker volume inspect my-app-data

🗑️ docker volume rm: 볼륨 삭제

더 이상 사용하지 않는 볼륨을 삭제합니다.

  • 형식: docker volume rm [볼륨 이름]
  • 예시:
    docker volume rm my-app-data

4. 네트워크 관리 명령어: 컨테이너 간 통신 설정! 🌐

여러 컨테이너가 서로 통신해야 할 때, 사용자 정의 네트워크를 생성하여 관리하면 효율적입니다.

🌐 docker network create: 네트워크 생성

사용자 정의 브리지 네트워크를 생성합니다.

  • 형식: docker network create [네트워크 이름]
  • 예시:
    docker network create my-app-network
    • 팁: my-app-network에 연결된 컨테이너들은 서로 컨테이너 이름으로 통신할 수 있습니다. (예: ping web-container)

📉 docker network ls: 네트워크 목록 확인

생성된 네트워크들의 목록을 보여줍니다. bridge, host, none 등 기본 네트워크도 함께 보여줍니다.

  • 형식: docker network ls
  • 예시:
    docker network ls

🔬 docker network inspect: 네트워크 상세 정보 확인

특정 네트워크의 상세 정보를 JSON 형식으로 보여줍니다. 연결된 컨테이너 정보도 확인할 수 있습니다.

  • 형식: docker network inspect [네트워크 이름]
  • 예시:
    docker network inspect my-app-network

🗑️ docker network rm: 네트워크 삭제

더 이상 사용하지 않는 사용자 정의 네트워크를 삭제합니다.

  • 형식: docker network rm [네트워크 이름]
  • 예시:
    docker network rm my-app-network

5. 고급 및 유틸리티 명령어: Docker 고수의 길로! 🛠️

지금까지 배운 명령어 외에도 Docker를 더욱 효율적으로 사용하고 문제를 해결하는 데 도움이 되는 유용한 명령어들이 있습니다.

🧐 docker inspect: Docker 객체 상세 정보 확인

이미지, 컨테이너, 볼륨, 네트워크 등 모든 Docker 객체의 매우 상세한 정보를 JSON 형식으로 보여줍니다. 디버깅에 매우 유용합니다.

  • 형식: docker inspect [객체 ID/이름]
  • 예시:
    • my-nginx-web 컨테이너의 모든 정보 확인:
      docker inspect my-nginx-web
    • nginx:latest 이미지의 모든 정보 확인:
      docker inspect nginx:latest

📈 docker stats: 컨테이너 리소스 사용량 실시간 모니터링

실행 중인 컨테이너들의 CPU 사용량, 메모리 사용량, 네트워크 I/O 등을 실시간으로 보여줍니다.

  • 형식: docker stats [옵션] [컨테이너 ID/이름...]
  • 예시:
    • 모든 실행 중인 컨테이너의 리소스 사용량 확인:
      docker stats
    • 특정 컨테이너의 리소스 사용량 확인:
      docker stats my-nginx-web

💾 docker system df: Docker 디스크 사용량 확인

Docker가 사용하고 있는 디스크 공간을 요약해서 보여줍니다. 이미지, 컨테이너, 볼륨 등 각 항목별로 얼마나 공간을 차지하는지 알 수 있습니다.

  • 형식: docker system df
  • 예시:
    docker system df

🧹 docker system prune: 불필요한 Docker 객체 일괄 삭제

더 이상 사용되지 않는 이미지, 컨테이너, 볼륨, 네트워크 등을 한 번에 삭제하여 디스크 공간을 확보합니다. 주기적으로 실행하여 시스템을 깨끗하게 유지하는 것이 좋습니다.

  • 형식: docker system prune [옵션]
  • 주요 옵션:
    • -a, --all: 모든 사용되지 않는(dangling) 이미지와 참조되지 않는 이미지를 포함하여 삭제.
    • --volumes: 사용되지 않는 볼륨도 함께 삭제 (주의: 중요한 데이터가 있을 수 있으니 신중하게 사용).
  • 예시:
    • 종료된 컨테이너, 사용되지 않는 네트워크, dangling 이미지 삭제:
      docker system prune
    • 모든 사용되지 않는 객체 (dangling 이미지 포함) 및 사용되지 않는 볼륨까지 삭제:
      docker system prune -a --volumes
    • 경고: 이 명령은 삭제된 데이터를 복구할 수 없으므로, 실행하기 전에 어떤 데이터가 삭제될지 신중하게 확인하세요.

🔒 docker login/docker logout: Docker Hub 로그인/로그아웃

Docker Hub나 다른 레지스트리에 로그인하거나 로그아웃합니다. docker push 명령을 사용하기 전에 필요합니다.

  • 형식:
    docker login
    docker logout

📤 docker push: 이미지를 Docker Hub에 업로드

로컬에 빌드한 이미지를 Docker Hub와 같은 원격 레지스트리에 업로드합니다.

  • 형식: docker push [이미지 이름][:태그]
  • 예시:
    docker push my-username/my-web-app:1.0
    • 팁: docker build 시 이미지 이름을 [Docker Hub 사용자명]/[이미지명]:[태그] 형식으로 지정해야 푸시할 수 있습니다.

6. Docker Compose: 멀티 컨테이너 애플리케이션의 오케스트레이션 🎶 (간략 소개)

Docker Compose는 여러 개의 컨테이너를 함께 정의하고 실행하기 위한 도구입니다. 복잡한 마이크로서비스 아키텍처나 웹 애플리케이션(웹 서버, 데이터베이스, 캐시 서버 등)을 구성할 때 YAML 파일 하나로 모든 설정을 관리할 수 있어 매우 편리합니다.

여기서는 Compose의 명령어까지 상세히 다루지는 않지만, Docker의 전문가가 되기 위해서는 docker-compose.yml 파일 작성법과 기본 명령어들을 익히는 것이 필수적입니다.

  • 주요 명령어:
    • docker-compose up: docker-compose.yml 파일에 정의된 모든 서비스를 빌드하고 시작.
    • docker-compose down: docker-compose.yml 파일에 정의된 모든 서비스를 중지하고 삭제.

🌟 Docker 마스터를 위한 팁! 💡

  1. 공식 문서 활용: 📚 Docker 공식 문서는 가장 정확하고 최신 정보를 담고 있습니다. 궁금한 점이 생기면 언제든 찾아보세요.
  2. 꾸준한 실습: 💪 명령어를 외우려 하지 말고, 직접 컨테이너를 만들고, 실행하고, 지워보면서 익숙해지는 것이 중요합니다. 작은 프로젝트를 Dockerize 해보는 것도 좋은 방법입니다.
  3. 문제 해결 능력 키우기: 💡 docker logs, docker inspect, docker exec 등의 명령어를 활용하여 컨테이너 내부의 문제를 파악하는 연습을 하세요.
  4. 커뮤니티 활용: 🤝 스택 오버플로우, Docker 포럼 등 활발한 커뮤니티에서 궁금증을 해결하고 다른 사람들의 경험을 공유받으세요.

🏁 마무리하며… 🚀

지금까지 Docker의 핵심 개념부터 이미지, 컨테이너, 볼륨, 네트워크 관리 명령어, 그리고 유용한 고급 명령어들까지 자세히 알아보았습니다. 이 가이드를 통해 Docker에 대한 이해가 깊어지고, 자유자재로 Docker를 다룰 수 있는 자신감을 얻으셨기를 바랍니다. ✨

Docker는 단순히 명령어를 아는 것을 넘어, 애플리케이션 배포와 운영 방식을 혁신하는 강력한 도구입니다. 이 여정은 이제 시작일 뿐이니, 꾸준히 학습하고 실습하면서 Docker 전문가로 거듭나시길 응원합니다! 🌟

혹시 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요! 💬

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다