Skip to content

Commit

Permalink
docs: docker
Browse files Browse the repository at this point in the history
  • Loading branch information
imb96 committed Jan 11, 2025
1 parent c786ff6 commit 8861928
Showing 1 changed file with 228 additions and 0 deletions.
228 changes: 228 additions & 0 deletions data/blog/docker.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
---
title: Docker 환경 구성 가이드
date: '2025-01-11'
tags: ['docker']
draft: false
summary: Docker로 프론트(Next.js), 백엔드(Django) 개발 환경 구성하기
---

> 해당글은 프론트엔드 (Next.js), 백엔드 (Django)를 예시로 작성되었습니다.
# Docker 환경 구성 가이드 🐳

### Docker를 사용하는 이유와 장점

Docker는 현대적인 소프트웨어 개발 환경에서 필수 도구로 자리 잡았습니다. Docker를 사용하면 아래와 같은 이점을 누릴 수 있습니다:

1. 환경 일관성 보장

- 개발, 테스트, 운영 환경이 동일하게 유지됩니다.
- “로컬에서는 잘 되는데 서버에서 안 돼요.” 같은 문제가 줄어듭니다.

2. 의존성 관리
- 각 컨테이너는 필요한 라이브러리와 종속성을 포함하므로 충돌을 방지할 수 있습니다.
- 다양한 애플리케이션을 서로 격리하여 실행할 수 있습니다.
3. 확장성 및 유연성
- 서비스 기반 아키텍처(Microservices)를 손쉽게 구성하고 관리할 수 있습니다.
- 필요할 때 컨테이너를 추가하거나 제거해 유연하게 확장 가능합니다.
4. 손쉬운 배포
- Docker 이미지를 통해 일관된 배포가 가능합니다.
- CI/CD와 통합하면 자동화된 배포 프로세스를 구현할 수 있습니다.
5. 자원 효율성
- VM(가상 머신)보다 경량으로 실행되며, 더 적은 리소스를 사용합니다.
- 컨테이너는 OS 커널을 공유하므로 빠르게 시작하고 종료됩니다.
6. 협업 효율성
- 모든 팀원이 동일한 Docker 이미지를 사용하므로 협업이 간편해집니다.
- 새로운 팀원이 프로젝트를 시작할 때 복잡한 환경 설정이 필요 없습니다.

### 사전 준비사항

시작하기 전에 다음이 준비되어야 합니다:

- Docker Desktop 설치
- Git 설치
- 프로젝트 코드 준비

### 프로젝트 구조 설정

```shell
# 프로젝트 루트 디렉토리
your-project/
├── frontend/
├── backend/
└── docker-compose.yml
```

### Dockerfile 생성 🛠️

백엔드 Dockerfile

```shell
# backend/Dockerfile 생성
cd backend
touch Dockerfile
```

Dockerfile 내용:

```Dockerfile
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
```

### 프론트엔드 Dockerfile

```shell
# frontend/Dockerfile 생성
cd ../frontend
touch Dockerfile
```

Dockerfile 내용:

```dockerfile
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
ENV NODE_ENV=development
CMD ["npm", "run", "dev"]
```

### docker-compose.yml 작성

프로젝트 루트 디렉토리에 docker-compose.yml 파일을 생성합니다:

```shell
cd ..
touch docker-compose.yml
```

docker-compose.yml 내용:

```yaml
version: '3'

services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: 'your_db'
MYSQL_USER: 'your_user'
MYSQL_PASSWORD: 'your_password'
MYSQL_ROOT_PASSWORD: 'your_root_password'
ports:
- '3306:3306'
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
timeout: 5s
retries: 5

backend:
build: ./backend
ports:
- '8000:8000'
volumes:
- ./backend:/app
environment:
- DEBUG=1
- DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,backend
- MYSQL_HOST=db
- MYSQL_DATABASE=your_db
- MYSQL_USER=your_user
- MYSQL_PASSWORD=your_password
depends_on:
db:
condition: service_healthy

frontend:
build: ./frontend
ports:
- '3000:3000'
volumes:
- ./frontend:/app
- /app/node_modules
environment:
- NODE_ENV=development
depends_on:
- backend

volumes:
mysql_data:
```
### 환경변수 설정
프론트엔드 환경변수 설정
```shell
# frontend/src/config/index.ts 생성
mkdir -p frontend/src/config
touch frontend/src/config/index.ts
```

index.ts 내용:

```ts
export const BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://backend:8000'
```

### 백엔드 설정 수정

Django의 settings.py에 아래 내용을 추가합니다:

```python
ALLOWED_HOSTS = [
'localhost',
'127.0.0.1',
'backend',
]

CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
"http://frontend:3000",
]

CORS_ALLOW_CREDENTIALS = True
```

### 실행 및 관리

docker 서비스 시작

```shell
# 이미지 빌드 및 컨테이너 시작
docker-compose up --build

# 백그라운드 실행
docker-compose up -d --build
```

### 서비스 종료

```shell
# 실행 중인 서비스 종료
docker-compose down

# 볼륨까지 삭제
docker-compose down -v
```

### 로그 확인

```shell
# 전체 로그
docker-compose logs

# 특정 서비스 로그
docker-compose logs backend
docker-compose logs frontend
```

0 comments on commit 8861928

Please sign in to comment.