화. 8월 12th, 2025

G: 안녕하세요, 개발자 커뮤니티의 모든 분들! 🧑‍💻✨ 오늘 우리는 현대 개발의 필수 도구로 자리 잡은 도커(Docker)의 세계로 함께 떠나볼 거예요. “도커, 그게 뭔데?”, “명령어가 너무 많아서 복잡해 보여!”라고 느끼셨던 분들도 걱정 마세요! 이 글은 도커를 처음 접하는 분들이 핵심 명령어를 마스터하고, 자신감을 가지고 도커를 활용할 수 있도록 돕기 위해 작성되었습니다.

도커는 애플리케이션을 개발, 배포, 실행하는 데 필요한 모든 것을 컨테이너라는 독립적인 환경에 담아 관리할 수 있게 해주는 혁신적인 플랫폼입니다. “내 컴퓨터에서는 잘 되는데, 왜 서버에서는 안 될까?”라는 고통스러운 질문에 종지부를 찍어줄 마법 같은 도구죠! 🪄

지금부터 도커의 기본 개념부터 필수 명령어, 그리고 실용적인 활용 팁까지 함께 알아보겠습니다. 준비되셨나요? 🚀


1. 도커, 왜 알아야 할까요? (핵심 개념 이해하기) 🤔

도커 명령어를 배우기 전에, 도커가 무엇을 위해 존재하며 어떤 핵심 개념을 가지고 있는지 잠깐 짚고 넘어갈게요. 이 개념들을 이해하면 명령어가 훨씬 직관적으로 다가올 거예요!

  • 이미지 (Image): 🖼️ 애플리케이션 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 포함하는 읽기 전용 템플릿입니다. 예를 들어, ubuntu 이미지, nginx 이미지, mysql 이미지 등을 생각할 수 있습니다. 이미지는 일종의 “소프트웨어 설치 CD”라고 보면 됩니다.

  • 컨테이너 (Container): 📦 이미지의 실행 가능한 인스턴스입니다. 이미지를 바탕으로 생성되며, 독립적인 환경에서 애플리케이션이 격리되어 실행됩니다. 컨테이너는 가볍고 빠르며, 다른 컨테이너나 호스트 시스템에 영향을 주지 않습니다. “설치 CD로 설치한 실제 프로그램”이라고 생각하세요!

  • 레지스트리 (Registry): 📊 도커 이미지를 저장하고 공유하는 공간입니다. 가장 유명한 레지스트리는 Docker Hub입니다. 마치 GitHub가 코드 저장소인 것처럼, Docker Hub는 이미지 저장소라고 보면 됩니다.

이 세 가지 개념을 이해했다면, 이제 도커의 마법을 부릴 준비가 된 것입니다! ✨


2. 도커 필수 명령어 총정리: 이미지 & 컨테이너 관리 🛠️

자, 이제 실전입니다! 도커 명령어를 기능별로 나누어 알아보겠습니다. 터미널(또는 명령 프롬프트)을 열고 직접 따라 해보시는 것을 강력 추천합니다.

2.1. 이미지 관리 명령어 🖼️

애플리케이션을 실행하려면 먼저 이미지가 필요하겠죠? 이미지를 다루는 방법을 알아봅시다.

  • docker pull [이미지명]:[태그]: 이미지 다운로드 ⬇️

    • 설명: Docker Hub와 같은 레지스트리에서 이미지를 로컬로 다운로드합니다. 태그는 이미지의 특정 버전을 나타내며, 생략하면 latest 태그가 기본으로 사용됩니다.
    • 예시:
      • docker pull ubuntu: 최신 우분투 이미지를 다운로드합니다.
      • docker pull nginx:1.21: Nginx 1.21 버전을 다운로드합니다.
    • 팁: 처음 docker run 명령어를 사용하면, 해당 이미지가 로컬에 없을 경우 자동으로 pull을 시도합니다.
  • docker images: 로컬 이미지 목록 확인 📋

    • 설명: 내 컴퓨터에 다운로드되어 있는 도커 이미지 목록을 보여줍니다.
    • 예시:
      docker images

      출력 예시:

      REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
      ubuntu        latest    132b7f33167f   2 weeks ago    77.8MB
      nginx         1.21      9e0c527e029c   2 months ago   133MB
      hello-world   latest    bf756fb1cdb1   5 months ago   13.3kB
  • docker rmi [이미지 ID 또는 이미지명]:[태그]: 이미지 삭제 🗑️

    • 설명: 로컬에 있는 도커 이미지를 삭제합니다. 이미지를 삭제하려면 해당 이미지를 기반으로 실행 중인 컨테이너가 없어야 합니다.
    • 예시:
      • docker rmi ubuntu: ubuntu:latest 이미지를 삭제합니다.
      • docker rmi 132b7f33167f: 특정 이미지 ID를 사용하여 이미지를 삭제합니다.
    • 팁: 실행 중인 컨테이너가 있어서 삭제가 안 될 경우, -f (force) 옵션을 사용할 수 있지만, 주의해서 사용해야 합니다. (docker rmi -f ubuntu)
  • docker build -t [새 이미지명]:[태그] [Dockerfile 경로]: 이미지 빌드 🏗️

    • 설명: Dockerfile이라는 스크립트 파일을 사용하여 나만의 커스텀 이미지를 생성합니다.
    • 예시: (Dockerfile이 현재 디렉토리에 있다고 가정)
      docker build -t my-web-app:1.0 .
    • 팁: .은 Dockerfile이 현재 디렉토리에 있음을 의미합니다.

