Docker 엔지니어를 위한 명령어 실무 백서

Docker 명령어 개요

Docker 명령어는 컨테이너 기반 아키텍처의 생명주기와 이미지 관리를 효과적으로 제어하기 위해 필수적입니다. 본 가이드에서는 검색, 저장소 작업, 컨테이너 실행 및 모니터링에 이르기까지 핵심 명령어의 구조와 인자를 상세히 설명합니다.

이미지 검색 및 조회

docker search:

공식 레지스트리에서 Docker 이미지를 검색하는 데 사용됩니다. 최신 버전의 이미지를 찾아보거나 신뢰할 수 있는 오픈소스 솔루션을 확인하는 용도로 적합합니다.

docker search [옵션] 검색어

주요 옵션:

  • --filter, -f: 출력 결과를 특정 조건으로 제한
  • --limit: 검색 결과 최대 개수 지정 (기본값: 25)
  • --stars, -s: 스타 수가 지정된 값 이상인 이미지만 표시
  • --automated: 자동 빌드된 이미지만 필터링
# Ubuntu 기반 웹 서버 검색
$ sudo docker search nginx | head -n 5

# 즐겨찾기수가 10 이상의 이미지만 조회 (--filter 사용 권장)
$ sudo docker search --filter=stars=10 nginx

이미지 관리

docker pull:

원격 레지스트리에서 로컬 시스템으로 이미지를 다운로드합니다.

docker pull [옵션] 이름:태그

옵션: -a(모든 태그 다운로드), --platform(플랫폼 명시)

# 최신 버전의 공식 이미지의 경우
$ sudo docker pull ubuntu:22.04

# 플랫폼 지정 다운로드
$ sudo docker pull --platform linux/arm64 nginx:latest

docker images:

로컬에 존재하는 모든 이미지를 목록화하여 정보를 확인합니다.

docker images [옵션]
# 모든 이미지 상세 정보
$ sudo docker images -a

# 특정 이미지 ID 만 추출
$ sudo docker images -q my-image:tag

# 전체 데이터 없이 간략화된 정보 표시
$ sudo docker images --no-trunc redis

docker history:

이미지가 생성되기까지의 레이어별 구성 과정을 확인합니다.

docker history [옵션] 이미지_ID 또는 이름
# 최근 5 번의 레이어만 확인
$ sudo docker history --format="{{.CreatedAt}} {{.CreatedBy}}" centos:8 | tail -5

docker build:

Local 의 Dockerfile 파일을 기반으로 새 이미지를 컴파일합니다.

docker build [옵션] [경로]
# 현재 디렉토리의 Dockerfile 사용하여 'myapp:ver1' 생성
$ docker build -t myapp:ver1 .

# 비표준 파일 경로 지정
$ docker build -f /opt/build/Dockerfile -t custom-app:v1 .

docker commit:

실행 중인 컨테이너의 변경 사항을 새로운 이미지로 스냅샷처럼 저장합니다.

docker commit [컨테이너명/ID] 이름:새태그
# 컨테이너 상태 그대로 새 이미지 생성
$ docker commit running-container backup_image:v2

docker rmi:

불필요한 로컬 이미지를 제거합니다.

docker rmi [옵션] 이미지:태그
# 강제 삭제 포함 모든 관련 레거시 제거
$ docker rmi -f old-image:tag

컨테이너 라이프사이클 관리

docker run:

이미지를 기반으로 컨테이너를 생성하고 즉시 시작합니다. 가장 빈번하게 사용되는 명령어입니다.

docker run [옵션] 이미지:태그

주요 옵션: -d(백그라운드), -it(상호작용 + tty), -p(포트 매핑), -v(볼륨 마운트), --name(네임 부여)

# 백그라운드에서 nginx 배포, 포트 80 매핑
$ sudo docker run -d --name web-app -p 8080:80 nginx:alpine

# 쉘 세션 연결로 실행
$ sudo docker run -it --name shell-test alpine:latest /bin/sh

docker start/stop/restart:

사용 중지된 컨테이너를 재개하거나 실행 중 컨테이너를 종료/재시작합니다.

docker start [-a, -i] 컨테이너명
docker stop [-t 타임아웃] 컨테이너명
docker restart [-t 시간] 컨테이너명
# 컨테이너 ID 만으로 시작
$ docker start 8b9053318855

# 5 초 후 강제 종료 후 다시 시작
$ docker restart -t 50 web-app

docker create vs docker run:

create은 컨테이너 객체만 생성하고 상태를 'Created'로 남깁니다. 실제로는 start가 별도로 필요하지만 설정 검증 등에 유용합니다.

