콘텐츠로 이동

Docker 완전 정복 가이드 📚

컨테이너 기술로 개발 환경을 더 쉽게 만들어보자!

📖 목차

  1. 컨테이너 생성 기초
  2. 컨테이너 연동 (네트워크)
  3. Django + Docker 실전 프로젝트
  4. 현업에서 주로 사용하는 것들

1. 컨테이너 생성 기초

🤔 Docker가 뭔가요?

Docker는 "가상의 컴퓨터"를 만들어주는 도구입니다. - 실제 컴퓨터 안에 여러 개의 작은 컴퓨터를 만들 수 있어요 - 각각의 작은 컴퓨터에 다른 프로그램을 설치해서 사용할 수 있어요 - 이 작은 컴퓨터를 "컨테이너"라고 부릅니다

graph TD
    A[내 컴퓨터] --> B[Docker]
    B --> C[Ubuntu 컨테이너]
    B --> D[MySQL 컨테이너]
    B --> E[웹서버 컨테이너]

    C --> C1[Linux 운영체제]
    D --> D1[데이터베이스]
    E --> E1[Apache 웹서버]

📦 다양한 종류의 컨테이너

1) 운영체제 컨테이너

컴퓨터의 기본 시스템이 들어있는 컨테이너들

이미지 이름 설명 사용법
ubuntu 우분투 리눅스 명령어 입력용
centos CentOS 리눅스 명령어 입력용
alpine 가벼운 리눅스 크기가 작아서 빠름
# Ubuntu 컨테이너 실행하기
docker container run -it ubuntu /bin/bash
# ↑ -it: 명령어를 직접 입력할 수 있게 해주는 옵션
# ↑ /bin/bash: 리눅스 명령어를 입력할 수 있는 화면 실행

2) 웹서버/데이터베이스 컨테이너

웹사이트나 데이터를 저장하는 프로그램이 들어있는 컨테이너들

이미지 이름 설명 주요 용도
httpd Apache 웹서버 웹사이트 운영
nginx Nginx 웹서버 빠른 웹서버
mysql MySQL 데이터베이스 데이터 저장
# Apache 웹서버 실행하기
docker container run --name my-web -d -p 8080:80 httpd
# ↑ --name my-web: 컨테이너에 이름 붙이기
# ↑ -d: 백그라운드에서 실행 (화면에 안 보이게)
# ↑ -p 8080:80: 내 컴퓨터 8080번을 컨테이너 80번에 연결

🏗️ 실습: 여러 웹서버 동시에 실행하기

graph LR
    A[내 컴퓨터] --> B[포트 8081]
    A --> C[포트 8082] 
    A --> D[포트 8083]

    B --> E[Apache 컨테이너 1]
    C --> F[Apache 컨테이너 2]
    D --> G[Apache 컨테이너 3]

    E --> E1[웹사이트 1]
    F --> F1[웹사이트 2] 
    G --> G1[웹사이트 3]

1단계: 컨테이너 3개 만들기

# 첫 번째 웹서버 (포트 8081)
docker container run --name apa000ex3 -d -p 8081:80 httpd

# 두 번째 웹서버 (포트 8082) 
docker container run --name apa000ex4 -d -p 8082:80 httpd

# 세 번째 웹서버 (포트 8083)
docker container run --name apa000ex5 -d -p 8083:80 httpd

2단계: 잘 실행되는지 확인하기

# 실행 중인 컨테이너 목록 보기
docker container ls

3단계: 웹브라우저에서 접속하기 - http://localhost:8081 - http://localhost:8082 - http://localhost:8083

4단계: 정리하기 (사용 완료 후)

# 컨테이너 중지하기
docker container stop apa000ex3 apa000ex4 apa000ex5

# 컨테이너 삭제하기
docker container rm apa000ex3 apa000ex4 apa000ex5

🗄️ MySQL 데이터베이스 실습

# MySQL 컨테이너 실행
docker run --name mysql-test \
  -d -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=mypassword \
  mysql:8.0
# ↑ -e: 환경변수 설정 (MySQL 관리자 비밀번호)

# 컨테이너 안으로 들어가기
docker exec -it mysql-test bash
# ↑ exec: 실행 중인 컨테이너에 명령어 실행
# ↑ -it: 직접 명령어 입력 가능
# ↑ bash: 리눅스 명령어 입력 화면

# MySQL에 접속하기 (컨테이너 안에서)
mysql -u root -p
# 비밀번호 입력: mypassword

# 간단한 데이터베이스 작업
SHOW DATABASES;           # 데이터베이스 목록 보기
CREATE DATABASE testdb;   # 새 데이터베이스 만들기
USE testdb;              # 데이터베이스 선택하기

2. 컨테이너 연동 (네트워크)

🌐 왜 컨테이너를 연결해야 하나요?

실제 웹사이트는 여러 부분으로 나뉩니다: - 웹서버: 사용자가 보는 화면 - 데이터베이스: 정보를 저장하는 곳

이 둘이 서로 대화할 수 있어야 웹사이트가 제대로 작동합니다!

