-
Docker 기초 이해
-
왜 도커 인가?
-
이미지와 컨테이너의 개념
-
Docker 설치
-
Docker 명령어
-
이미지 다운로드
-
Docker와 Django 프로젝트 설정
-
Dockerfile 작성
-
Docker 이미지 빌드
-
Docker를 이용해 Django 실행
-
Docker Compose 생성
-
마이그레이션 및 슈퍼유저
-
슈퍼유저 생성
-
Docker를 활용한 개발환경 최적화
-
docker-compose.override.yml
-
Docker를 이용한 배포 준비
-
Nginx와 Gunicorn 설정
-
dockerfile & docker-compose 업데이트
-
Docker Hub에 이미지 푸시
-
Docker Hub 로그인
-
Docker 이미지 태그 추가 & 푸시
-
AWS에 ECS에 Docker 배포
-
CI/CD 파이프라인 구축
-
CI/CD 개념 및 워크 플로우
-
GItHub Actions 설정 파일 작성
Docker 기초 이해
왜 도커 인가?
[Docker] 도커의 필요성과 장점
처음 도커를 접했을 때, 처음에는 너무 어려워서 배워야 하나 라는 생각을 하기도 했지만, 개발 공부를 하고 오픈톡방에서 다양한 정보를 접하면서 도커를 사용하는 사람이 많고 인기를 끌고 있
jongseoung.tistory.com
이미지와 컨테이너의 개념
이미지: 실행 가능한 컨테이너의 청사진(도면)으로 OS, 애플리케이션, 라이브러리 등의 모든 정보가 포함되어 있다.
- Docker 이미지는 여러 레이어로 구성되는데, 레이어는 캐시로 관리 되기 때문에 같은 레이어를 재사용하여 효율성을 높인다.
컨테이너: 이미지를 기반으로 실행되는 인스턴스, 컨테이너는 이미지의 복사본처럼 동작하며 독립된 환경에서 실행
Docker 설치
공식 사이트에서 맥북용 도커를 다운로드 합니다. (본인에 맞게 설치)
설치가 완료 되면, 터미널을 열고 Docker가 설치되었는지 확인해 봅니다.
docker --version

Docker 명령어
이미지 다운로드
아래의 명령어를 이용해서, 이미지를 다운로드 받고 컨테이너를 실행 & 중지 해보자.
sleep를 넣어준 이유는 파이썬 인터프리터를 실행한후, 어떤 명령이 주어지지 않으면 자동으로 종료하기 때문이다.
docker pull python:3.11.6-slim # Python 이미지 다운로드
docker run -it python:3.11.6-slim # Python 환경의 컨테이너 실행
docker run -d python:3.11.6-slim sleep 3600 # Python 환경의 컨테이너를 백그라운드에서 1시간동안 실행
docker ps # 실행 중인 컨테이너 확인
docker stop <CONTAINER_ID> # Django 서버가 포함된 컨테이너 중지
상호작용 모드로 실행

백그라운드에서 실행 & 중지

Docker와 Django 프로젝트 설정
Dockerfile 작성
# dockerfile
FROM python:3.11.6-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements/ requirements/
RUN pip install -r requirements/prod.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Docker 이미지 빌드
docker build -t django-app .

Docker를 이용해 Django 실행
docker run -p 8000:8000 django-app
아래처럼 에러가 발생하는데, 프로젝트에서 sqlite3가 아니라 postgresql을 사용했고 DB가 실행되지않아 5432 포트로 연결이 안된다는 말이다.

