화. 8월 12th, 2025

G: 안녕하세요, 개발자 여러분! 🚀 현대 소프트웨어 개발에서 Docker는 선택이 아닌 필수가 되어가고 있죠. 개발 환경의 일관성을 유지하고, 애플리케이션 배포를 간소화하며, 서버 자원을 효율적으로 관리하는 데 Docker만큼 강력한 도구는 없을 겁니다.

하지만 막상 Docker를 시작하려 하면 수많은 명령어에 압도되기 쉽습니다. run, build, ps, exec… 🤔 이 모든 것을 외우기란 쉽지 않죠. 그래서 준비했습니다! 이 블로그 글은 Docker를 다루는 데 필요한 필수 명령어들을 한눈에 볼 수 있도록 정리한 치트시트입니다. 최신 버전의 Docker 사용 트렌드를 반영하여 가장 실용적인 내용만을 담았습니다.

이제 더 이상 헤매지 마세요! 이 치트시트 하나면 Docker 마스터에 한 발 더 다가갈 수 있을 거예요. 💪


목차

  1. Docker 핵심 개념 간략히 이해하기 💡
  2. I. Docker 설치 및 기본 확인 명령어 ⚙️
  3. II. 이미지(Image) 관리 명령어 🖼️
  4. III. 컨테이너(Container) 관리 명령어 📦
  5. IV. 볼륨(Volume) 관리 명령어 💾
  6. V. 네트워크(Network) 관리 명령어 🌐
  7. VI. 도커 컴포즈(Docker Compose) 명령어 🐳
  8. VII. 기타 유용한 명령어 (정리 및 정보) 🧹
  9. 마무리하며

1. Docker 핵심 개념 간략히 이해하기 💡

명령어를 배우기 전에 Docker의 핵심 개념 몇 가지만 짚고 넘어가 볼까요?

  • 이미지(Image): 애플리케이션 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 포함하는 읽기 전용 템플릿입니다. 비유하자면 붕어빵 틀과 같아요. 🖼️
  • 컨테이너(Container): 이미지의 실행 가능한 인스턴스입니다. 이미지를 통해 생성되며, 격리된 환경에서 애플리케이션이 실행됩니다. 붕어빵 틀로 찍어낸 실제 붕어빵이죠! 📦
  • 볼륨(Volume): 컨테이너가 삭제되어도 데이터가 사라지지 않도록 영구적으로 데이터를 저장하는 공간입니다. 중요한 데이터를 보관하는 금고와 같아요. 💾
  • 네트워크(Network): 컨테이너들이 서로 또는 외부와 통신할 수 있도록 연결하는 방식입니다. 컨테이너들 간의 대화 채널이죠. 🔗

자, 이제 이 개념들을 바탕으로 필수 명령어들을 파헤쳐 봅시다!


I. Docker 설치 및 기본 확인 명령어 ⚙️

Docker를 사용하기 위한 첫걸음입니다. 설치 후 정상 작동하는지 확인하는 명령어들이죠.

  • Docker 버전 확인:

    docker --version
    Docker version 24.0.5, build ced0996

    💬 설치된 Docker 클라이언트와 엔진의 버전을 확인합니다.

  • Docker 시스템 정보 확인:

    docker info
    Client:
     Version:    24.0.5
     ...
    Server:
     Containers: 5
     Images: 10
     ...

    💬 Docker 클라이언트와 서버(Daemon)의 자세한 정보를 보여줍니다. 컨테이너, 이미지, 스토리지 등 전반적인 상태를 파악할 때 유용해요.


II. 이미지(Image) 관리 명령어 🖼️