graph TD
    A[사용자] --> B[WordPress 컨테이너]
    B --> C[MySQL 컨테이너]

    B1[웹사이트 화면] --> B
    C1[사용자 정보, 글 내용] --> C

    D[Docker 네트워크] --> B
    D --> C

🔗 WordPress + MySQL 연동 실습

1단계: 네트워크 만들기

# 컨테이너들이 대화할 수 있는 네트워크 생성
docker network create wordpressnet01
# ↑ 가상의 인터넷망 만들기

2단계: MySQL 데이터베이스 컨테이너 실행

docker container run --name mysqlex01 -dit \
  --net=wordpressnet01 \
  -e MYSQL_ROOT_PASSWORD=myrootpass \
  -e MYSQL_DATABASE=wordpressdb \
  -e MYSQL_USER=wordpresskim \
  -e MYSQL_PASSWORD=wkimpass \
  mysql \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

각 줄의 의미: - --name mysqlex01: 컨테이너 이름 - --net=wordpressnet01: 만든 네트워크에 연결 - -e MYSQL_DATABASE=wordpressdb: WordPress용 데이터베이스 생성 - -e MYSQL_USER=wordpresskim: WordPress가 사용할 계정 생성 - --character-set-server=utf8mb4: 한글 지원

3단계: WordPress 컨테이너 실행

docker run --name wordpressex01 -dit \
  --net=wordpressnet01 \
  -p 80:80 \
  -e WORDPRESS_DB_HOST=mysqlex01 \
  -e WORDPRESS_DB_NAME=wordpressdb \
  -e WORDPRESS_DB_USER=wordpresskim \
  -e WORDPRESS_DB_PASSWORD=wkimpass \
  wordpress

각 줄의 의미: - -p 80:80: 웹사이트를 80번 포트로 열기 - -e WORDPRESS_DB_HOST=mysqlex01: MySQL 컨테이너와 연결 - 나머지는 MySQL과 같은 정보로 설정

4단계: 웹사이트 확인 - http://localhost 접속 - WordPress 설치 화면이 나타납니다!

sequenceDiagram
    participant U as 사용자
    participant W as WordPress 컨테이너
    participant M as MySQL 컨테이너

    U->>W: 웹사이트 접속
    W->>M: 데이터 요청
    M->>W: 데이터 전달
    W->>U: 웹페이지 표시

3. Django + Docker 실전 프로젝트

🐍 Django란?

Python으로 만든 웹사이트 개발 도구입니다. - Instagram, YouTube도 Django로 만들어졌어요! - 빠르고 안전한 웹사이트를 만들 수 있습니다

🛠️ 개발 환경 준비

1단계: Python 가상환경 만들기

# pyenv 설치 (Python 버전 관리 도구)
curl https://pyenv.run | bash

# Python 3.11.9 설치
pyenv install 3.11.9
pyenv global 3.11.9

# 가상환경 생성 (프로젝트별로 독립된 환경)
pyenv virtualenv 3.11.9 py3_11_9
pyenv activate py3_11_9  # 가상환경 활성화

2단계: 필요한 라이브러리 설치

# Django 및 관련 도구들 설치
pip install django gunicorn psycopg2-binary
# ↑ django: 웹 개발 프레임워크
# ↑ gunicorn: 웹서버 (실제 서비스용)
# ↑ psycopg2-binary: PostgreSQL 연결용

🏗️ Django 프로젝트 생성

1단계: 새 프로젝트 만들기

# myapp이라는 Django 프로젝트 생성
django-admin startproject myapp
cd myapp

# 프로젝트 구조 확인
tree ./

2단계: 설정 파일 수정

# myapp/settings.py 파일 수정
ALLOWED_HOSTS = ['*']  # 모든 접속 허용
# ↑ 외부에서 접속할 수 있게 하는 설정

3단계: 데이터베이스 초기화

# Django가 사용할 기본 테이블들 생성
python manage.py migrate

4단계: 개발 서버 실행

# 개발용 서버 시작
python manage.py runserver 0.0.0.0:8000
# ↑ 0.0.0.0: 모든 IP에서 접속 가능
# ↑ 8000: 사용할 포트 번호

🐳 Django를 Docker로 만들기

graph TD
    A[Django 소스코드] --> B[Dockerfile]
    B --> C[Docker 이미지 빌드]
    C --> D[Docker 컨테이너 실행]

    D --> E[웹사이트 서비스]

    F[requirements.txt] --> B
    G[Django 설정파일] --> A

1단계: requirements.txt 파일 만들기

# 프로젝트에서 사용하는 라이브러리 목록
echo "django==4.2.7" > requirements.txt

2단계: Dockerfile 작성

# Python 3.11.9를 기반으로 이미지 만들기
FROM python:3.11.9

# 컨테이너 안에서 작업할 폴더 설정
WORKDIR /usr/src/app

# 라이브러리 목록 파일을 먼저 복사 (빌드 최적화)
COPY requirements.txt .