Docker Compose 생성
docker-compose는 여러 컨테이너를 조합해 하나의 애플리케이션 스택으로 정의하고 관리한다.
데이터 베이스, 캐시, 웹 서버등 다중 서비스가 필요한 경우 docker-compose.yml을 생성해 줘야한다.
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
expose:
- "5432"
environment:
POSTGRES_DB: todolist
POSTGRES_USER: jongseoung
POSTGRES_PASSWORD: postgres
container_name: POSTGRES_DB
web:
build: .
volumes:
- .:/app
ports:
- "8000:8000"
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
restart: always
container_name: Backend
이제 아래의 명령어를 이용해 이미지 파일과 컨테이너를 빌드 해준다.
docker-compose 파일이 변경된다면, 아래의 명령어를 사용해주면 된다.
docker-compose up --build
만약 docker-compose의 변화 없이 서비스를 시작, 중지는 아래 명령어를 사용하면 된다.
-d 옵션을 붙여서 백그라운드에서 사용 가능하다, docker-compose up -d 처럼
docker-compose up
docker-compose down

마이그레이션 및 슈퍼유저
마이그레이션
현재 Django는 마이그레이션이 안되어있다. docker에 Django 서버가 실행중일때, 아래의 명렁어를 이용하여 마이그레이션을 할 수 있다.
docker exec -it <WEB_CONTAINER_ID> python manage.py migrate
슈퍼유저 생성
아래는 Django 서버가 실행중일때, 슈퍼 유저를 생성하는 명령어이다.
docker exec -it <WEB_CONTAINER_ID> python manage.py createsuperuser
Docker를 활용한 개발환경 최적화
docker-compose.override.yml
docker-compose.override.yml은 기본 docker-compose.yml 파일을 확장하여 개발 환경에 필요한 설정을 추가한다.
version: '3'
services:
web:
command: >
sh -c "python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/app
environment:
- DEBUG=True
ports:
- "8000:8000"
command: 컨테이너가 실행될 때마다 마이그레이션을 자동으로 실행하고, Django 서버를 연다.
volumes: 로컬의 파일이 변경되면 컨테이너에 바로 반영되도록 마운트한다.
환경 변수 설정: DEBUG=True로 개발모드에서 서버가 실행되도록 설정하였다.
이제 서버를 다운 했다가 다시 열어보면 마이그레이 되는것을 확인할 수 있다.

Docker를 이용한 배포 준비
Nginx와 Gunicorn 설정
Gunicorn 설치
Gunicorn은 WSGI 서버로, Django 애플리케이션을 서비스할 때 사용된다. Gunicorn을 requirements에 추가하고 재 빌드 해주면 된다.
이미 빌드 과정에서 pip install -r 을 해주기 때문이다.
Nginx 설정 파일 작성
이 설정은 Nginx가 리버스 프록시로 동작하여 80번 포트로 들어오면 Gunicorn 서버로 요청을 전달하도록 한다.
events { }
http {
upstream django {
server web:8000; # Django 웹 서버와 연결 (컨테이너 이름 사용)
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://django; # 모든 요청을 Django 서버로 프록시
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /app/static/; # 정적 파일 경로를 Nginx가 직접 서빙
}
}
}
dockerfile & docker-compose 업데이트
dockerfile
FROM python:3.11.6-slim as base
# 필수 패키지 설치 (apt 패키지와 pip 설치를 함께)
RUN apt-get update && \
apt-get install -y gcc libpq-dev && \
pip install --upgrade pip && \
pip install psycopg2-binary
# Python 버퍼링 비활성화 (로그 실시간 출력)
ENV PYTHONUNBUFFERED=1
# 작업 디렉터리 설정
WORKDIR /app
# requirements 파일 복사 및 패키지 설치
COPY requirements/ requirements/
RUN pip install -r requirements/prod.txt
# 소스 코드 복사
COPY . .
# Production stage (Gunicorn 실행)
FROM base as production
# 포트 노출
EXPOSE 8000
# 컨테이너 실행 명령어
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]
docker-compose
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
expose:
- "5432"
environment:
POSTGRES_DB: todolist
POSTGRES_USER: jongseoung
POSTGRES_PASSWORD: postgres
container_name: POSTGRES_DB
web:
build: .
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
restart: always
container_name: Backend
nginx:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
depends_on:
- web
container_name: Nginx
command: /bin/sh -c "rm /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
이제 docker-compose up --build를 이용해 모든 서비스를 재 실행해주고, localhost:80번 포트로 들어가게 되면 Django로 연결된다.
이후, 불필요한 이미지와 컨테이너를 정리해준다.
docker system prune -f
Docker Hub에 이미지 푸시
Docker Hub에 이미지를 푸시하면 클라우드 서비스에서 쉽게 가지고와 실행할 수 있다.
Docker Hub 로그인
docker login