컨테이너를 만들기 위한 기본 단위인 이미지를 검색하고, 다운로드하고, 만들고, 삭제하는 명령어들입니다.

  • 이미지 검색:

    docker search <이미지_이름>

    예시: Ubuntu 이미지를 검색하고 싶을 때

    docker search ubuntu
    NAME                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    ubuntu                       Ubuntu is a Debian-based Linux operating sys...   15975     [OK]
    ...

    🔎 Docker Hub에서 공개된 이미지를 검색합니다. 별표(STARS)가 높을수록 인기가 많고 신뢰할 수 있는 이미지일 가능성이 높습니다.

  • 이미지 다운로드 (Pull):

    docker pull <이미지_이름>[:태그]

    예시: nginx 이미지의 latest 버전을 다운로드

    docker pull nginx:latest

    💬 Docker Hub 또는 설정된 레지스트리에서 이미지를 로컬로 다운로드합니다. 태그를 지정하지 않으면 기본적으로 latest 태그를 다운로드합니다. 📥

  • 로컬 이미지 목록 확인:

    docker images
    docker images -a # 숨겨진(중간 빌드) 이미지까지 포함
    REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    nginx         latest    658535560f4e   2 weeks ago    187MB
    ubuntu        latest    f750b336332c   2 weeks ago    77.8MB

    📸 현재 로컬에 저장된 이미지들의 목록을 보여줍니다. IMAGE ID는 이미지의 고유 식별자입니다.

  • Dockerfile로 이미지 빌드:

    docker build -t <이미지_이름>[:태그] <Dockerfile_경로>

    예시: 현재 디렉터리(. )의 Dockerfile로 my-app 이미지를 빌드하고 v1.0 태그를 부여

    docker build -t my-app:v1.0 .

    🏗️ Dockerfile이라는 설계도를 이용해 새로운 이미지를 만듭니다. -t 옵션으로 이미지 이름과 태그를 지정할 수 있습니다. . 은 현재 디렉터리에 Dockerfile이 있음을 의미합니다.

  • 이미지 태그 변경/추가:

    docker tag <원본_이미지>:<원본_태그> <새_이미지_이름>:<새_태그>

    예시: my-app:v1.0 이미지를 my-app:latest로 태그 추가

    docker tag my-app:v1.0 my-app:latest

    🏷️ 기존 이미지에 새로운 태그를 추가하거나 이름을 변경할 때 사용합니다. 원본 이미지는 그대로 유지됩니다.

  • 이미지 삭제:

    docker rmi <이미지_ID_또는_이름>[:태그]
    docker rmi -f <이미지_ID_또는_이름>[:태그] # 강제 삭제 (컨테이너가 사용 중이어도)

    예시: ubuntu 이미지를 삭제

    docker rmi ubuntu

    예시: nginx 이미지를 ID로 강제 삭제

    docker rmi -f 658535560f4e

    🗑️ 로컬에 저장된 이미지를 삭제합니다. 컨테이너가 해당 이미지를 사용 중인 경우 바로 삭제되지 않으며, -f 옵션으로 강제 삭제할 수 있습니다.


III. 컨테이너(Container) 관리 명령어 📦

