Skip to Content
Sunbeen's Blog
DocumentsDockerDocker 기본 명령어

Docker 기본 명령어

🔍 공통 팁 --help

  • 대부분의 Docker 명령어에 --help 옵션을 붙이면 모든 사용 가능한 옵션을 확인할 수 있음.

    예: docker run —help, docker container ls —help

  • 명령어 출력

    • docker —help
  • 옵션을 붙이면 상세 옵션 확인 가능

    • docker ps —help

목차

📦 이미지

  • 이미지 기본 명령어
    • 이미지 목록 조회
    • 생성
    • 삭제
    • 분석(inspect)
  • 이미지 이름 지정 네이밍, 태그(tag)
  • 이미지 배포
    • 로그인
    • 푸시

🧱 컨테이너

  • 실행 중인 / 중지된 컨테이너 목록 조회
  • 컨테이너 기본 명령어
    • 실행(run)
    • 중지(stop)
    • 재시작(start)
    • 삭제(rm)
  • 컨테이너 이름 지정 네이밍

Docker - 이미지 생성 & 실행 run, start

docker run

  • 새 컨테이너를 실행 (기본적으로 이미지 기반의 새 컨테이너 생성)

docker start [컨테이너명 or ID]

  • 중지된 컨테이너를 다시 시작
  • 기존 컨테이너를 재활용할 수 있으므로, 이미지나 코드 변경이 없으면 run 대신 start 사용 가능
  • docker start는 터미널을 차단하지 않음 → 백그라운드 실행

컨테이너 동작 방식

구분AttachedDetached
터미널 제어터미널 입력 중지터미널 입력 자유로움
로그 출력실시간 콘솔 출력출력 없음 (별도 명령으로 확인 필요)

컨테이너 실행 방식 비교

명령어모드설명
docker runAttached (기본값)새 컨테이너 생성 + 터미널 차단됨, 로그 실시간 출력
docker run -dDetached새 컨테이너 생성 + 백그라운드 실행, 로그는 따로 봐야 함
docker startDetached (기본값)중지된 기존 컨테이너를 재실행, 백그라운드로 동작
docker start -aAttached중지된 컨테이너를 재실행하며 터미널에 연결

Python CLI 앱 Docker 구동 시키기

import random min_val = int(input("Enter min value: ")) max_val = int(input("Enter max value: ")) if min_val > max_val: print("Invalid range!") else: print("Random number:", random.randint(min_val, max_val))

Dockerfile

# https://hub.docker.com/ # Python 베이스 이미지 검색하기 FROM python:3 # Work Directory 변경 WORKDIR /app # 파일 복사 COPY . /app # 컨테이너 실행시 실행 시키기 전부 다 문자열 CMD [ "python", "rng.py" ]

이제 docker run으로 실행하면 되지만,

주의할 점이 있습니다.

이 프로그램은 사용자 입력을 받아야 하기 때문에,

입력받을 수 있는 실행 옵션이 필요합니다.

입력을 받으려면 it 옵션이 필수

docker run -it python-rng
  • i: 입력 가능하게 (stdin 유지)
  • t: TTY를 만들어서 터미널처럼 동작

중요 : 컨테이너를 생성하고 실행하기 때문에, 이후에 docker start로 -ai 옵션을 넣는다고 정상적으로 동작 하지 않습니다.

한 번 실행된 컨테이너는 종료됩니다.

하지만 docker ps -a로 목록을 보면 확인할 수 있습니다

docker start -ai <컨테이너>
  • a: 실행 중인 출력을 터미널로 가져옴
  • i: 입력을 다시 받을 수 있도록 함

컨테이너 실행과 관련된 주요 명령어 정리

명령어설명
docker run -it새 컨테이너를 입력 가능한 상태로 실행
docker start -ai종료된 컨테이너를 입력/출력 가능하게 재실행
docker attach <이름>실행 중인 컨테이너에 다시 연결
docker logs -f <이름>로그만 실시간으로 보기 (입력 불가)

Docker Container 상태 확인 PS

docker ps

  • 실행 중인 컨테이너 목록 확인
  • docker ps -a: 중지된 컨테이너 포함 전체 목록 확인

컨테이너 상태를 확인하는 주요 명령어 정리