# pip 업그레이드하고 필요한 라이브러리 설치
RUN python -m pip install --upgrade pip \
    && pip install -r requirements.txt

# 나머지 프로젝트 파일들 복사
COPY . .

# Django 프로젝트 폴더로 이동
WORKDIR /usr/src/app/myapp

# 8000번 포트 사용한다고 알려주기
EXPOSE 8000

# 컨테이너 실행할 때 Django 서버 시작
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

3단계: Docker 이미지 만들기

# Dockerfile을 읽어서 myweb01이라는 이미지 생성
docker image build . -t myweb01
# ↑ .: 현재 폴더의 Dockerfile 사용
# ↑ -t myweb01: 이미지 이름을 myweb01로 설정

4단계: 컨테이너로 실행하기

# 만든 이미지로 컨테이너 실행
docker container run -d -p 8000:8000 myweb01
# ↑ -d: 백그라운드에서 실행
# ↑ -p 8000:8000: 내 컴퓨터 8000번을 컨테이너 8000번에 연결

5단계: 웹사이트 확인 - http://localhost:8000 접속 - Django 기본 페이지가 나타납니다!

📝 YAML 파일 이해하기

YAML은 설정 파일을 쉽게 읽고 쓸 수 있게 해주는 형식입니다.

# yaml_practice.yml 예시
kind: Pod                    # 종류: Pod
metadata:                    # 정보
  name: nginx               # 이름: nginx
spec:                       # 상세 설정
  containers:               # 컨테이너 목록
    - name: nginx           # 첫 번째 컨테이너
      image: nginx:latest   # 사용할 이미지
    - name: ubuntu          # 두 번째 컨테이너  
      image: ubuntu:latest  # 사용할 이미지

YAML 규칙: - : 다음에는 반드시 공백 - 들여쓰기로 구조 표현 (스페이스 사용) - -로 시작하면 목록의 항목


4. 현업에서 주로 사용하는 것들

🏢 실제 회사에서는...

자주 사용하는 이미지들

mindmap
  root((현업 Docker))
    웹서버
      nginx
      apache
    데이터베이스
      postgresql
      mysql
      redis
    프로그래밍 언어
      node.js
      python
      openjdk
    모니터링
      prometheus
      grafana
용도 현업 선호 이미지 이유
웹서버 nginx > apache 더 빠르고 적은 메모리 사용
데이터베이스 postgresql > mysql 더 안정적이고 기능이 많음
캐시 redis 매우 빠른 임시 데이터 저장
메시지 큐 rabbitmq 대용량 데이터 처리

현업 Docker 사용 패턴

1) 멀티 스테이지 빌드

# 빌드 단계
FROM node:16 AS builder
COPY . .
RUN npm install && npm run build

# 실행 단계 (용량 최소화)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

2) Docker Compose 사용

# docker-compose.yml - 여러 컨테이너 관리
version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: secret

3) 환경별 설정 분리

# 개발환경
docker-compose -f docker-compose.dev.yml up

# 운영환경  
docker-compose -f docker-compose.prod.yml up

보안 모범 사례

# ❌ 나쁜 예
FROM ubuntu
RUN apt-get update && apt-get install -y python3
USER root

# ✅ 좋은 예
FROM python:3.11-alpine    # 경량화된 이미지 사용
RUN adduser -D appuser     # 일반 사용자 생성
USER appuser               # root 권한 사용 안함
COPY --chown=appuser . .   # 파일 소유권 설정

모니터링과 로깅

# 컨테이너 리소스 사용량 모니터링
docker stats

# 로그 확인
docker logs -f container_name

# 헬스체크 추가
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/ || exit 1

🎯 현업 팁

  1. 이미지 태그 관리

    # ❌ 피하기: latest 태그
    docker pull mysql:latest
    
    # ✅ 권장: 구체적인 버전
    docker pull mysql:8.0.35
    

  2. 환경 변수로 설정 관리

    # .env 파일 사용
    DB_PASSWORD=secret123
    API_KEY=abc123
    
    # docker-compose에서 활용
    docker-compose --env-file .env up
    

  3. 멀티 아키텍처 지원

    # ARM64, AMD64 모두 지원하는 이미지 빌드
    docker buildx build --platform linux/amd64,linux/arm64 -t myapp .
    


🎓 마무리

이제 Docker의 기본기부터 실전 활용까지 모두 배웠습니다!

📚 학습한 내용 요약

  1. 컨테이너 기초: 가상의 작은 컴퓨터 만들기
  2. 네트워크 연동: 컨테이너들이 서로 대화하게 하기
  3. Django 배포: Python 웹 애플리케이션을 컨테이너로 만들기
  4. 현업 노하우: 실제 회사에서 사용하는 기법들

🚀 다음 단계

  • Kubernetes: 많은 컨테이너를 자동으로 관리
  • CI/CD: 코드 변경시 자동으로 배포
  • 마이크로서비스: 큰 시스템을 작은 서비스들로 나누기

Docker는 현대 개발의 필수 도구입니다. 차근차근 연습하면서 실력을 늘려가세요! 🎉