Docker의 핵심! 이미지를 실행하여 컨테이너를 생성하고, 관리하는 데 필요한 가장 중요한 명령어들입니다.

  • 컨테이너 실행 (Run):

    docker run [옵션] <이미지_이름>[:태그] [명령어] [인자...]

    가장 중요하고 옵션이 많은 명령어입니다. 주요 옵션과 예시를 살펴볼게요.

    • 기본 실행 (Hello World):

      docker run hello-world

      💬 간단히 hello-world 이미지를 실행하여 Docker가 제대로 작동하는지 확인합니다. 실행 후 자동으로 종료됩니다.

    • 백그라운드 실행 (Detached Mode): -d

      docker run -d --name my-nginx -p 80:80 nginx

      💬 컨테이너를 백그라운드에서 실행하고, 터미널을 점유하지 않습니다. --name으로 컨테이너 이름을 지정하고, -p로 호스트와 컨테이너의 포트를 연결합니다. (호스트_포트:컨테이너_포트) 🌐

    • 대화형(Interactive) 모드: -it

      docker run -it ubuntu /bin/bash

      💬 컨테이너 내부로 접속하여 터미널 환경을 사용할 때 유용합니다. (-i: 대화형, -t: TTY 할당). 컨테이너 종료 시 세션도 종료됩니다. 🧑‍💻

    • 볼륨 마운트: -v

      docker run -d -p 80:80 --name my-web -v /Users/your_name/my_html:/usr/share/nginx/html nginx

      💬 호스트 머신의 특정 경로를 컨테이너 내부의 경로에 연결(마운트)합니다. 컨테이너가 삭제되어도 데이터는 호스트에 남아있습니다. 📁➡️📂

    • 환경 변수 설정: -e

      docker run -e MY_VARIABLE="Hello Docker" ubuntu bash -c 'echo $MY_VARIABLE'

      💬 컨테이너 내부에서 사용할 환경 변수를 설정합니다.

    • 재시작 정책: --restart

      docker run -d --restart always --name my-app my-app:latest

      💬 컨테이너가 예기치 않게 종료되거나 Docker 데몬이 재시작될 때 컨테이너의 재시작 정책을 설정합니다. always, on-failure, unless-stopped, no 등의 옵션이 있습니다. 🔁

  • 실행 중인 컨테이너 목록 확인:

    docker ps
    docker ps -a # 모든 컨테이너 (실행 중 + 종료됨)
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
    a1b2c3d4e5f6   nginx     "nginx -g 'daemon of..."   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp     my-nginx

    📋 현재 실행 중인 컨테이너들의 목록을 보여줍니다. docker ps -a는 종료된 컨테이너까지 모두 보여줍니다.

  • 컨테이너 시작:

    docker start <컨테이너_ID_또는_이름>

    예시:

    docker start my-nginx

    ▶️ 중지된 컨테이너를 다시 시작합니다.

  • 컨테이너 중지:

    docker stop <컨테이너_ID_또는_이름>

    예시:

    docker stop my-nginx

    ⏸️ 실행 중인 컨테이너를 정상적으로 중지합니다.

  • 컨테이너 강제 중지:

    docker kill <컨테이너_ID_또는_이름>

    예시:

    docker kill my-nginx

    💥 실행 중인 컨테이너를 강제로 중지합니다. stop 명령어로 중지되지 않을 때 사용합니다.

  • 컨테이너 재시작:

    docker restart <컨테이너_ID_또는_이름>

    예시:

    docker restart my-nginx

    🔁 실행 중인 컨테이너를 중지하고 다시 시작합니다.

  • 컨테이너 삭제:

    docker rm <컨테이너_ID_또는_이름>
    docker rm -f <컨테이너_ID_또는_이름> # 실행 중인 컨테이너도 강제 삭제

    예시:

    docker rm my-nginx

    예시: 실행 중인 my-nginx 컨테이너를 강제 삭제

    docker rm -f my-nginx

    ❌ 중지된 컨테이너를 삭제합니다. 실행 중인 컨테이너는 -f 옵션 없이는 삭제되지 않습니다.

  • 컨테이너에 명령어 실행 (Attach/Exec):

    • Attach: 컨테이너의 표준 입출력에 연결합니다.
      docker attach <컨테이너_ID_또는_이름>

      💬 컨테이너가 시작될 때의 기본 프로세스에 연결됩니다. 주로 로그를 보거나 컨테이너를 제어할 때 사용됩니다. Ctrl+P, Ctrl+Q로 세션을 분리할 수 있습니다.

    • Exec: 실행 중인 컨테이너 내부에 새로운 프로세스를 실행합니다.
      docker exec [옵션] <컨테이너_ID_또는_이름> <실행할_명령어> [인자...]

      예시: my-app 컨테이너 내부에서 bash 셸 실행

      docker exec -it my-app /bin/bash

      🧑‍💻 컨테이너의 주 프로세스에 영향을 주지 않고 특정 명령어를 실행할 때 사용합니다. -it 옵션으로 대화형 셸에 접속할 수 있어 가장 자주 사용되는 명령어 중 하나입니다.

  • 컨테이너 로그 확인:

    docker logs <컨테이너_ID_또는_이름>
    docker logs -f <컨테이너_ID_또는_이름> # 실시간 스트리밍 (Follow)
    docker logs --tail 100 <컨테이너_ID_또는_이름> # 마지막 100줄만 보기

    예시:

    docker logs my-nginx

    📜 컨테이너의 표준 출력(stdout)과 표준 에러(stderr) 로그를 보여줍니다. -f 옵션으로 실시간으로 로그를 추적할 수 있어 디버깅에 매우 유용합니다.

  • 호스트-컨테이너 간 파일 복사:

    docker cp <원본_경로> <대상_경로>

    예시: 호스트의 파일을 컨테이너로 복사

    docker cp ./index.html my-nginx:/usr/share/nginx/html/index.html

    예시: 컨테이너의 파일을 호스트로 복사

    docker cp my-nginx:/var/log/nginx/access.log ./nginx_access.log

    📁➡️📂 호스트와 컨테이너 사이에서 파일을 복사할 때 사용합니다.

  • 컨테이너 상태 모니터링:

    docker stats
    CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
    a1b2c3d4e5f6   my-nginx   0.00%     2.348MiB / 1.944GiB   0.12%     6.47kB / 5.25kB   0B / 0B           7

    📊 실행 중인 컨테이너들의 CPU, 메모리, 네트워크, 디스크 I/O 사용량 등을 실시간으로 보여줍니다. 리소스 모니터링에 좋아요.

  • 컨테이너 상세 정보 확인:

    docker inspect <컨테이너_ID_또는_이름>

    예시:

    docker inspect my-nginx

    🔍 컨테이너의 네트워크 설정, 볼륨 마운트, 환경 변수 등 JSON 형식의 자세한 정보를 출력합니다. 디버깅에 필수적입니다.