로그인을 하면 username과 password를 입력해야하는데, 아래의 주소에서 계정을 만들어주면 된다.
Docker: Accelerated Container Application Development
Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.
www.docker.com
Docker 이미지 태그 추가 & 푸시
docker tag django-app dockerhub-username/django-app
docker push dockerhub-username/django-app
아래처럼 docker hub에서 image가 푸시 된것을 확인할 수 있다.


AWS에 ECS에 Docker 배포
CI/CD 파이프라인 구축
CI/CD 개념 및 워크 플로우
GItHub Actions 설정 파일 작성
name: CI/CD Pipeline
on:
push:
branches:
- main # main 브랜치에 푸시될 때 실행
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 리포지토리 체크아웃
- name: Check out repository
uses: actions/checkout@v3
# 2. Docker 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 3. Docker 이미지 빌드
- name: Build Docker image
run: docker build -t your-dockerhub-username/django-app:latest .
# 4. Docker 이미지 푸시
- name: Push Docker image
run: docker push your-dockerhub-username/django-app:latest
# 5. 배포 (선택: ECS 또는 Cloud Run 트리거)
- name: Deploy to Cloud Run (Optional)
env:
PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
SERVICE_NAME: django-app
run: |
gcloud auth activate-service-account --key-file ${{ secrets.GCP_KEY }}
gcloud run deploy $SERVICE_NAME --image=gcr.io/$PROJECT_ID/django-app:latest --region=us-central1 --platform=managed
'Django > 인프라' 카테고리의 다른 글
docker 파일 별 용도 및 이미지 빌드 & 실행 방법 (0) | 2025.01.11 |
---|---|
[Docker] 도커의 필요성과 장점 (1) | 2024.10.17 |
[AWS] Micro Service Architecture (0) | 2024.10.17 |
[AWS] CloudFront (0) | 2024.10.15 |
[AWS] 스토리지 클래스와 Lifecycle (0) | 2024.10.14 |
Docker 기초 이해
왜 도커 인가?
[Docker] 도커의 필요성과 장점
처음 도커를 접했을 때, 처음에는 너무 어려워서 배워야 하나 라는 생각을 하기도 했지만, 개발 공부를 하고 오픈톡방에서 다양한 정보를 접하면서 도커를 사용하는 사람이 많고 인기를 끌고 있
jongseoung.tistory.com
이미지와 컨테이너의 개념
이미지: 실행 가능한 컨테이너의 청사진(도면)으로 OS, 애플리케이션, 라이브러리 등의 모든 정보가 포함되어 있다.
- Docker 이미지는 여러 레이어로 구성되는데, 레이어는 캐시로 관리 되기 때문에 같은 레이어를 재사용하여 효율성을 높인다.
컨테이너: 이미지를 기반으로 실행되는 인스턴스, 컨테이너는 이미지의 복사본처럼 동작하며 독립된 환경에서 실행
Docker 설치
공식 사이트에서 맥북용 도커를 다운로드 합니다. (본인에 맞게 설치)
설치가 완료 되면, 터미널을 열고 Docker가 설치되었는지 확인해 봅니다.
docker --version

