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 명령어를 배워봅시다.