IV. 볼륨(Volume) 관리 명령어 💾

컨테이너의 데이터를 영구적으로 저장하고 관리하는 데 필요한 명령어들입니다.

  • 볼륨 생성:

    docker volume create <볼륨_이름>

    예시: my-data라는 이름의 볼륨 생성

    docker volume create my-data

    💾➕ 데이터를 저장할 명명된 볼륨을 생성합니다.

  • 볼륨 목록 확인:

    docker volume ls
    DRIVER    VOLUME NAME
    local     my-data

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

  • 볼륨 상세 정보 확인:

    docker volume inspect <볼륨_이름>

    예시:

    docker volume inspect my-data

    🔍 볼륨의 마운트 경로, 드라이버 등 자세한 정보를 JSON 형식으로 보여줍니다.

  • 볼륨 삭제:

    docker volume rm <볼륨_이름>

    예시: my-data 볼륨 삭제

    docker volume rm my-data

    🗑️ 생성된 볼륨을 삭제합니다. 사용 중인 볼륨은 삭제되지 않습니다.


V. 네트워크(Network) 관리 명령어 🌐

컨테이너들이 서로 통신하거나 외부와 통신할 수 있도록 네트워크를 관리하는 명령어들입니다.

  • 네트워크 생성:

    docker network create <네트워크_이름>

    예시: my-app-network라는 이름의 네트워크 생성

    docker network create my-app-network

    🌐➕ 컨테이너들이 서로 격리된 환경에서 통신할 수 있도록 새로운 네트워크를 생성합니다.

  • 네트워크 목록 확인:

    docker network ls
    NETWORK ID     NAME              DRIVER    SCOPE
    a1b2c3d4e5f6   bridge            bridge    local
    c7d8e9f0a1b2   host              host      local
    e3f4a5b6c7d8   none              null      local
    f9a0b1c2d3e4   my-app-network    bridge    local

    📊 현재 존재하는 네트워크들의 목록을 보여줍니다. bridge, host, none은 Docker가 기본으로 제공하는 네트워크입니다.

  • 네트워크 상세 정보 확인:

    docker network inspect <네트워크_이름>

    예시:

    docker network inspect my-app-network

    🔍 네트워크에 연결된 컨테이너 정보, IP 주소 범위 등 자세한 정보를 JSON 형식으로 보여줍니다.

  • 컨테이너를 네트워크에 연결/해제:

    docker network connect <네트워크_이름> <컨테이너_ID_또는_이름>
    docker network disconnect <네트워크_이름> <컨테이너_ID_또는_이름>

    예시: my-nginx 컨테이너를 my-app-network에 연결

    docker network connect my-app-network my-nginx

    🔗 컨테이너가 다른 컨테이너와 통신할 수 있도록 특정 네트워크에 연결하거나 해제합니다. docker run --network 옵션으로 처음부터 연결할 수도 있습니다.

  • 네트워크 삭제:

    docker network rm <네트워크_이름>

    예시: my-app-network 네트워크 삭제

    docker network rm my-app-network

    🗑️ 생성된 네트워크를 삭제합니다. 사용 중인 네트워크는 삭제되지 않습니다.


VI. 도커 컴포즈(Docker Compose) 명령어 🐳