Docker 명령어
이미지 다운로드
아래의 명령어를 이용해서, 이미지를 다운로드 받고 컨테이너를 실행 & 중지 해보자.
sleep를 넣어준 이유는 파이썬 인터프리터를 실행한후, 어떤 명령이 주어지지 않으면 자동으로 종료하기 때문이다.
docker pull python:3.11.6-slim # Python 이미지 다운로드
docker run -it python:3.11.6-slim # Python 환경의 컨테이너 실행
docker run -d python:3.11.6-slim sleep 3600 # Python 환경의 컨테이너를 백그라운드에서 1시간동안 실행
docker ps # 실행 중인 컨테이너 확인
docker stop <CONTAINER_ID> # Django 서버가 포함된 컨테이너 중지
상호작용 모드로 실행

백그라운드에서 실행 & 중지

Docker와 Django 프로젝트 설정
Dockerfile 작성
# dockerfile
FROM python:3.11.6-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements/ requirements/
RUN pip install -r requirements/prod.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Docker 이미지 빌드
docker build -t django-app .

Docker를 이용해 Django 실행
docker run -p 8000:8000 django-app
아래처럼 에러가 발생하는데, 프로젝트에서 sqlite3가 아니라 postgresql을 사용했고 DB가 실행되지않아 5432 포트로 연결이 안된다는 말이다.

Docker Compose 생성
docker-compose는 여러 컨테이너를 조합해 하나의 애플리케이션 스택으로 정의하고 관리한다.
데이터 베이스, 캐시, 웹 서버등 다중 서비스가 필요한 경우 docker-compose.yml을 생성해 줘야한다.
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
expose:
- "5432"
environment:
POSTGRES_DB: todolist
POSTGRES_USER: jongseoung
POSTGRES_PASSWORD: postgres
container_name: POSTGRES_DB
web:
build: .
volumes:
- .:/app
ports:
- "8000:8000"
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
restart: always
container_name: Backend
이제 아래의 명령어를 이용해 이미지 파일과 컨테이너를 빌드 해준다.
docker-compose 파일이 변경된다면, 아래의 명령어를 사용해주면 된다.
docker-compose up --build
만약 docker-compose의 변화 없이 서비스를 시작, 중지는 아래 명령어를 사용하면 된다.
-d 옵션을 붙여서 백그라운드에서 사용 가능하다, docker-compose up -d 처럼
docker-compose up
docker-compose down

마이그레이션 및 슈퍼유저
마이그레이션
현재 Django는 마이그레이션이 안되어있다. docker에 Django 서버가 실행중일때, 아래의 명렁어를 이용하여 마이그레이션을 할 수 있다.
docker exec -it <WEB_CONTAINER_ID> python manage.py migrate
슈퍼유저 생성
아래는 Django 서버가 실행중일때, 슈퍼 유저를 생성하는 명령어이다.
docker exec -it <WEB_CONTAINER_ID> python manage.py createsuperuser
Docker를 활용한 개발환경 최적화
docker-compose.override.yml
docker-compose.override.yml은 기본 docker-compose.yml 파일을 확장하여 개발 환경에 필요한 설정을 추가한다.
version: '3'
services:
web:
command: >
sh -c "python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/app
environment:
- DEBUG=True
ports:
- "8000:8000"
command: 컨테이너가 실행될 때마다 마이그레이션을 자동으로 실행하고, Django 서버를 연다.
volumes: 로컬의 파일이 변경되면 컨테이너에 바로 반영되도록 마운트한다.
환경 변수 설정: DEBUG=True로 개발모드에서 서버가 실행되도록 설정하였다.
이제 서버를 다운 했다가 다시 열어보면 마이그레이 되는것을 확인할 수 있다.

