Docker 기본 명령어 실습#

이번 세션에서는 Dockerfile을 통해 이미지를 생성하고, Docker 컨테이너를 실행·확인·접근·로그 조회하는 기본 명령어를 실습합니다.

이번 세션에서는 Dockerfile 작성 → 이미지 생성 → 컨테이너 실행 과정을 통해 Docker 이미지를 생성하고, 컨테이너를 실행·확인·접근·로그 조회하는 기본 명령어를 실습합니다.

example.py 준비#

먼저 Docker 이미지를 생성하기 전에 이미지에서 사용될 간단한 python 예제를 생성합니다.
앞선 단계에서 example.py를 생성했다면 해당 파일을 그대로 사용하면 됩니다.

# -*- coding: utf-8 -*-
import numpy as np
import math

# 무작위로 입력과 출력 데이터를 생성합니다
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)

# 무작위로 가중치를 초기화합니다
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()

learning_rate = 1e-6
for t in range(2000):
    # 순전파 단계: 예측값 y를 계산합니다
    # y = a + b x + c x^2 + d x^3
    y_pred = a + b * x + c * x ** 2 + d * x ** 3

    # 손실(loss)을 계산하고 출력합니다
    loss = np.square(y_pred - y).sum()
    if t % 100 == 99:
        print(t, loss)

    # 손실에 따른 a, b, c, d의 변화도(gradient)를 계산하고 역전파합니다.
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x ** 2).sum()
    grad_d = (grad_y_pred * x ** 3).sum()

    # 가중치를 갱신합니다.
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d

print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')

Dockerfile 작성#

이제 위 example.py를 실행할 환경을 정의하는 Dockerfile을 준비합니다.

# 1. 베이스 이미지 설정
#    - Python 3.9 런타임을 제공하는 공식 이미지
#    - 불필요한 파일을 제거해 용량을 줄인 슬림(slim) 버전 사용
FROM python:3.9-slim

# 2. 작업 디렉터리 생성 및 설정
#    - 컨테이너 내에서 이후 명령이 실행될 기본 디렉터리
WORKDIR /app

# 3. 애플리케이션 코드와 의존성 파일 복사
#    - 로컬의 example.py 파일을 컨테이너의 /app 디렉터리로 복사
COPY example.py .

# 4. 필수 라이브러리 설치
#    - example.py 실행에 필요한 numpy 패키지를 설치
#    - 캐시를 남기지 않는 옵션(--no-cache-dir)으로 이미지 크기 최적화
RUN pip install --no-cache-dir numpy

# 5. 컨테이너 시작 시 실행할 명령어 지정
#    - 컨테이너가 기동되면 자동으로 example.py 스크립트 실행
CMD ["python", "example.py"]

Docker build#

  • 역할

    • 현재 디렉터리(컨텍스트)에 있는 Dockerfile을 읽어 Docker 이미지를 생성합니다.

    • 이미지란 “실행 가능한 애플리케이션 환경의 스냅샷”으로, 이후 docker run으로 컨테이너를 만들 때 사용됩니다.

  • 사용 예시

    # 현재 경로의 Dockerfile을 읽어서 'example:latest'라는 이름의 이미지를 생성
    docker build -t example:latest .
    
    • -t example:latest : 생성될 이미지에 이름(example)과 태그(latest)를 지정, 태그 미지정 시 자동으로 latest 할당

    • . : Dockerfile과 필요한 파일들이 위치한 빌드 컨텍스트 경로

docker pull#

  • 역할

    • Docker Hub(또는 설정된 레지스트리)에서 지정한 이미지를 로컬로 다운로드합니다.

    • 로컬에 이미지가 없으면 자동으로 가져오고, 이미 있으면 최신 상태인지 확인합니다.

  • 사용 예시

    # official nginx 이미지의 latest 태그를 가져옵니다.
    docker pull nginx:latest
    
    # 특정 버전(tag)을 지정해서 가져올 수도 있습니다.
    docker pull python:3.9-slim
    

docker images#

  • 역할

    • 로컬에 저장된 Docker 이미지 목록을 조회합니다.

    • 각 이미지의 REPOSITORY, TAG, IMAGE ID, SIZE 등을 확인할 수 있습니다.

  • 사용 예시

    docker images
    
  • 출력 예시

    REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
    example         latest    4d2eab5f5e3c   2 minutes ago   120MB
    