# 인터랙티브 모드 준비만 하고 즉시 실행하지 않음
$ docker create --name temp-container -it ubuntu:latest /bin/bash
$ docker start -ai temp-container # 이후 직접 시작해야 함

docker pause/unpause:

일시적으로 프로세스 실행을 동결했다가 해제합니다.

docker pause container_id
docker unpause container_id
# CPU 리소스 할당 중단
$ docker pause my-service

docker kill:

강제적으로 컨테이너의 메인 프로세스에 신호를 보냅니다.

docker kill [--signal=SIGNAL] 컨테이너명
# SIGTERM 대신 SIGKILL 사용
$ docker kill -s KILL stuck-app

컨테이너 내부 상호작용

docker exec:

이미지 내부에서 외부에서 명령어를 실행합니다. (주로 쉘 접속 시 사용)

docker exec [-u 사용자] [-w 워크디렉토리] [-it] 컨테이너명 커맨드
# root 로 접속하여 IP 확인
$ docker exec -u root -it db-container ip addr

# 루트 디렉터리에서 파일 리스트 보기
$ docker exec web-container ls -la /var/www/html

docker attach:

컨테이너의 표준 입력/출력에 직접 연결합니다. 보통 백그라운드에서 실행된 컨테이너의 로그 흐름을 실시간으로 볼 때 사용합니다.

docker attach [연결키 설정] 컨테이너명
# 실행 중인 상위 프로세스 모니터링
$ docker attach logger-container

docker logs:

컨테이너에서 생성된 stdout/stderr 로그를 조회합니다.

docker logs [옵션] 컨테이너명

옵션: -f(tail follow), --since, --tail, --timestamps

# 마지막 5 줄과 함께 실시간 로그 모니터링
$ docker logs -f --tail 5 app-server

# 시간 기준 필터링
$ docker logs --since 2023-10-01T10:00:00Z service-name

데이터 이동 및 시스템 정보

docker cp:

호스트와 컨테이너 간 파일을 복사합니다.

docker cp 호스트_경로 컨테이너명:경로
docker cp 컨테이너명:경로 호스트_경로
# 컨테이너 내부의 log 폴더를 호스트로 가져옴
$ docker cp server:/var/log/app.log ./backup_log.txt

docker save/export:

이미지나 컨테이너를 tar 파일 형태로 내보냅니다.

docker save -o file.tar 이미지명
docker export 컨테이너명 > file.tar
# 여러 이미지를 묶어서 저장
$ docker save -o combined_images.tar ubuntu:latest postgres:13 mysql:8

docker load/import:

tar 파일이나 stdin 에서 데이터를 읽어 이미지/컨테이너로 복원합니다.

docker load -i archive.tar
docker import [옵션] 파일명 이미지명:태그
# gzip 압축된 파일 로딩
$ gunzip backup.tar.gz | docker load

# 타로부터 이미지 직접 만들기
$ docker import system_snapshot.tar snapshot_img:v1

docker port/inspect/diff:

port: 포트 매핑 확인
inspect: JSON 형식의 상세 메타데이터 확인
diff: 컨테이너 filesystem 변경 사항 추적 (A:Add, D:Delete, C:Change)

# 컨테이너가 바인드한 포트 확인
$ docker port web-01

# IP 주소 추출 (Go Template 사용)
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vm-box

# 파일 추가/변경 확인
$ docker diff storage-container

docker top:

컨테이너 내에서 실행 중인 OS 프로세스를 상점프로세스관리자의 Top 과 유사하게 보여줍니다.

docker top 컨테이너명
# 실행 중인 Java 프로세스 확인
$ docker top java-backend

로그인 및 시스템 관리

docker login/logout:

커스텀 레지스트리 인증 처리

docker login -u 아이디 -p 비밀번호 도메인 주소
docker logout 도메인 주소

docker info/version/events:

info: 전체 Docker 서비스 상태 요약
version: 클라이언트/서버 버전
events: 실시간 이벤트 스트림 리스닝

# 컨테이너 생성 이벤트를 실시간으로 대기
$ docker events --filter type=container --filter event=start

docker wait:

스크립팅 환경에서 특정 컨테이너가 종료될 때까지 대기 후 종료 코드를 반환받습니다.

docker wait 컨테이너명
# 배치 작업 완료 시점 확인
$ exit_code=$(docker wait worker-job); echo $exit_code

정리

위에서 다룬 명령어들은 Docker 엔진의 핵심 동작 원리를 구현하는 도구들입니다. 각 옵션의 조합과 문맥에 따라 적절한 명령어를 선택하는 것이 효율적인 컨테이너 환경을 구축하는 열쇠입니다.

태그: Docker-Engine container-lifecycle image-management cli-tools linux-administration

9월 3일 06:45에 게시됨