명령어설명
docker ps실행 중인 컨테이너 목록 확인
docker ps -a중지된 컨테이너 포함 전체 목록
docker stop <컨테이너명>컨테이너 중지
docker logs <컨테이너명>과거 로그 출력 확인
docker logs -f <컨테이너명>실시간 로그 follow 모드
docker attach <컨테이너명>실행 중인 컨테이너에 터미널 연결

Docker - 이미지 삭제 rm

컨테이너 삭제

  • 실행 중인 컨테이너는 바로 삭제할 수 없습니다.
  • 먼저 중지한 뒤에 삭제해야 합니다.
docker stop <컨테이너> docker rm <컨테이너> #컨테이너 여러 개를 한 번에 삭제하고 싶다면, 공백으로 구분하여 이름을 나열합니다. docker rm container1 container2 container3 # 중지된 컨테이너 일괄 삭제 docker container prune # 질문 없이 바로 제거 docker container prune -f

현재 보유 중인 이미지 목록 확인

docker images

이미지 삭제

  • 해당 이미지가 컨테이너에서 사용 중이면 삭제할 수 없습니다.
  • 컨테이너가 실행 중이든, 중지된 상태든 이미지와 연결되어 있으면 제거되지 않습니다.
  • 이미지를 지우려면 먼저 해당 컨테이너를 삭제해야 합니다.
docker rmi <이미지 ID> # 여러 개의 이미지도 한 번에 삭제할 수 있습니다. docker rmi id1 id2 id3

사용하지 않는 이미지 한 번에 삭제 (prune)

  • ※ prune : 가지치기
  • 사용되지 않고 남아 있는 잔여 리소스를 정리하는 명령어
docker image prune # 질문 없이 바로 제거 docker image prune -f # etc prune docker image prune: 사용되지 않는 이미지 가지치기 docker container prune: 중지된 컨테이너 가지치기 docker volume prune: 사용되지 않는 볼륨 가지치기 docker system prune: 모든 것을 번에 가지치기

컨테이너 자동 삭제 —rm

  • -rm컨테이너가 종료될 때 자동으로 삭제되도록 만드는 옵션입니다.
  • docker stop 또는 컨테이너 실행이 종료되면, 해당 컨테이너가 자동으로 시스템에서 제거됩니다.
docker run --rm ... # 예시 실행 -> 중지 (자동 삭제) docker run -d --rm -p 3000:80 my-image # 컨테이너 중지하기 docker stop my-image # 컨테이너 상태 확인하기 docker ps -a
  • 개발 중 자주 컨테이너를 띄웠다 끌 때
  • 테스트용 컨테이너를 반복 실행할 때
  • 컨테이너 재사용이 필요 없는 일회성 작업일 때
  • 변경된 코드를 기반으로 매번 새로 빌드/실행할 때

이미지 분석 명령어 - image inspect

docker image inspect <이미지 ID>
  • inspect 명령의 결과는 JSON 형식이며, 매우 많은 정보를 포함하고 있습니다.
항목설명
Id이미지의 전체 SHA 식별자
Created이미지가 생성된 날짜와 시간
ContainerConfig컨테이너 실행 시 기본 설정 정보
Env포함된 환경 변수
ExposedPorts자동으로 열리는 포트 (예: 80/tcp 등)
Cmd / Entrypoint컨테이너가 실행될 때 실행되는 명령
Os / Architecture이미지의 운영 체제 및 아키텍처 (예: linux/amd64)
RootFSLayers이 이미지가 갖는 모든 레이어 목록 (순서대로 표시됨)

컨테이너 로컬 파일 복사 - COPY

  • 실행 중인 컨테이너와 로컬 시스템 간에 파일 또는 폴더를 복사할 수 있게 해줍니다.
docker cp <출발> <도착> # 예제 1: 로컬 → 컨테이너로 파일 복사 docker cp ./dummy test-container:/test # 예제 2: 컨테이너 → 로컬로 파일 복사 docker cp test-container:/test dummy # 특정 파일만 복사 docker cp test-container:/test/test.txt ./dummy/test.txt
기능명령어
로컬 → 컨테이너 복사docker cp ./파일명 컨테이너:/경로
컨테이너 → 로컬 복사docker cp 컨테이너:/경로 ./폴더
  • 로컬에서 컨테이너로 설정 파일 복사
    • config 파일을 컨테이너에 동적으로 추가할 때
  • 컨테이너에서 로그 파일 추출
    • docker logs보다 더 상세한 로그 접근이 필요할 때
  • 데이터 파일 복사
    • SQLite, CSV 등의 결과 파일 백업할 때

