IT writer

Docker 초보자용 학습 요약 노트

헬로제이콥 2026. 2. 24. 16:03
🐳 Docker 초보자용 학습 요약 노트 (티스토리용)

---

1. 도커 커리큘럼 🐳

우리는 총 4단계를 거쳐 도커의 기본기를 마스터합니다.

1. 기초 개념  
   - 이미지(설계도)와 컨테이너(실행체)의 차이, 격리 원리 이해.

2. 이미지 빌드  
   - Dockerfile을 작성하여 나만의 실행 환경을 만듦.

3. 멀티 컨테이너 관리  
   - Docker Compose를 이용해 여러 서비스를 한 번에 관리.

4. 데이터와 네트워크  
   - 볼륨(Volume)을 통해 데이터를 보존하고, 컨테이너 간 통신 구조 이해.

---

2. 핵심 개념 (Key Concepts) 💡

이미지(Image)
프로그램 실행에 필요한 모든 것을 담은 읽기 전용 스냅샷입니다.  
- 예: `python:3.9-slim`, `nginx:alpine` 등은 이미지 이름입니다.
- 같은 이미지에서 여러 컨테이너를 만들 수 있습니다.

 컨테이너(Container)
이미지를 실행한 상태로, 독립된 박스 안에서 프로세스가 돌아갑니다.  
- 한 번에 여러 컨테이너를 띄워서 서로 다른 앱을 돌릴 수 있습니다.
- 컨테이너가 종료되면 그 안의 **변경사항은 기본적으로 사라집니다.**

 불변성(Immutability)
- 이미지는 변하지 않습니다.
- 설정을 바꾸고 싶으면 `Dockerfile`로 새 이미지를 빌드합니다.
- 컨테이너는 이미지의 “실행 인스턴스”일 뿐, 이미지를 수정하는 것이 아닙니다.

 볼륨(Volume)
컨테이너가 사라져도 데이터를 남기기 위한 외장 금고 역할을 합니다.

```yaml
volumes:
  - dbdata:/var/lib/postgresql/data
  • dbdata처럼 이름이 붙은 볼륨을 사용하면,
    컨테이너를 삭제해도 데이터는 유지됩니다.
  • 개발용으로는 ./local:/app 같은 Bind Mount를 사용해 코드를 실시간 동기화합니다.

네트워크(Network)

컨테이너들이 서로 서비스 이름으로 통신할 수 있게 해주는 통로입니다.

services:
  app:
    depends_on:
      - db

  db:
    image: postgres:14
  • app에서 db로 접속할 때 localhost가 아니라 db라는 이름으로 접속합니다.
  • Docker Compose는 자동으로 하나의 네트워크를 만들어서 서비스 이름 기반 라우팅을 지원합니다.

3. 주요 명령어 (Essential Commands) ⌨️

3.1 이미지 빌드 / 컨테이너 실행

분류명령어설명
빌드 docker build -t [이름] . 현재 폴더의 Dockerfile로 이미지 빌드
실행 (일반) docker run [이름] 해당 이미지로 컨테이너 실행
실행 (대화형) docker run -it [이름] 터미널에서 컨테이너 안으로 들어가 대화
 

예시:

bash
docker build -t my-python-app .
docker run -it my-python-app sh

3.2 컨테이너 상태 확인 / 관리

명령어설명
docker ps -a 모든 컨테이너(실행 중 포함) 상태 확인
docker images 저장된 이미지 목록 확인
docker logs [ID/이름] 컨테이너 내부 로그 확인
 

예시:

docker ps -a
docker logs my-app-container

3.3 Docker Compose 명령어

명령어설명
docker-compose up docker-compose.yml에 정의된 서비스를 모두 실행
docker-compose down 모든 서비스 중지 및 컨테이너 청소
 

예시:

docker-compose up
docker-compose down

4. 예제 파일 (Example Files) 📄

4.1 Dockerfile - 파이썬 앱 예제

# 1. 기초 재료 (OS + 파이썬)
FROM python:3.9-slim

# 2. 컨테이너 안 작업 디렉터리 설정
WORKDIR /app

# 3. 의존성 설치
COPY requirements.txt .
RUN pip install -r requirements.txt

# 4. 코드 복사
COPY main.py .

# 5. 포트 노출 (메타 정보)
EXPOSE 5000

# 6. 실행 명령어
CMD ["python", "main.py"]

main.py 예시:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello from Docker!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

빌드 & 실행:

docker build -t my-flask-app .
docker run -p 8000:5000 my-flask-app

 http://localhost:8000에서 접속 가능.

 

4.2 docker-compose.yml - 앱 + DB 세트 예제

version: '3.8'

services:
  db:
    image: postgres:14
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypass
    volumes:
      - dbdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  app:
    build: .
    ports:
      - "8000:5000"
    depends_on:
      - db
    environment:
      - DB_HOST=db
      - DB_NAME=mydb
      - DB_USER=myuser
      - DB_PASS=mypass

volumes:
  dbdata:
  • db는 PostgreSQL 데이터베이스.
  • app은 앞에서 만든 파이썬 앱.
  • app에서는 환경변수 DB_HOST=db로 db 컨테이너에 접속.

실행:

docker-compose up

4.3 개발용 - 코드 실시간 반영 예제

version: '3.8'

services:
  app:
    build: .
    volumes:
      - .:/app
    ports:
      - "5000:5000"
    command: python /app/main.py
    environment:
      - FLASK_ENV=development
  • . (로컬 폴더)를 컨테이너 /app에 마운트 → 코드 변경 시 바로 반영.
  • FLASK_ENV=development로 개발 모드 설정.

5. 볼륨(Volume) 종류 정리 🧩

5.1 Bind Mount (로컬 폴더 연결)

volumes:
  - .:/app
  • 호스트의 현재 폴더를 컨테이너 안으로 그대로 연결.
  • 개발용으로 코드 실시간 반영에 적합.

5.2 Named Volume (도커가 관리)

volumes:
  dbdata:

services:
  db:
    volumes:
      - dbdata:/var/lib/postgresql/data
  • 데이터베이스 데이터 등 영구적인 저장에 사용.
  • 컨테이너를 삭제해도 dbdata 볼륨은 유지됩니다.

5.3 tmpfs (메모리 전용)

services:
  app:
    volumes:
      - type: tmpfs
        target: /tmp/cache
  • 디스크에 저장되지 않고 메모리만 사용.
  • 세션 캐시, 일시적 데이터 저장에 적합.

6. 네트워크 개념 보충 🌐

  • Docker Compose는 기본적으로 하나의 가상 네트워크를 만들어
    app과 db가 같은 네트워크에 속하게 됩니다.
  • 같은 네트워크에 있으면, 서비스 이름으로 서로 접속 가능:
    • app에서 db로 http://db:5432 또는 postgresql://db:5432/...처럼 접속.

포트 바인딩:

services:
  app:
    ports:
      - "8000:5000"
  • 8000 포트를 호스트에 노출 → localhost:8000로 접속 가능.

7. 초보자용 실습 흐름 추천 🚀

  1. 단일 컨테이너 실행
    •    docker run -it python:3.9-slim python → 컨테이너 안에서 직접 파이썬 실행 보기.
  2. Dockerfile 빌드 + 실행
    •    위 Dockerfile과 main.py 예제로 이미지 빌드 후 실행.
  3. Docker Compose로 앱 + DB
    •     app + db 구조로 구성 후, 앱이 DB에 접속하는 흐름 연습.
  4. 볼륨 / 네트워크 확인
    •     dbdata 볼륨을 유지한 상태에서 컨테이너를 삭제 후 재구동 → 데이터가 남아있는지 확인.