docker run#

  • 역할

    • 이미지를 실행해 컨테이너 생성 및 시작

  • 주요 옵션

    • -i: 표준 입력(STDIN)을 열어 대화형 실행 가능

    • -t: 터미널(TTY) 할당

    • -d: 백그라운드(detached) 모드

    • -p <호스트포트>:<컨테이너포트>: 포트 포워딩

    • -v <호스트경로>:<컨테이너경로>: 호스트 디렉터리나 볼륨을 컨테이너에 마운트

    • --name <이름>: 컨테이너 이름 지정

    • --rm: 종료 시 컨테이너 자동 삭제

  • 명령(Command) vs 엔트리포인트(Entrypoint)

    • CMD: Dockerfile에 지정된 기본 실행 명령

    • Entrypoint: 컨테이너가 시작될 때 항상 실행되는 프로그램

    • docker run <이미지> <명령> 형태로 CMD를 오버라이드할 수 있습니다.

    • Entrypoint를 설정해 두면, CMD나 docker run 뒤의 명령이 Entrypoint 프로그램의 인자로 전달됩니다.

  • 사용 예시

    # 기본 이미지의 CMD 실행 후 자동 삭제
    docker run -it --rm --name python example:latest
    
    # Bash 셸로 진입 (CMD 대신 bash 실행)
    docker run -it --rm --name python example:latest bash
    
    # Entrypoint 예시
    # Dockerfile에 ENTRYPOINT ["python"] 가 정의된 상태에서
    # CMD ["example.py"] 라면, 아래는 python example.py 대신 python test.py 실행
    docker run example:latest test.py
    

docker ps#

  • 역할

    • 실행 중인 컨테이너 목록 조회

  • 주요 옵션

    • -a: 중지된 컨테이너까지 모두 표시

  • 사용 예시

    # /bin/Bash로 example 컨테이너 백그라운드 실행
    docker run -itd --name python example:latest bash 
    
    # 컨테이너 목록 조회
    docker ps
    
    # 컨테이너 실행 종료
    docker stop python
    
    # 컨테이너 목록 조회 (중지된 컨테이너 포함)
    docker ps -a
    
  • 출력 예시

    CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                  NAMES
    3485330bc129   example:latest   "bash"                   3 seconds ago   Up 3 seconds                          python 
    a1b2c3d4e5f6   my-app:latest    "python example.py"      2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp   webapp
    9f8e7d6c5b4a   redis:latest     "docker-entrypoint.s…"   10 minutes ago  Up 10 minutes  6379/tcp               redis-server
    

docker stop#

  • 역할

    • 실행 중인 컨테이너를 정상 종료(graceful shutdown) 합니다.

    • 컨테이너가 SIGTERM 신호를 받아 정리 작업을 수행한 뒤 종료됩니다.

  • 주요 옵션

    • -t <초> 또는 --time <초>:

      • SIGKILL 신호를 보내기 전 대기할 시간을 지정합니다.

      • 기본값은 10초이며, 이 시간 내에 컨테이너가 종료되지 않으면 강제 종료(SIGKILL)됩니다.

  • 사용 예시

    # 기본 대기 시간(10초) 후 컨테이너 종료
    docker stop python
    
    # 5초 대기 후 컨테이너 종료
    docker stop -t 5 python
    
    # 여러 컨테이너를 동시에 종료
    docker stop python redis-server db
    

docker start#

  • 역할

    • 중지된 컨테이너를 다시 시작(resume)합니다.

  • 주요 옵션

    • -a, --attach : 컨테이너의 stdout/stderr에 연결합니다.

    • -i, --interactive : 표준 입력(STDIN)을 열어둡니다.

  • 사용 예시

    # python 컨테이너를 백그라운드로 시작
    docker start python
    
    # 대화형 모드로 시작(입력 가능)
    docker start -ai python
    
    # 여러 컨테이너를 한 번에 시작
    docker start webapp redis-server db
    

docker exec#

  • 역할

    • 실행 중인 컨테이너 내부 명령 실행

  • 주요 옵션

    • -it: 터미널(interactive) 연결

  • 사용 예시

    # python 컨테이너를 백그라운드로 시작
    docker start python
    
    # 실행 중인 'python' 컨테이너 안에 Bash 셸로 진입
    docker exec -it python bash
    

docker rm#

  • 역할

    • 중지된 컨테이너를 삭제합니다. 삭제된 컨테이너의 데이터(쓰기 레이어 포함)는 복구할 수 없습니다.

  • 주요 옵션

    • -f, --force : 실행 중인 컨테이너를 강제 종료 후 삭제

    • 여러 컨테이너 이름/ID를 공백으로 구분해 한 번에 삭제 가능

  • 사용 예시

    # 중지된 python 컨테이너 삭제
    docker rm python
    
    # 실행 중인 컨테이너를 강제로 종료하고 삭제
    docker rm -f python
    
    # 여러 컨테이너를 동시에 삭제
    docker rm python redis-server db
    

docker logs#

  • 역할

    • 컨테이너의 stdout/stderr 로그 출력

  • 주요 옵션

    • -f: 실시간(follow) 로그 스트리밍

  • 사용 예시:

    # 로그 관찰을 위한 컨테이너 실행
    docker run -d --name log-demo busybox:stable sh -c "while true; do echo \"[$(date '+%T')] Hello from busybox\"; sleep 1; done"
    
    docker logs -f log-demo
    
    docker rm -f log-demo
    

다음 챕터에서는 여러 컨테이너를 함께 정의·관리할 수 있는 Docker Compose 명령어를 배워봅시다.