⚠️ 주의할 점

  1. 컨테이너에 코드 파일을 복사하는 것은 추천하지 않습니다.
    • 소스 코드 변경 시에는 보통 이미지를 다시 빌드하고, 새 컨테이너를 띄우는 것이 표준입니다.
    • 잘못된 코드 복사로 인해 컨테이너 내부 상태가 불안정해질 수 있습니다.
  2. 컨테이너에서 실행 중인 프로세스의 핵심 파일을 교체할 수 없습니다.
    • 예: server.js 같은 파일은 실행 중인 상태에서 덮어쓸 수 없습니다.
  3. docker cp컨테이너 재시작 없이 일시적으로 무언가를 수정하거나 확인해야 할 때 유용합니다.

컨테이너에 이름 지정 —name

docker run -d --rm --name goalsapp my-image
  • d: detached 모드
  • -rm: 종료 시 컨테이너 자동 삭제
  • -name goalsapp: 컨테이너 이름을 goalsapp으로 지정

컨테이너를 중지하거나 다시 시작할 때 복잡한 ID 대신 사용 가능

docker stop goalsapp docker logs goalsapp

이미지에 이름과 태그 지정하기

docker build -t 이름:태그 . # 예시 docker build -t goals:latest . # 이미지 ID 대신 사용하기 docker run --rm goals:latest # 태그를 생략하면 Docker는 자동으로 latest 처리 # 동일하게 처리된다. docker build -t myapp . docker build -t myapp:latest .

태그(tag)의 개념과 활용

  • 예시 ) Node 공식 이미지
    • node:latest → 가장 최신 버전
    • node:18 → Node 18 버전
    • node:18-slim → 용량을 줄인 슬림 이미지
    • node:18-alpine → Alpine 리눅스 기반 경량 이미지
구분목적명령어
--name컨테이너에 이름 지정docker run --name myapp
-t 이름:태그이미지에 이름/태그 지정docker build -t myimg:latest .
이름 기반 실행이미지 ID 대신 태그 사용docker run myimg:latest
이미지 버전 관리다양한 버전 구분 가능goals:v1, goals:prod, goals:test
주의!!! 테스트 용/임시 이미지만 정리 docker image prune # ※ 주의 : 열심히 태그 붙여놓고 정리한 이미지들도 **다 사라짐. #** "사용하지 않는 이미지"라는 기준으로 판단 # 컨테이너에서 안 쓰고 있으면 삭제 대상 docker image prune -a # Git으로 버전 관리를 잘하고 있었다면, 불러와서 새로 이미지를 빌드 할 수 있음 # 그렇지 않았다면, 모두 날아갔음.

Docker 배포

소스코드 + Dockerfile로 공유하거나

완성된 이미지 자체를 배포

Docker 배포 Docker Hub

  • https://hub.docker.com 에 가입합니다.
  • 무료 요금제로 계정을 생성합니다.
  • 저장소(Repository)를 생성합니다.
    • 이름 예시: node-hello-world
    • 공개 또는 비공개 여부 설정 가능 (무료는 개인 저장소 1개만 가능)
# 기존 이미지에 새 태그 부여 docker tag node-demo yourdockerid/node-hello-world # 올바른 이름으로 빌드해서 사용하기 docker build -t yourdockerid/node-hello-world .

Docker 로그인

로그인 상태는 캐시되며, 반복 로그인 필요 없음

docker login

Docker 이미지 push

docker push yourdockerid/node-hello-world
  • 이미지가 도커 허브에 업로드됩니다.
  • 베이스 이미지(예: node:18)는 이미 존재하므로, 변경된 레이어만 푸시됩니다.
  • 도커 허브에서 저장소를 열면 푸시된 태그(latest, v1, 등)를 확인할 수 있습니다.
  • 이 이미지는 다른 사용자가 docker pull로 가져올 수 있습니다:

Docker 이미지 pull

docker pull yourdockerid/node-hello-world

본 문서는 Udemy 강의: Docker & Kubernetes : 실전 가이드의 내용을 바탕으로 학습한 내용을 정리한 것입니다.

Last updated on