여러 개의 컨테이너를 하나의 서비스로 정의하고 관리할 때 사용하는 도구입니다. 복잡한 애플리케이션 환경을 쉽게 구축하고 실행할 수 있게 해줍니다. docker-compose.yml 파일이 필요합니다.

docker-compose.yml 예시:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db_data:/var/lib/postgresql/data
volumes:
  db_data:
  • 서비스 빌드 및 실행:

    docker-compose up [-d] [--build]

    예시: 백그라운드에서 서비스 실행 및 이미지 재빌드

    docker-compose up -d --build

    ⬆️ docker-compose.yml 파일에 정의된 모든 서비스를 빌드하고 실행합니다. -d는 백그라운드 실행, --build는 이미지 변경 시 다시 빌드합니다.

  • 서비스 중지 및 컨테이너 삭제:

    docker-compose down [--volumes] [--rmi all]

    예시: 모든 컨테이너와 볼륨을 삭제

    docker-compose down --volumes

    ⬇️ docker-compose up으로 생성된 컨테이너들을 중지하고 삭제합니다. --volumes 옵션으로 볼륨까지 삭제할 수 있습니다.

  • 실행 중인 서비스 컨테이너 확인:

    docker-compose ps
    NAME           COMMAND                  SERVICE   STATUS    PORTS
    my-app-web-1   "nginx -g 'daemon of..."   web       running   0.0.0.0:80->80/tcp
    my-app-db-1    "docker-entrypoint.s..."   db        running   5432/tcp

    📋 docker-compose.yml 파일에 정의된 서비스들의 컨테이너 상태를 보여줍니다.

  • 서비스 로그 확인:

    docker-compose logs [서비스_이름] [-f]

    예시: web 서비스의 로그를 실시간으로 확인

    docker-compose logs web -f

    📜 특정 서비스 또는 모든 서비스의 로그를 출력합니다. -f 옵션으로 실시간 로그를 볼 수 있습니다.

  • 서비스 컨테이너 내부에 명령어 실행:

    docker-compose exec [옵션] <서비스_이름> <실행할_명령어> [인자...]

    예시: db 서비스 컨테이너에서 psql 셸 실행

    docker-compose exec db psql -U user mydb

    🧑‍💻 특정 서비스의 컨테이너 내부에서 명령어를 실행합니다. docker exec와 유사합니다.


VII. 기타 유용한 명령어 (정리 및 정보) 🧹

Docker 환경을 깨끗하게 유지하고, 전반적인 정보를 얻을 수 있는 명령어들입니다.

  • 사용되지 않는 Docker 객체 일괄 삭제:

    docker system prune
    docker system prune -a # 사용 중이지 않은 이미지까지 모두 삭제

    예시:

    docker system prune
    WARNING! This will remove:
      - all stopped containers
      - all networks not used by at least one container
      - all dangling images
      - all build cache
    ? Are you sure you want to continue? [y/N] y

    🧹 중지된 컨테이너, 사용되지 않는 네트워크, dangling 이미지(태그 없이 남은 이미지) 등을 한 번에 삭제하여 디스크 공간을 확보합니다. -a 옵션을 사용하면 사용 중인 컨테이너에 의해 참조되지 않는 모든 이미지까지 삭제됩니다. 주기적으로 실행하면 좋아요!

  • Docker 버전 정보 출력 (더 상세히):

    docker version

    ℹ️ 클라이언트 및 서버(데몬)의 버전 정보를 JSON 형식으로 상세하게 출력합니다.


마무리하며 ✨

지금까지 Docker를 다루는 데 필요한 필수 명령어들을 자세히 살펴보았습니다. 이 치트시트는 Docker의 방대한 기능 중 가장 자주 사용되고 핵심적인 부분들을 모아놓은 것입니다.

이 명령어들을 단순히 외우기보다는, 각 명령어가 어떤 역할을 하고 어떤 상황에서 사용되는지 예시를 통해 직접 따라 해보면서 익숙해지는 것이 중요합니다. 💻

Docker는 끊임없이 발전하고 있으므로, Docker 공식 문서를 참고하여 최신 기능과 권장 사항을 확인하는 습관을 들이는 것도 좋습니다. 이 치트시트가 여러분의 Docker 여정에 든든한 동반자가 되기를 바랍니다! Happy Dockering! 🐳🎉

답글 남기기

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