- 컨테이너 관리dockerdocker 명령어docker 컨테이너
Docker 사용 핵심 명령 가이드
- Docker Image 관련 명령 (Image Management)
- - Dockerfile로 이미지 빌드
- Container 관련 명령 (Container Lifecycle)
- - 컨테이너 생성 및 실행 (run)
- - 컨테이너 상태 확인(ps), 재시작(start), 종료(stop)
- - 컨테이너 생성 시 이미지 기본 명령 대신 다른 명령을 실행 (Override)
- 실행 중인 Container 관리 (Interacting)
- 이미지 다운로드 및 공유 (Image Distribution)
- - Docker Hub에 push, pull
- - latest 태그 관리 및 버전 관리
- 네트워크 및 다중 컨테이너 (Networking & Orchestration)
- - 네트워크 생성 및 연결
- 시스템 관리 및 정리 (Advanced & Maintenance)
- - Docker 시스템 용량 확인 및 정리 (Maintenance)
- - 컨테이너 일괄 작업
AI 활용으로 서비스 개발이 용이해지고, IaaS 환경에서의 Docker 활용이 필수적이다. 효율적인 인프라 관리를 위해 꼭 알아야 할 Docker 핵심 명령어는 Docker Image 생성, Docker Container 실행, Docker Container 관리 등 크게 3가지로 구분된다.
Docker Image 관련 명령 (Image Management)
이미지는 컨테이너의 템플릿 역할을 하며, Dockerfile을 통해 빌드하거나 Docker Hub에서 공유할 수 있다.
Dockerfile로 이미지 빌드
Dockerfile을 기반으로 이미지를 빌드한다. Dockerfile이 있는 디렉토리에서 실행한다. 생성할 이미지의 repository(Name)는 동일 이미지 그룹으로 tag는 세부적 차이를 표시하는 정보로 사용된다. name:tag 조합은 unique 하다. 특히, 조금씩 다른 이미지를 build 할때 tag를 이용하면 관리에 용이하다.
# 이미지 빌드
# `-t`: 이미지 이름과 태그를 지정한다 (예: `my-app:1.0`).
# `.`: Dockerfile이 있는 디렉토리.(현재 디렉토리)
docker build -t <Name:Tag> .
# 환경 변수를 지정해서 이미지를 빌드한다.
docker build . --build-arg ARG1=0000 --build-arg ARG2=0000 -t <Name:Tag>
# 이미지 목록 확인
docker images
# 이미지 상세 정보 확인 (Inspection)
# - Base Image(OS 등), 레이어 내용, 생성 날짜 등을 확인할 때 사용한다.
docker image inspect <Image ID or Name>
# 이미지 삭제
# - 해당 이미지를 사용하는 컨테이너(종료 상태 포함)가 있으면 삭제되지 않는다.
docker rmi <Image ID or Name>
# 이미지 태그 설정
# - 기존 이미지에 새로운 이름이나 태그를 부여한다. Docker Hub 전송 시 유용하다.
docker tag <Source Image> <Target Image:Tag>
# 사용중이지 않은 모든 이미지 삭제(정지 상태 컨테이너 없는 것)
docker prune -aContainer 관련 명령 (Container Lifecycle)
컨테이너는 이미지의 실행 가능한 인스턴스이다. 서비스를 구현하면 컨테이너를 실행하여 그 내부에서 서비스를 실행한다. 즉, 컨테이너는 서비스의 실행 환경을 제공하므로, 실제 서버를 관리할 때 다루어야 하는 대상이다.
컨테이너 생성 및 실행 (run)
docker run은 이미지를 기반으로 새로운 컨테이너를 생성하고 시작한다. 컨테이너를 실행하려는 이미지가 로컬에 없으면 자동으로 Docker Hub를 체크하고 이미지를 pull 한 후 실행한다.
컨테이너가 실행시 터미널에 컨테이너 앱의 메시지를 실시간으로 출력하는 Attached mode가 기본이며, -d 옵션을 사용하면 백그라운드로 실행되는 Detached mode가 되어 터미널을 차지하지 않는다. 실행 옵션으로 포트 포워딩, 컨테이너 이름, Detached mode, Interactive mode 등을 사용할 수 있다.
# Attached 모드 (기본): 실시간 로그를 터미널에서 확인
docker run nginx
# Detached 모드 (-d): 백그라운드에서 실행
docker run -d nginx
# 포트 포워딩, 컨테이너 이름, Detached mode, Interactive mode 등을 사용할 수 있다.
docker run -p <Host Port>:<Container Port> --name <Container Name> <Image ID or Name>
# 예시: nginx 이미지를 'web-server'라는 컨테이너명으로 8080 포트에 실행. 컨테이너 종료 시 자동 삭제.
# `-d`: Detached mode (백그라운드 실행). 터미널을 차지하지 않는다.
# `-it`: Interactive + TTY (사용자 입력을 기다리는 유틸리티 프로그램 등에 사용).
# `-p`: 포트 포워딩 설정 (예: `3000:80`).
# `--name`: 컨테이너 이름을 지정한다.
# `--rm`: 컨테이너 종료 시 자동 삭제 (개발 단계에서 소스 변경 시 유용).
docker run -d --rm -p 8080:80 --name web-server nginx
# .env 파일을 별도로 생성한 경우 컨테이너 실행 시 포함하도록 설정
docker run --rm -d --env-file .env <Image ID or Name>컨테이너 상태 확인(ps), 재시작(start), 종료(stop)
호스트에서 실행 중인 여러 컨테이너들의 상태를 확인하고, 컨테이너를 재시작하거나 종료할 때 사용한다.
# 컨테이너 목록 확인
docker ps # 실행 중인 컨테이너만
docker ps -a # 중지된 컨테이너 포함 모든 목록
# 컨테이너 시작/중지/삭제
docker start <ID or Name> # 중지된 (기존의) 컨테이너를 백그라운드에서 다시 시작
# 컨테이너를 Attached + Interactive 모드로 다시 시작
# `-a` (attach): 컨테이너의 출력에 연결한다.
# `-i` (interactive): 컨테이너의 입력에 연결한다.
docker start -ai <ID or Name>
# 실행 중인 컨테이너 종료
docker stop <ID or Name>
# 종료된 컨테이너 목록 보기
docker container ls -a
# 또는 상태가 종료인 컨테이너 한꺼번에 삭제
docker container prune
# 컨테이너 삭제
docker rm <ID or Name>컨테이너 생성 시 이미지 기본 명령 대신 다른 명령을 실행 (Override)
도커 이미지는 컨테이너를 실행할 때 기본 명령어를 실행하는데 이는 Dockerfile에서 CMD로 정의한 명령어이다. 디버깅 등의 목적으로 임시로 컨테이너를 실행할 때 이미지의 기본 명령어를 override하고 대신 입력한 명령어를 실행할 필요가 있을 경우가 다. docker run [이미지명] [새로운명령어] 형식으로 사용하면, 이미지의 기본 명령을 override하고 대신 입력한 명령어를 실행한다.
# node 이미지에서 컨테이너 시작 시 이미지 기본 명령 대신 npm init 명령어 실행
# 주의: -it 옵션이 있어야 사용자 질문에 답변할 수 있다.있
docker run -it node npm init
# 호스트의 현재 폴더($(pwd))를 컨테이너의 /app에 연결하여 프로젝트 초기화
# (생성된 package.json 파일이 호스트의 현재 폴더에 저장된다)
# 주의: -v (볼륨) 옵션 없이 실행하면 컨테이너 내부에서 생성된 파일은 컨테이너 종료(삭제)와 함께 모두 사라진다.
docker run -it --rm -v $(pwd):/app -w /app node npm init실행 중인 Container 관리 (Interacting)
컨테이너가 실행 중인 상황에서 로그를 모니터링하거나 애플리케이션 디버깅이나 컨테이너 내부 조작이 필요할 때 사용한다.
# 컨테이너 로그 확인 (Logs)
docker logs <ID or Name>
docker logs -f <ID or Name> # 실시간 로그 스트리밍
# 실행중인 컨테이너 내부에서 명령 실행 (Exec)
docker exec -it <ID or Name> <Command>
# 예: 컨테이너 내부의 쉘 접속
docker exec -it <ID or Name> /bin/sh (또는 bash)
# 실행 중인 'web-server' 컨테이너 내부에서 파일 목록 확인
# - 메인 프로세스를 중단하지 않고 내부 파일을 읽거나 설정을 바꿀 때 유용하다.
docker exec -it web-server ls
# 실행 중인 컨테이너에 연결 (Attach)
# - Detached 컨테이너에 다시 연결하여 출력 메시지를 확인한다.
docker attach <ID or Name>
# 로컬과 컨테이너 간 파일 복사 (CP)
# - 로컬 -> 컨테이너
docker cp <Local Path> <Container Name>:<Container Path>
# - 컨테이너 -> 로컬
docker cp <Container Name>:<Container Path> <Local Path>이미지 다운로드 및 공유 (Image Distribution)
Docker Hub에 push, pull
Docker Hub와 같은 레지스트리를 통해 이미지를 공유한다. Image push를 하면 전체 Image를 모두 push 하는 것이 아니고, docker hub의 base image 부분은 제외하고 필요한 코드만 push 한다. 즉, 전체 node image가 아니고 추가정보만 push 한다.
Docker Hub와 같은 레지스트리에 이미지를 업로드하려면 이미지 이름을 계정명/저장소명:태그 형식으로 맞춰야 한다. 이미지 이름을 맞추는 방법은 두 가지가 있다.
- 빌드 시점에 이름 지정:
docker build -t my-account/my-app:1.0 .와 같이 처음부터 완성된 형식으로 빌드한다. 여기서santana101은 Docker Hub의 계정명(ID)이다. - 기존 이미지에 태그 추가:
docker tag명령으로 이미 존재하는 이미지에 새로운 이름을 부여한다.
Docker Hub의 개인 저장소에 이미지를 올리려면 반드시 계정명/이미지명 형식을 지켜야 한다. docker push my-app 처럼 계정명 없이 push를 시도하면, Docker는 이를 공식 라이브러리(docker.io/library/my-app)로 인식한다. 일반 사용자는 공식 라이브러리에 대한 권한이 없으므로 Access Denied 에러가 발생하며 게시되지 않는다.
# 빌드와 동시에 태그 지정
docker build -t my-account/test-hello-node:1.0 .
# 기존 이미지(test-hello-node:latest)에 새로운 태그 부여
docker tag test-hello-node:latest my-account/test-hello-node:latest
# Docker Hub 로그인
docker login
# 이미지 업로드
docker push my-account/test-hello-node:latest
# 이미지 다운로드
docker pull my-account/test-hello-node:latestlatest 태그 관리 및 버전 관리
latest 태그만 사용하는 상황에서 새로운 latest 태그를 가지는 이미지를 push 하면 dangling 이미지가 발생하므로 실제 버전 관리를 위해 구체적인 버전 태그(예: 1.0, v1.1)도 같이 push 한다. 모든 이미지는 공유의 Image ID 가 있다. Dangling(<none>) 상태는 해당 Image ID를 가리키는 태그가 0개가 될 때 발생한다.
# 새로운 2.0 버전을 출시하는 과정
docker tag my-app:src my-account/my-app:v2.0 # 버전 태그 부여
docker tag my-app:src my-account/my-app:latest # latest 태그 갱신
docker push my-account/my-app:v2.0
docker push my-account/my-app:latest네트워크 및 다중 컨테이너 (Networking & Orchestration)
컨테이너 간 통신이 필요한 환경(예: API + DB)에서 사용한다.
네트워크 생성 및 연결
동일한 사용자 정의 네트워크에 속한 컨테이너들은 서로의 컨테이너 이름을 호스트 이름(Hostname)으로 사용하여 통신할 수 있다. (예: api 컨테이너에서 mysql 이름으로 DB 접속 가능) 기본적으로 bridge 네트워크로 연결되어 하나의 호스트 내부에서 컨테이너들이 서로 통신할 수 있다.
# 새로운 네트워크 생성
docker network create <Network Name>
# 컨테이너 실행 시 네트워크 연결
docker run --network <Network Name> --name <Container Name> <Image Name>시스템 관리 및 정리 (Advanced & Maintenance)
Docker 시스템 용량 확인 및 정리 (Maintenance)
사용하지 않는 자원을 정리하여 용량을 확보한다.
# Docker 자원 사용량 확인 (이미지, 컨테이너, 볼륨 등)
docker system df
# 사용하지 않는 모든 개체 정리 (Prune)
# 중지된 컨테이너, 미사용 네트워크, 댕글링(Dangling) 이미지 등을 일괄 삭제한다.
docker system prune
# 태그가 없는 이미지뿐만 아니라, 사용 중이지 않은 모든 이미지를 삭제하려면 -a 추가
docker system prune -a
# 볼륨까지 함께 삭제하려면 --volumes 추가
docker system prune --volumes컨테이너 일괄 작업
# 모든 컨테이너 일괄 중지
docker stop $(docker ps -q)
# 모든 컨테이너 일괄 삭제 (실행 중인 컨테이너 포함 시 -f 추가)
docker rm -f $(docker ps -aq)(끝)