Docker를 이용한 배포 준비
Nginx와 Gunicorn 설정
Gunicorn 설치
Gunicorn은 WSGI 서버로, Django 애플리케이션을 서비스할 때 사용된다. Gunicorn을 requirements에 추가하고 재 빌드 해주면 된다.
이미 빌드 과정에서 pip install -r 을 해주기 때문이다.
Nginx 설정 파일 작성
이 설정은 Nginx가 리버스 프록시로 동작하여 80번 포트로 들어오면 Gunicorn 서버로 요청을 전달하도록 한다.
events { }
http {
upstream django {
server web:8000; # Django 웹 서버와 연결 (컨테이너 이름 사용)
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://django; # 모든 요청을 Django 서버로 프록시
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /app/static/; # 정적 파일 경로를 Nginx가 직접 서빙
}
}
}
dockerfile & docker-compose 업데이트
dockerfile
FROM python:3.11.6-slim as base
# 필수 패키지 설치 (apt 패키지와 pip 설치를 함께)
RUN apt-get update && \
apt-get install -y gcc libpq-dev && \
pip install --upgrade pip && \
pip install psycopg2-binary
# Python 버퍼링 비활성화 (로그 실시간 출력)
ENV PYTHONUNBUFFERED=1
# 작업 디렉터리 설정
WORKDIR /app
# requirements 파일 복사 및 패키지 설치
COPY requirements/ requirements/
RUN pip install -r requirements/prod.txt
# 소스 코드 복사
COPY . .
# Production stage (Gunicorn 실행)
FROM base as production
# 포트 노출
EXPOSE 8000
# 컨테이너 실행 명령어
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]
docker-compose
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
expose:
- "5432"
environment:
POSTGRES_DB: todolist
POSTGRES_USER: jongseoung
POSTGRES_PASSWORD: postgres
container_name: POSTGRES_DB
web:
build: .
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
restart: always
container_name: Backend
nginx:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
depends_on:
- web
container_name: Nginx
command: /bin/sh -c "rm /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
이제 docker-compose up --build를 이용해 모든 서비스를 재 실행해주고, localhost:80번 포트로 들어가게 되면 Django로 연결된다.
이후, 불필요한 이미지와 컨테이너를 정리해준다.
docker system prune -f
Docker Hub에 이미지 푸시
Docker Hub에 이미지를 푸시하면 클라우드 서비스에서 쉽게 가지고와 실행할 수 있다.
Docker Hub 로그인
docker login

로그인을 하면 username과 password를 입력해야하는데, 아래의 주소에서 계정을 만들어주면 된다.
Docker: Accelerated Container Application Development
Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.
www.docker.com
Docker 이미지 태그 추가 & 푸시
docker tag django-app dockerhub-username/django-app
docker push dockerhub-username/django-app
아래처럼 docker hub에서 image가 푸시 된것을 확인할 수 있다.


AWS에 ECS에 Docker 배포
CI/CD 파이프라인 구축
CI/CD 개념 및 워크 플로우
GItHub Actions 설정 파일 작성
name: CI/CD Pipeline
on:
push:
branches:
- main # main 브랜치에 푸시될 때 실행
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 리포지토리 체크아웃
- name: Check out repository
uses: actions/checkout@v3
# 2. Docker 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 3. Docker 이미지 빌드
- name: Build Docker image
run: docker build -t your-dockerhub-username/django-app:latest .
# 4. Docker 이미지 푸시
- name: Push Docker image
run: docker push your-dockerhub-username/django-app:latest
# 5. 배포 (선택: ECS 또는 Cloud Run 트리거)
- name: Deploy to Cloud Run (Optional)
env:
PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
SERVICE_NAME: django-app
run: |
gcloud auth activate-service-account --key-file ${{ secrets.GCP_KEY }}
gcloud run deploy $SERVICE_NAME --image=gcr.io/$PROJECT_ID/django-app:latest --region=us-central1 --platform=managed
'Django > 인프라' 카테고리의 다른 글
docker 파일 별 용도 및 이미지 빌드 & 실행 방법 (0) | 2025.01.11 |
---|---|
[Docker] 도커의 필요성과 장점 (1) | 2024.10.17 |
[AWS] Micro Service Architecture (0) | 2024.10.17 |
[AWS] CloudFront (0) | 2024.10.15 |
[AWS] 스토리지 클래스와 Lifecycle (0) | 2024.10.14 |