G: 안녕하세요, 개발자 여러분! 🚀 컨테이너 기술의 대명사, 도커(Docker)는 이제 개발 환경 구축과 배포의 필수 요소가 되었습니다. 효율적인 컨테이너 관리를 위해서는 강력한 도커 CLI(Command Line Interface) 명령어에 대한 이해가 필수적인데요. 단순히 몇 가지 명령어를 아는 것을 넘어, 상황에 맞춰 적절히 활용하는 것이 도커 마스터의 길입니다.
이 글에서는 도커의 가장 기본적인 명령어부터 실무에서 유용하게 쓰이는 고급 명령어, 그리고 몇 가지 꿀팁까지! 마치 사전을 펼쳐보듯 상세하게 알려드릴게요. 도커 초보자부터 숙련자까지 모두에게 도움이 되는 완벽 가이드를 목표로 합니다. ✨
📦 1. 도커의 시작: 기본 중의 기본! 필수 명령어
가장 먼저 알아야 할 도커 명령어들입니다. 컨테이너를 생성하고, 실행하고, 중지하고, 삭제하는 기본적인 흐름을 이해하는 데 핵심적인 명령어들이죠.
1.1. 도커 설치 확인 및 정보 보기
docker --version
: 현재 설치된 도커의 버전 정보를 확인합니다.docker --version # Docker version 24.0.7, build afdd53b
docker info
: 도커 설치 환경에 대한 상세 정보를 출력합니다. 총 이미지 수, 컨테이너 수(실행 중/중지됨), 스토리지 드라이버 등 다양한 정보를 볼 수 있습니다. 문제 발생 시 유용한 진단 도구입니다.docker info # Client: # Context: default # Debug Mode: false # Server: # Containers: 3 # Running: 1 # Paused: 0 # Stopped: 2 # ...
docker login
/docker logout
: Docker Hub와 같은 컨테이너 레지스트리에 로그인하거나 로그아웃합니다. 이미지를 공유하거나 가져올 때 사용합니다.docker login # Login with your Docker ID to push and pull images, # or create an account if you don't have one. # Username: mydockerid # Password:
1.2. 이미지(Image) 관리
이미지는 컨테이너를 만들 때 필요한 ‘템플릿’입니다.
docker pull [이미지 이름][:태그]
: Docker Hub 등 원격 레지스트리에서 이미지를 다운로드합니다. 태그를 지정하지 않으면 최신(latest) 버전을 받습니다.docker pull ubuntu:22.04 # Ubuntu 22.04 이미지 다운로드 docker pull nginx # Nginx 최신 이미지 다운로드
docker images
/docker image ls
: 로컬에 다운로드된 이미지 목록을 보여줍니다.docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # ubuntu 22.04 5b3296c0bc81 2 weeks ago 77.8MB # nginx latest a9a79766cd64 2 weeks ago 187MB
docker rmi [이미지 ID 또는 이미지 이름][:태그]
: 로컬 이미지를 삭제합니다. 이미지를 사용하는 컨테이너가 있다면 먼저 해당 컨테이너를 삭제해야 합니다.docker rmi ubuntu:22.04 # 특정 태그 이미지 삭제 docker rmi a9a79766cd64 # 이미지 ID로 삭제 docker rmi $(docker images -q) # 모든 이미지 삭제 (주의!)
1.3. 컨테이너(Container) 라이프사이클 관리 🏗️🏃♂️
컨테이너는 이미지로부터 생성된 ‘실행 가능한 인스턴스’입니다.
-
docker run [옵션] [이미지 이름][:태그] [실행할 명령어]
: 이미지를 기반으로 새로운 컨테이너를 생성하고 실행합니다. 가장 많이 쓰이는 명령어 중 하나입니다.-d
,--detach
: 컨테이너를 백그라운드에서 실행합니다. 터미널을 점유하지 않습니다.-p [호스트포트]:[컨테이너포트]
/--publish
: 호스트의 포트와 컨테이너의 포트를 연결(포트 포워딩)합니다. 외부에서 컨테이너 서비스에 접근할 수 있게 합니다.--name [이름]
: 컨테이너에 이름을 부여합니다. 이름을 지정하지 않으면 무작위 이름이 할당됩니다.-it
,--interactive --tty
: 컨테이너와 상호작용 가능한 터미널(bash, sh 등)을 실행합니다. 보통 컨테이너 내부로 진입할 때 사용합니다.-v [호스트경로]:[컨테이너경로]
/--volume
: 호스트의 디렉토리를 컨테이너 내부에 마운트합니다. 데이터 지속성(persistence)을 확보할 때 유용합니다.--rm
: 컨테이너 종료 시 자동으로 삭제합니다. 일회성 테스트용 컨테이너에 유용합니다.--env [키=값]
/-e
: 컨테이너 내부에 환경 변수를 설정합니다.
예시:
# 1. Nginx 웹 서버 컨테이너를 백그라운드에서 실행하고, 호스트의 8080 포트와 컨테이너의 80 포트를 연결, 컨테이너 이름은 'my-nginx'로 지정 docker run -d -p 8080:80 --name my-nginx nginx # 2. Ubuntu 컨테이너를 상호작용 모드로 실행하여 bash 쉘로 접속 docker run -it ubuntu:22.04 bash # 3. MySQL 컨테이너 실행 (환경 변수 설정 및 종료 시 자동 삭제) docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword --rm mysql:8.0
-
docker ps
/docker container ls
: 현재 실행 중인 컨테이너 목록을 보여줍니다.-a
,--all
: 모든 컨테이너(실행 중이거나 중지된 컨테이너 모두)를 보여줍니다.-s
,--size
: 컨테이너의 가상 크기를 표시합니다.
docker ps # 실행 중인 컨테이너만 docker ps -a # 모든 컨테이너
-
docker stop [컨테이너 ID 또는 이름]
: 실행 중인 컨테이너를 ‘정상적으로’ 중지합니다. 컨테이너 내부 프로세스에 SIGTERM 시그널을 보냅니다.docker stop my-nginx
-
docker start [컨테이너 ID 또는 이름]
: 중지된 컨테이너를 다시 시작합니다.docker start my-nginx
-
docker restart [컨테이너 ID 또는 이름]
: 실행 중인 컨테이너를 중지했다가 다시 시작합니다.docker restart my-nginx
-
docker rm [컨테이너 ID 또는 이름]
: 중지된 컨테이너를 삭제합니다. 실행 중인 컨테이너를 삭제하려면-f
또는--force
옵션을 사용해야 합니다.docker rm my-nginx # 중지된 컨테이너 삭제 docker rm -f my-nginx # 실행 중인 컨테이너 강제 삭제
-
docker kill [컨테이너 ID 또는 이름]
: 실행 중인 컨테이너를 ‘강제로’ 종료합니다.SIGKILL
시그널을 보냅니다.stop
명령어로 종료되지 않을 때 사용합니다.docker kill my-nginx
1.4. 불필요한 자원 한 번에 정리하기 🧹
도커는 사용하지 않는 이미지, 컨테이너, 볼륨 등이 쌓여 공간을 차지할 수 있습니다.
-
docker system prune
: 사용하지 않는(dangling) 이미지, 중지된 컨테이너, 사용하지 않는 네트워크 등 대부분의 불필요한 도커 자원을 삭제합니다.-a
,--all
:dangling
이미지뿐만 아니라 사용되지 않는 모든 이미지를 삭제합니다.--volumes
: 사용되지 않는 볼륨도 함께 삭제합니다. (이 옵션은 데이터를 날릴 수 있으므로 주의해서 사용해야 합니다.)
docker system prune # 기본 정리 (dangling 이미지, 중지된 컨테이너 등) docker system prune -a # dangling 이미지를 포함한 모든 사용되지 않는 이미지 삭제 docker system prune --volumes # 사용되지 않는 볼륨까지 모두 삭제 (주의!)
🔍 2. 한 단계 UP! 컨테이너 심화 활용 명령어
컨테이너의 내부를 들여다보고, 파일에 접근하며, 성능을 모니터링하는 등 좀 더 심층적인 관리에 필요한 명령어들입니다.
2.1. 컨테이너 내부 접근 및 상호작용
-
docker exec [옵션] [컨테이너 ID 또는 이름] [실행할 명령어]
: 이미 실행 중인 컨테이너 내부에 새로운 명령어를 실행합니다. 컨테이너의 주 프로세스와는 별개로 동작합니다. 주로 컨테이너 내부로 접속하여 작업을 수행할 때 사용합니다.-it
: 상호작용 가능한 터미널을 엽니다.
예시:
# 실행 중인 'my-nginx' 컨테이너에 접속하여 bash 쉘 실행 docker exec -it my-nginx bash # 'my-nginx' 컨테이너 내부에서 Nginx 설정 파일 목록 보기 docker exec my-nginx ls /etc/nginx/conf.d
💡
docker run -it [이미지] bash
는 새 컨테이너를 만들고 bash를 실행하는 반면,docker exec -it [컨테이너] bash
는 이미 실행 중인 컨테이너에 진입하는 차이가 있습니다. -
docker logs [옵션] [컨테이너 ID 또는 이름]
: 컨테이너의 표준 출력(stdout) 및 표준 에러(stderr) 로그를 확인합니다. 디버깅에 필수적입니다.-f
,--follow
: 실시간으로 로그를 계속 출력합니다.-t
,--timestamps
: 로그 앞에 타임스탬프를 추가합니다.--tail [줄 수]
: 로그의 마지막 몇 줄만 출력합니다.
예시:
docker logs my-nginx # 'my-nginx' 컨테이너의 모든 로그 출력 docker logs -f my-nginx # 'my-nginx' 컨테이너의 로그를 실시간으로 계속 출력 docker logs --tail 100 my-nginx # 'my-nginx' 컨테이너 로그의 마지막 100줄 출력
-
docker inspect [객체 ID 또는 이름]
: 도커 객체(컨테이너, 이미지, 볼륨, 네트워크 등)의 상세 정보를 JSON 형식으로 출력합니다. IP 주소, 마운트된 볼륨, 포트 매핑 등 다양한 정보를 얻을 수 있습니다.docker inspect my-nginx # 'my-nginx' 컨테이너의 상세 정보 docker inspect nginx:latest # 'nginx:latest' 이미지의 상세 정보 docker inspect $(docker ps -q) # 실행 중인 모든 컨테이너의 상세 정보
💡 특정 정보만 추출하고 싶다면
jq
같은 JSON 파서를 함께 사용하면 편리합니다.docker inspect my-nginx | jq '.[0].NetworkSettings.IPAddress' # "172.17.0.2"
2.2. 컨테이너 자원 모니터링 📈
-
docker stats [컨테이너 ID 또는 이름]
: 실행 중인 컨테이너의 CPU, 메모리, 네트워크 I/O 사용량 등을 실시간으로 보여줍니다.docker stats my-nginx # 특정 컨테이너 통계 docker stats # 모든 실행 중인 컨테이너 통계
💡 작업 관리자/Task Manager와 유사하게 작동하여 컨테이너의 성능 병목 현상을 파악하는 데 유용합니다.
-
docker top [컨테이너 ID 또는 이름]
: 컨테이너 내부에서 실행 중인 프로세스 목록을 보여줍니다.docker top my-nginx # UID PID PPID C STIME TTY TIME CMD # root 1 0 0 02:30 ? 00:00:00 nginx: master process nginx -g daemon off; # system 6 1 0 02:30 ? 00:00:00 nginx: worker process
2.3. 컨테이너 파일 시스템 조작 ↔️
-
docker cp [원본 경로] [대상 경로]
: 호스트와 컨테이너 간에 파일을 복사합니다.- 호스트 -> 컨테이너:
docker cp [호스트 경로] [컨테이너 ID 또는 이름]:[컨테이너 경로]
- 컨테이너 -> 호스트:
docker cp [컨테이너 ID 또는 이름]:[컨테이너 경로] [호스트 경로]
예시:
# 호스트의 index.html 파일을 'my-nginx' 컨테이너의 /usr/share/nginx/html/ 경로로 복사 docker cp ./index.html my-nginx:/usr/share/nginx/html/index.html # 'my-nginx' 컨테이너의 Nginx 설정 파일을 호스트로 복사 docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
- 호스트 -> 컨테이너:
-
docker rename [기존 컨테이너 이름] [새로운 컨테이너 이름]
: 컨테이너의 이름을 변경합니다.docker rename my-nginx web-server-prod
-
docker update [컨테이너 ID 또는 이름] [옵션]
: 실행 중인 컨테이너의 리소스 제약 조건을 업데이트합니다. (예: CPU, 메모리 제한)docker update --cpus 0.5 --memory 512m my-nginx # 'my-nginx' 컨테이너의 CPU 사용량을 0.5 코어로, 메모리를 512MB로 제한
🛠️ 3. 이미지 빌드 & 관리 마스터하기!
직접 이미지를 만들고 관리하는 것은 도커 활용의 꽃입니다. Dockerfile
을 통해 원하는 환경을 직접 정의하고 배포할 수 있습니다.
3.1. Dockerfile
기본 개념
Dockerfile
은 이미지를 빌드하기 위한 지시 사항을 담은 텍스트 파일입니다. 이 파일을 통해 애플리케이션의 의존성 설치, 환경 설정, 실행 명령 등을 명시할 수 있습니다.
3.2. 이미지 빌드
-
docker build [옵션] [경로]
:Dockerfile
을 사용하여 새로운 이미지를 빌드합니다. 경로(Context)는Dockerfile
이 위치한 디렉토리입니다.-t [이미지 이름][:태그]
/--tag
: 빌드된 이미지에 이름과 태그를 부여합니다.--no-cache
: 빌드 시 캐시를 사용하지 않고 항상 새로 빌드합니다.
예시: (현재 디렉토리에 Dockerfile이 있다고 가정)
# 현재 디렉토리의 Dockerfile을 사용하여 'my-app:1.0'이라는 이름의 이미지 빌드 docker build -t my-app:1.0 . # 캐시를 사용하지 않고 이미지 빌드 docker build --no-cache -t my-app:1.0 .
3.3. 이미지 태그 지정 및 푸시 🏷️🚢
-
docker tag [기존 이미지 이름][:태그] [새로운 이미지 이름][:새로운 태그]
: 기존 이미지에 새로운 태그를 추가합니다. 주로 Docker Hub에 푸시할 때 레지스트리/사용자 이름을 포함한 태그를 만듭니다.# 'my-app:1.0' 이미지를 Docker Hub에 푸시할 준비를 위해 'mydockerid/my-app:1.0'으로 태그 지정 docker tag my-app:1.0 mydockerid/my-app:1.0
-
docker push [이미지 이름][:태그]
: 로컬에 있는 이미지를 Docker Hub와 같은 원격 레지스트리로 업로드합니다.# Docker Hub에 'mydockerid/my-app:1.0' 이미지 푸시 docker push mydockerid/my-app:1.0
-
docker history [이미지 ID 또는 이름]
: 이미지의 빌드 히스토리(레이어별 명령어)를 보여줍니다. 이미지 크기를 최적화하거나 문제 발생 시 유용합니다.docker history my-app:1.0
🌐 4. 네트워크 & 볼륨, 컨테이너 연결의 핵심!
도커의 네트워크와 볼륨은 컨테이너 간 통신 및 데이터 영속성을 담당하는 중요한 요소입니다.
4.1. 네트워크 관리 🕸️
-
docker network ls
: 현재 시스템에 존재하는 도커 네트워크 목록을 보여줍니다. (bridge
,host
,none
은 기본 네트워크입니다.)docker network ls # NETWORK ID NAME DRIVER SCOPE # bf3526a64010 bridge bridge local # d273024847d1 host host local # 26ae76a3e5c7 none null local
-
docker network create [네트워크 이름]
: 새로운 사용자 정의 브릿지 네트워크를 생성합니다. 같은 네트워크에 연결된 컨테이너끼리는 이름으로 통신할 수 있습니다.docker network create my-app-network
-
docker network connect [네트워크 이름] [컨테이너 ID 또는 이름]
: 실행 중인 컨테이너를 특정 네트워크에 연결합니다.# my-app-network에 'my-nginx' 컨테이너 연결 docker network connect my-app-network my-nginx
-
docker network disconnect [네트워크 이름] [컨테이너 ID 또는 이름]
: 컨테이너를 네트워크에서 연결 해제합니다.docker network disconnect my-app-network my-nginx
-
docker network rm [네트워크 ID 또는 이름]
: 네트워크를 삭제합니다.docker network rm my-app-network
💡 컨테이너가 특정 네트워크에 연결된 상태에서는 해당 네트워크를 삭제할 수 없습니다.
4.2. 볼륨 관리 💾
볼륨은 컨테이너의 데이터 지속성을 위해 사용됩니다. 컨테이너가 삭제되어도 데이터는 볼륨에 남아있어 손실되지 않습니다.
-
docker volume ls
: 생성된 도커 볼륨 목록을 보여줍니다.docker volume ls # DRIVER VOLUME NAME # local my-data
-
docker volume create [볼륨 이름]
: 새로운 이름 있는 볼륨(Named Volume)을 생성합니다.docker volume create my-data
-
docker run -v [볼륨 이름]:[컨테이너 경로]
: 생성된 볼륨을 컨테이너에 마운트하여 사용합니다.# 'my-data' 볼륨을 Ubuntu 컨테이너의 /data 경로에 마운트 docker run -it -v my-data:/data ubuntu:22.04 bash
-
docker volume inspect [볼륨 이름]
: 볼륨의 상세 정보를 보여줍니다. 실제 데이터가 저장된 호스트 경로를 확인할 수 있습니다.docker volume inspect my-data # [ # { # "CreatedAt": "2023-11-20T10:00:00Z", # "Driver": "local", # "Labels": {}, # "Mountpoint": "/var/lib/docker/volumes/my-data/_data", # 실제 데이터 경로 # "Name": "my-data", # "Options": {}, # "Scope": "local" # } # ]
-
docker volume rm [볼륨 이름]
: 볼륨을 삭제합니다. 볼륨에 저장된 데이터도 함께 삭제되므로 주의해야 합니다.docker volume rm my-data
💡 5. 유용한 고급 팁 & 스킬!
도커를 더 효율적이고 편리하게 사용할 수 있는 몇 가지 팁입니다.
5.1. 도커 컴포즈(Docker Compose) 🧠
여러 개의 컨테이너가 상호 연동하여 하나의 서비스를 구성하는 경우, 각 컨테이너를 docker run
으로 일일이 관리하는 것은 비효율적입니다. 이럴 때 Docker Compose를 사용합니다. docker-compose.yml
이라는 YAML 파일을 통해 여러 컨테이너의 정의, 네트워크, 볼륨 등을 한 번에 설정하고 관리할 수 있습니다.
docker-compose up [옵션]
:docker-compose.yml
파일에 정의된 서비스들을 빌드하고 실행합니다.-d
: 백그라운드에서 실행합니다.--build
: 이미지 캐시를 무시하고 항상 이미지를 다시 빌드합니다.
docker-compose down
:docker-compose.yml
에 정의된 서비스들을 중지하고 삭제합니다. 볼륨은 기본적으로 삭제되지 않습니다.-v
,--volumes
: 연결된 볼륨까지 함께 삭제합니다.
예시: (간단한 docker-compose.yml 파일)
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
docker-compose up -d # 웹 서버와 DB 컨테이너 동시에 실행
docker-compose down # 두 컨테이너 중지 및 삭제
💡 Docker Compose는 여러 컨테이너를 유기적으로 연결하고 관리하는 데 있어 필수적인 도구이므로, 도커를 본격적으로 사용한다면 반드시 학습하는 것을 추천합니다.
5.2. docker events
도커 데몬에서 발생하는 실시간 이벤트 스트림을 확인합니다. 컨테이너 생성, 시작, 중지, 이미지 풀 등 모든 활동을 모니터링할 수 있습니다. 운영 환경에서 문제 진단 시 유용합니다.
docker events --since '1h ago' # 1시간 전부터 발생한 모든 이벤트 보기
docker events --filter 'type=container' # 컨테이너 관련 이벤트만 보기
🎉 마무리하며: 꾸준한 연습이 핵심!
지금까지 도커의 필수 CLI 명령어부터 심화 활용, 그리고 유용한 팁까지 자세히 알아보았습니다. 도커 명령어는 한번에 모든 것을 외우려 하기보다는, 필요한 상황에 맞춰 예시를 통해 직접 실행해보는 것이 중요합니다. 🛠️
이 가이드가 여러분의 도커 여정에 큰 도움이 되었기를 바랍니다! 도커 컨테이너를 자유자재로 다루는 그날까지, 꾸준히 연습하고 탐구하는 것을 잊지 마세요. 더 나아가 Docker Compose, Docker Swarm, Kubernetes와 같은 오케스트레이션 도구들을 학습하며 역량을 확장해나가시길 응원합니다! 🙏
궁금한 점이나 추가하고 싶은 내용이 있다면 댓글로 남겨주세요! 😊