2.2. 컨테이너 관리 명령어 📦

이제 다운로드하거나 빌드한 이미지를 가지고 실제 애플리케이션을 실행해볼 차례입니다!

  • docker run [옵션] [이미지명]:[태그] [실행할 명령어]: 컨테이너 생성 및 실행 (가장 중요!) 🚀

    • 설명: 지정된 이미지로부터 새로운 컨테이너를 생성하고 실행합니다. 다양한 옵션을 통해 컨테이너의 동작 방식을 제어할 수 있습니다.
    • 주요 옵션:
      • -d (detached): 컨테이너를 백그라운드에서 실행하고 터미널 제어권을 반환합니다. (데몬 모드)
      • -p [호스트 포트]:[컨테이너 포트] (port): 호스트의 특정 포트를 컨테이너의 특정 포트에 연결합니다. 웹 서버를 외부에 노출할 때 필수적입니다.
      • -v [호스트 경로]:[컨테이너 경로] (volume): 호스트 시스템의 디렉토리를 컨테이너 내부의 디렉토리와 공유(마운트)합니다. 데이터 영속성을 유지하거나 설정 파일을 외부에서 관리할 때 유용합니다.
      • --name [컨테이너명] (name): 컨테이너에 알아보기 쉬운 이름을 부여합니다. 이름을 지정하지 않으면 도커가 임의의 이름을 할당합니다.
      • -it (interactive, tty): 컨테이너와 상호작용할 수 있는 터미널을 연결합니다. 주로 컨테이너 내부로 들어가서 명령어를 실행할 때 사용합니다.
      • --rm (remove): 컨테이너가 종료될 때 자동으로 삭제되도록 합니다. 일회성 테스트 컨테이너에 유용합니다.
    • 예시:
      • docker run hello-world: hello-world 이미지를 기반으로 컨테이너를 실행하고 메시지를 출력 후 종료됩니다.
      • docker run -it ubuntu bash: 우분투 컨테이너를 실행하고 그 안에서 bash 셸에 접속합니다. (exit하면 컨테이너 종료)
      • docker run -d -p 80:80 --name my-nginx nginx: Nginx 컨테이너를 백그라운드에서 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하며, 컨테이너 이름을 my-nginx로 지정합니다.
      • docker run -d -p 3000:3000 -v /path/to/my/app:/usr/src/app --name my-node-app node:16-alpine npm start: Node.js 앱을 실행하며, 호스트의 /path/to/my/app 디렉토리를 컨테이너의 /usr/src/app에 마운트합니다.
  • docker ps: 실행 중인 컨테이너 목록 확인 📊

    • 설명: 현재 실행 중인 도커 컨테이너들의 목록을 보여줍니다.
    • -a (all): 종료된 컨테이너를 포함한 모든 컨테이너 목록을 보여줍니다.
    • 예시:
      docker ps
      docker ps -a
  • docker stop [컨테이너 ID 또는 컨테이너명]: 컨테이너 중지 🛑

    • 설명: 실행 중인 컨테이너를 우아하게(gracefully) 중지합니다.
    • 예시:
      • docker stop my-nginx
      • docker stop [컨테이너 ID]
  • docker start [컨테이너 ID 또는 컨테이너명]: 중지된 컨테이너 시작 ▶️

    • 설명: 이전에 중지된 컨테이너를 다시 시작합니다.
    • 예시:
      • docker start my-nginx
  • docker restart [컨테이너 ID 또는 컨테이너명]: 컨테이너 재시작 🔄

    • 설명: 실행 중이거나 중지된 컨테이너를 재시작합니다. stopstart를 한 번에 하는 것과 같습니다.
    • 예시:
      • docker restart my-nginx
  • docker rm [컨테이너 ID 또는 컨테이너명]: 컨테이너 삭제 🧹

    • 설명: 더 이상 필요 없는 컨테이너를 삭제합니다. 실행 중인 컨테이너는 삭제할 수 없으므로, 먼저 stop해야 합니다.
    • 예시:
      • docker rm my-nginx
      • docker rm -f my-nginx: 강제로 삭제합니다 (실행 중이어도 삭제).
  • docker exec -it [컨테이너 ID 또는 컨테이너명] [실행할 명령어]: 컨테이너 내부 명령어 실행 🚪

    • 설명: 실행 중인 컨테이너 내부에서 특정 명령어를 실행합니다. 컨테이너 내부로 들어가서 디버깅하거나 파일을 확인하고 싶을 때 유용합니다.
    • -it: 상호작용 가능한 터미널을 연결합니다.
    • 예시:
      • docker exec -it my-nginx bash: my-nginx 컨테이너 내부의 bash 셸에 접속합니다.
      • docker exec my-nginx ls -l /usr/share/nginx/html: my-nginx 컨테이너 내부의 특정 경로 파일을 확인합니다.
  • docker logs [컨테이너 ID 또는 컨테이너명]: 컨테이너 로그 확인 📜

    • 설명: 컨테이너의 표준 출력(stdout)과 표준 에러(stderr) 로그를 확인합니다. 애플리케이션의 동작 상태나 에러를 파악할 때 필수적입니다.
    • -f (follow): 실시간으로 새로운 로그를 계속해서 출력합니다.
    • --tail [숫자]: 로그의 마지막 N줄만 출력합니다.
    • 예시:
      • docker logs my-nginx: my-nginx 컨테이너의 모든 로그를 출력합니다.
      • docker logs -f my-nginx: my-nginx 컨테이너의 로그를 실시간으로 따라갑니다. (Ctrl+C로 종료)
      • docker logs --tail 100 my-nginx: my-nginx 컨테이너의 마지막 100줄 로그를 출력합니다.

