1. Docker 핵심 아키텍처
Docker는 애플리케이션 실행에 필요한 환경을 **이미지(Image)**라는 단위로 패키징하고, 이를 **컨테이너(Container)**라는 격리된 프로세스로 실행합니다.
- Image (이미지): 애플리케이션 실행을 위한 읽기 전용 템플릿입니다. 소스 코드, 라이브러리, 종속성, 도구 등이 포함된 '클래스(Class)'와 같습니다.
- Container (컨테이너): 이미지를 실행한 상태입니다. 이미지의 '인스턴스(Instance)'이며, 격리된 파일 시스템과 네트워크를 가집니다.
- Dockerfile: 이미지를 생성하는 명세서입니다. FROM, RUN, COPY 등의 명령어로 빌드 과정을 코드로 정의합니다.
- Docker Compose: 여러 컨테이너(예: Web + DB)를 정의하고 실행하는 오케스트레이션 도구입니다.
2. 엔지니어의 Docker 워크플로우 (Build - Ship - Run)
가장 많이 사용하게 될 흐름은 다음과 같습니다.
A. 이미지 가져오기 및 실행 (Run)
가장 기본적인 사용법입니다. Docker Hub 등 레지스트리에서 이미지를 받아 실행합니다.
# Nginx 웹 서버 실행 예시
docker run -d -p 8080:80 --name my-webserver nginx:latest
- -d: 백그라운드 실행
- -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트와 연결
- --name: 컨테이너 이름 지정
B. 나만의 이미지 만들기 (Build)
프로젝트 루트에 Dockerfile을 작성하여 커스텀 이미지를 빌드합니다.
Dockerfile 예시 (Node.js):
# 1. 베이스 이미지 선택
FROM node:18-alpine
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 의존성 파일 복사 및 설치 (캐싱 활용을 위해 소스보다 먼저)
COPY package*.json ./
RUN npm install
# 4. 소스 코드 복사
COPY . .
# 5. 실행 명령어 정의
CMD ["npm", "start"]
빌드 및 실행:
docker build -t my-app:v1 . # 현재 디렉토리(.)의 Dockerfile로 빌드
docker run my-app:v1
C. 멀티 컨테이너 관리 (Compose)
실무에서는 docker run 명령어를 일일이 치기보다 docker-compose.yml 파일로 인프라를 코드화(IaC)하여 관리합니다.
docker-compose.yml 예시:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:14
volumes:
- db_data:/var/lib/postgresql/data # 데이터 영속성 보장
volumes:
db_data:
실행:
docker-compose up -d # 서비스 전체 실행
docker-compose down # 서비스 전체 중단 및 삭제
3. 필수 명령어 치트시트
이미지 관리
- docker images: 다운로드된 이미지 목록 확인
- docker rmi [이미지ID]: 이미지 삭제
- docker build -t [이름] .: 이미지 빌드
컨테이너 라이프사이클
- docker ps: 실행 중인 컨테이너 목록
- docker ps -a: 중지된 컨테이너 포함 전체 목록
- docker stop [ID]: 컨테이너 우아한 종료 (SIGTERM)
- docker kill [ID]: 컨테이너 강제 종료 (SIGKILL)
- docker rm [ID]: 컨테이너 삭제 (실행 중이면 -f 필요)
디버깅 및 로그
- docker logs -f [ID]: 로그 실시간 확인 (엔지니어 필수 명령어)
- docker exec -it [ID] /bin/bash: 실행 중인 컨테이너 내부로 쉘 접속
- docker inspect [ID]: 컨테이너 상세 정보(IP, 볼륨 마운트 등) 확인
4. 엔지니어를 위한 Best Practices
- 가벼운 베이스 이미지 사용: ubuntu 대신 alpine과 같은 최소 이미지를 사용하여 빌드 속도와 보안성을 높이세요.
- 멀티 스테이지 빌드 (Multi-stage Build): 빌드 도구(예: JDK, Node 등)는 최종 이미지에서 제거하여 용량을 줄이세요.
- 레이어 캐싱 활용: 변경이 잦은 소스 코드(COPY . .)는 package.json 설치(RUN npm install)보다 나중에 배치해야 빌드 속도가 빨라집니다.
- .dockerignore 사용: .git, node_modules 등 불필요한 파일이 빌드 컨텍스트에 포함되지 않도록 설정하세요.
- 볼륨 사용: 데이터베이스 데이터나 로그 파일은 반드시 Volume을 사용하여 컨테이너가 삭제되어도 데이터가 유실되지 않도록 하세요.
'Tool > Docker' 카테고리의 다른 글
| Docker 기본 개념 및 사용법-02 (0) | 2026.02.26 |
|---|