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