3. 도커 유용한 시스템 명령어 & 활용 팁 ✨

도커 환경을 효율적으로 관리하고 디버깅하는 데 도움이 되는 추가 명령어와 팁입니다.

  • docker info: 도커 시스템 정보 확인 🖥️

    • 설명: 도커 클라이언트 및 서버(데몬)에 대한 자세한 정보를 보여줍니다. (컨테이너 수, 이미지 수, 스토리지 드라이버 등)
  • docker version: 도커 버전 정보 확인 🔢

    • 설명: 도커 클라이언트와 서버의 버전 정보를 보여줍니다.
  • docker system prune: 사용하지 않는 도커 리소스 정리 (강력 추천!) 🧹

    • 설명: 더 이상 사용되지 않는 컨테이너, 이미지, 볼륨, 네트워크 등을 한 번에 삭제하여 디스크 공간을 확보합니다. 도커를 사용하다 보면 불필요한 리소스가 많이 쌓이는데, 이 명령어는 디스크 공간 관리에 매우 유용합니다.
    • 주요 옵션:
      • -a (all): 빌드 캐시를 포함하여 모든 사용되지 않는 리소스를 삭제합니다. (가장 강력한 정리 옵션)
    • 예시:
      • docker system prune: 중지된 컨테이너, 사용되지 않는 네트워크, 빌드 캐시가 없는 이미지 등을 삭제할지 확인합니다.
      • docker system prune -a: 이 명령어를 실행하면 사용하지 않는 모든 도커 객체가 제거되므로 주의해서 사용하세요. 실행하기 전에 정말 필요한 데이터가 없는지 확인하세요!
  • docker inspect [컨테이너 ID 또는 이미지 ID]: 상세 정보 확인 🔍

    • 설명: 컨테이너나 이미지의 상세 설정(IP 주소, 볼륨 마운트 정보, 네트워크 설정 등)을 JSON 형식으로 출력합니다. 디버깅에 매우 유용합니다.
    • 예시:
      • docker inspect my-nginx
  • Docker Compose (활용 팁) 🏡

    • 여러 개의 컨테이너를 함께 정의하고 실행해야 할 때(웹 서버 + 데이터베이스 + 백엔드 API 등), docker compose를 사용하면 YAML 파일 하나로 모든 컨테이너의 설정, 연결, 의존성을 쉽게 관리할 수 있습니다.
    • 초보자는 docker run으로 한 개의 컨테이너를 다루는 데 익숙해진 후 docker compose를 학습하는 것을 추천합니다.
    • 주요 명령어:
      • docker compose up: docker-compose.yml 파일에 정의된 서비스들을 시작합니다.
      • docker compose down: docker compose up으로 시작된 서비스들을 중지하고 제거합니다.

