Docker Reference
Docker 컨테이너 레퍼런스
Docker Reference 소개
Docker Reference는 Docker CLI와 설정 전반을 8개 카테고리로 정리한 검색 가능한 치트 시트입니다. 기본 명령어는 일상적인 컨테이너 수명주기 작업을 다룹니다. docker run(detach·name·port 플래그 포함), docker ps(중지된 컨테이너 포함 -a 옵션), docker stop/start, docker rm, 실행 중인 컨테이너 내부에서 명령을 실행하는 docker exec, follow·tail 옵션이 있는 docker logs, 상세 JSON 메타데이터를 위한 docker inspect가 포함됩니다. Dockerfile 명령어는 FROM(베이스 이미지), WORKDIR, COPY/ADD, RUN, CMD/ENTRYPOINT, ENV, EXPOSE, 그리고 경량 프로덕션 이미지를 만드는 멀티스테이지 빌드를 다룹니다. 이미지 관련 항목은 docker build, docker images, 레지스트리와의 docker pull/push, docker rmi, air-gapped 전송을 위한 docker save/load를 포함합니다.
컨테이너 관리 항목은 대화형 컨테이너 실행(docker run -it), 파일 전송(docker cp), 실시간 리소스 모니터링(docker stats), 컨테이너 상태 커밋(docker commit), 재시작 정책(always·on-failure·unless-stopped)을 다룹니다. 네트워크 카테고리는 사용자 정의 브리지 네트워크 생성, 컨테이너 연결, 네트워크 목록 조회, 호스트 네트워크 모드, DNS 기반 컨테이너 간 통신을 설명합니다. 볼륨은 명명된 볼륨 생성, -v를 사용한 바인드 마운트, 읽기 전용 지원이 있는 명시적 --mount 구문, 볼륨 목록 조회와 정리, tmpfs 인메모리 마운트를 포함합니다. Docker Compose 항목은 docker compose up/down(볼륨 정리 포함), depends_on과 환경 변수가 있는 compose.yaml 서비스 구조, 로그 스트리밍, --scale을 활용한 수평 확장을 보여줍니다.
보안 섹션은 프로덕션 컨테이너 강화에 특히 중요합니다. seccomp 프로파일과 no-new-privileges를 위한 --security-opt, 불변 컨테이너 파일시스템을 위한 --read-only, Linux 권한 제어를 위한 --cap-drop ALL / --cap-add, 비root 실행을 위한 --user, 취약점 스캔을 위한 docker scout가 포함됩니다. 모든 예제는 터미널에 바로 붙여넣을 수 있는 완전한 명령어입니다.
주요 기능
- 기본 명령어: docker run, ps, stop/start, rm, exec, logs, inspect의 핵심 플래그 완전 지원
- Dockerfile: FROM, WORKDIR, COPY/ADD, RUN, CMD/ENTRYPOINT, ENV, EXPOSE, 멀티스테이지 빌드 패턴
- 이미지 관리: docker build, images, pull/push, rmi, 오프라인 전송을 위한 save/load
- 컨테이너 운영: 대화형 실행, docker cp 파일 전송, docker stats, docker commit, 재시작 정책
- 네트워크: 사용자 정의 브리지 네트워크, 컨테이너 DNS, 호스트 네트워크, network connect/inspect
- 볼륨: 명명된 볼륨, 바인드 마운트(-v), 명시적 --mount, 볼륨 정리, tmpfs 마운트
- Docker Compose: up/down, 서비스/볼륨을 갖춘 compose.yaml 구조, 로그 테일링, --scale
- 보안 강화: --security-opt, --read-only, --cap-drop/--cap-add, --user, docker scout CVE 스캔
자주 묻는 질문
Dockerfile에서 CMD와 ENTRYPOINT의 차이는 무엇인가요?
ENTRYPOINT는 컨테이너 시작 시 항상 실행될 실행 파일을 정의합니다(예: ["node"]). CMD는 런타임에 재정의할 수 있는 기본 인수를 제공합니다(예: ["server.js"]). 함께 사용하면 ENTRYPOINT ["node"] CMD ["server.js"]는 기본적으로 node server.js를 실행하지만, docker run에 다른 인수를 전달하여 파일을 변경할 수 있습니다. CMD만 사용하면 전체 명령을 교체할 수 있습니다.
멀티스테이지 Docker 빌드란 무엇이고 왜 사용해야 하나요?
멀티스테이지 빌드는 하나의 Dockerfile에 여러 FROM 명령을 사용합니다. 각 스테이지는 다른 베이스 이미지를 사용할 수 있습니다. COPY --from=<스테이지>로 명시적으로 복사된 파일만 최종 이미지에 포함되어 빌드 도구, 소스 코드, 중간 결과물이 제거됩니다. 이를 통해 이미지 크기를 크게 줄일 수 있습니다. node:20으로 빌드한 Node.js 앱을 컴파일된 결과물만 포함한 node:20-alpine 이미지로 배포할 수 있습니다.
바인드 마운트와 명명된 볼륨의 차이는 무엇인가요?
바인드 마운트(-v /host/path:/container/path)는 호스트 파일시스템의 특정 디렉토리를 컨테이너에 매핑합니다. 양쪽에서 변경이 즉시 반영되어 개발 환경에 적합합니다. 명명된 볼륨(docker volume create my-data; docker run -v my-data:/app/data)은 Docker가 관리하며 Docker가 제어하는 위치에 저장됩니다. 명명된 볼륨은 컨테이너와 독립적으로 유지되고 호스트 경로에 종속되지 않아 프로덕션 데이터에 권장됩니다.
사용자 정의 네트워크에서 Docker 컨테이너 DNS는 어떻게 동작하나요?
같은 사용자 정의 브리지 네트워크에 있는 컨테이너는 컨테이너 이름을 호스트명으로 사용해 서로 통신할 수 있습니다. 예를 들어 postgres 컨테이너 이름이 'db'이고 앱 컨테이너 이름이 'app'이면, 앱에서 db:5432로 접속할 수 있습니다. 이 자동 서비스 탐색은 기본 bridge 네트워크가 아닌 사용자 정의 네트워크에서만 동작합니다.
--restart=unless-stopped는 어떤 동작을 하나요?
unless-stopped 정책은 Docker 데몬 재시작이나 호스트 재부팅 후 컨테이너를 자동으로 재시작하되, docker stop으로 수동 중지한 경우에는 재시작하지 않습니다. 'always'는 수동 중지 후에도 재시작합니다. 'on-failure[:N]'는 컨테이너가 비정상 종료(0 이외의 종료 코드)된 경우에만 재시작합니다(재시도 횟수 제한 가능). 재부팅 후에도 서비스가 지속되어야 하는 프로덕션 환경에는 unless-stopped를 사용하세요.
권한 제어로 컨테이너 공격 표면을 어떻게 줄이나요?
--cap-drop ALL로 모든 Linux 권한을 먼저 제거한 다음, --cap-add로 애플리케이션에 필요한 권한만 추가합니다. 예를 들어 포트 80에 바인딩하는 웹 서버는 --cap-add NET_BIND_SERVICE가 필요합니다. 최소 권한 원칙을 적용하면 침해된 컨테이너 프로세스가 커널 모듈 로딩이나 네트워크 구성 변경 같은 권한 작업을 수행할 수 없습니다.
docker compose up과 docker compose up --build의 차이는 무엇인가요?
docker compose up은 compose.yaml에 정의된 서비스를 시작하며, 로컬에 없는 이미지는 풀링합니다. docker compose up --build는 빌드 컨텍스트가 정의된 서비스를 강제로 재빌드하여 최신 코드가 실행되도록 합니다. 개발 중 애플리케이션 코드 변경 후에는 --build를 사용하고, 이미지 태그가 고정된 프로덕션 환경에서는 생략하세요.
Docker 이미지의 보안 취약점은 어떻게 스캔하나요?
docker scout quickview <이미지>로 빠른 요약을, docker scout cves <이미지>로 상세한 CVE 목록을 확인할 수 있습니다. Docker Scout는 이미지 레이어를 취약점 데이터베이스와 비교 분석하여 심각도와 함께 영향받는 패키지를 보고합니다. CI/CD 파이프라인에 통합하면 심각한 CVE가 있는 이미지의 프로모션을 자동으로 차단할 수도 있습니다.