4. 자주 묻는 질문 및 트러블슈팅 ❓

도커를 사용하다 보면 겪을 수 있는 몇 가지 일반적인 문제와 해결 팁입니다.

  • “Port is already allocated” (포트가 이미 사용 중입니다) 🤕

    • 문제: docker run -p 명령어를 사용할 때, 호스트의 해당 포트가 이미 다른 프로세스(다른 도커 컨테이너, 또는 로컬 PC의 다른 프로그램)에 의해 사용 중인 경우 발생합니다.
    • 해결:
      1. docker ps -a로 다른 도커 컨테이너가 해당 포트를 사용하고 있는지 확인하고, 필요하다면 중지하거나 삭제합니다.
      2. netstat -tulnp | grep [포트번호] (Linux/macOS) 또는 netstat -ano | findstr :[포트번호] (Windows CMD) 명령어로 로컬 PC에서 어떤 프로세스가 해당 포트를 사용하고 있는지 확인합니다.
      3. docker run 명령어에서 호스트 포트 번호를 다른 비어 있는 포트로 변경합니다. (예: -p 8080:80 대신 -p 8081:80)
  • “No such image: [이미지명]” (해당 이미지가 없습니다) 🖼️❌

    • 문제: docker run 또는 docker rmi 등을 실행할 때 지정한 이미지가 로컬에 없거나 오타가 있는 경우 발생합니다.
    • 해결:
      1. docker images 명령어로 로컬에 어떤 이미지가 있는지 정확히 확인합니다.
      2. docker pull [이미지명]:[태그] 명령어로 이미지를 먼저 다운로드합니다.
      3. 이미지 이름 또는 태그에 오타가 없는지 확인합니다.
  • 컨테이너가 실행되지 않고 바로 종료됩니다. 🔇

    • 문제: docker run -d로 컨테이너를 실행했는데 docker ps에 나타나지 않고 docker ps -a로 보면 Exited 상태인 경우입니다. 주로 컨테이너 내부의 메인 프로세스가 바로 종료되는 경우 발생합니다.
    • 해결:
      1. docker logs [컨테이너명] 명령어로 컨테이너의 로그를 확인합니다. 대부분의 경우 여기에 종료의 원인(예: 설정 오류, 필요한 파일 없음, 애플리케이션 크래시 등)이 명시되어 있습니다.
      2. -it bash 옵션으로 컨테이너 내부에 접속하여 직접 명령어를 실행해 보거나, 문제가 되는 부분을 디버깅합니다. (예: docker run -it [이미지명] bash)
      3. Dockerfile에 문제가 없는지 확인하고 다시 이미지를 빌드해 봅니다.

결론: 도커, 두려워 말고 즐기세요! 🎉

지금까지 도커의 핵심 개념부터 이미지 및 컨테이너를 다루는 필수 명령어, 그리고 유용한 활용 팁까지 자세히 살펴보았습니다. 처음에는 복잡해 보일 수 있지만, 몇 번 직접 명령어를 입력하고 결과를 확인하다 보면 금세 익숙해질 거예요!

도커는 개발 환경을 표준화하고, 애플리케이션 배포를 간소화하며, 개발 효율성을 극대화하는 강력한 도구입니다. 이 가이드가 여러분이 도커를 시작하는 데 훌륭한 첫걸음이 되기를 바랍니다.

이제 여러분도 도커를 사용하여 더 스마트하게 개발하고 배포할 수 있습니다! 다음 단계로는 Dockerfile 작성법과 Docker Compose를 학습하여 여러 컨테이너를 통합 관리하는 방법을 익혀보시는 것을 추천합니다.

궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 여러분의 도커 여정을 응원합니다! 🚀💪

답글 남기기

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