[meetings] ec2에 도커 설정

yoon·2023년 11월 16일

meetings

목록 보기
1/13

1. AWS EC2 인스턴스를 생성해준다.

보안그룹 설정
인바운드 규칙 추가 > SSH, HTTP, HTTPS

2. SSH(secure shell) 연결하기

Linux 환경에서 작업할 때는 일반적으로 서버에 직접 접근하는 것이 아니라, ssh 연결을 하여 작업한다.

ssh 연결을 위해서 인스턴스 생성 시 저장해두었던 .pem 파일이 필요하다.

# git bash에 작성
ssh -i <.pem경로> ubuntu @ <인스턴스 퍼블릭IPv4주소>

.pem 경로는 파일을 드래그해서 터미널에 붙이면 자동으로 써진다.

정상적으로 접속했다면 backend 코드를 clone해오면 된다.

✔ private repository clone 방법
현재 github의 아이디와 패스워드로 clone해오는 방법은 사용할 수 없다.

github > settings > developer settings > personal access tokens > Tokens(classic)

토큰 발급 후 터미널에 아래와 같이 작성해준다.

https://{nickname}:{token}@github.com/your-nickname/your-repository.git


✔ timezone 설정
date 명령어를 입력하면 UTC로 설정되어 있는 것을 확인할 수 있다.
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
기존 timezone 설정을 Asia/Seoul 로 덮어써준 후 date를 확인하면
KST로 바뀐 것을 볼 수 있다.

3. docker, docker-compose 설치하기

  • docker 설치
#docker패키지 설치
sudo apt install docker.io -y

# docker.io 에러 발생 시
sudo apt update

#docker 설치 확인
sudo docker --version
  • docker-compse 설치
# /usr/lib/docker 경로에 cli-plugins라는 디렉토리를 생성합니다.
# -p : 만약 상위 디렉토리가 없다면 함께 생성합니다.
sudo mkdir -p /usr/lib/docker/cli-plugins

# github에 release 된 docker-compose 파일 다운로드
sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose

# 다운받은 docker-compose 파일에 실행 권한을 부여해 줍니다.
sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose

# docker-compose 설치 확인
sudo docker compose version

4. docker-compse.yml 작성하기

.env 파일이 같은 경로에 있어야 한다.

version: '3.8'

volumes:
  postgres: {}
  django_media: {}
  django_static: {}

services:
  postgres:
    container_name: postgres
    image: postgres:14.5
    volumes:
      - postgres:/var/lib/postgresql/data/
    environment: #.env 파일에 선언
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
    restart: always

  redis:
    container_name: redis
    image: redis
    ports:
      - 6379:6379

  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && gunicorn config.wsgi --workers=5 -b 0.0.0.0:8000"
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/
      - django_static:/app/static/
    environment:
      - DEBUG
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_HOST
      - POSTGRES_PORT
      - SECRET_KEY
      - NAVER_ACCESS_KEY
      - NAVER_SECRET_KEY
      - SERVICE_ID
      - PHONE_NUMBER
    depends_on:
      - postgres
      - redis
    restart: always

  nginx:
    container_name : nginx
    image: nginx:1.23.2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - django_media:/media/ 
      - django_static:/static/
    depends_on:
      - backend
    restart: always

5. Dockerfile 작성하기

FROM python:3.10.8

ENV PYTHONDONTWRITEBYTECODE 1

ENV PYTHONUNBUFFERED 1

RUN mkdir /app/

WORKDIR /app/

COPY ./django/requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

RUN pip install gunicorn psycopg2

6. Nginx 설정 추가하기

# 현재 디렉토리 구조
path : /home/ubuntu/
├── backend
│   ├── Dockerfile
│   └── django # project directory
├── docker-compose.yml
└── nginx
    └── default.conf

nginx 폴더를 만들고 그 안에 default.conf 를 작성한다.

server {
  listen 80;
  server_name _; 

  location / { 
    proxy_pass http://backend:8000/;
  }

  location /static/ { 
    alias /static/; 
  }

  location /media/ { 
    alias /media/; 
  }
}

7. 프로젝트 settings.py 수정

#: 환경변수에 따라 DEBUG모드 여부를 결정합니다.
DEBUG = os.environ.get('DEBUG', '0') == '1'

# 접속을 허용할 host를 설정합니다.
ALLOWED_HOSTS = ['backend', ]

# postgres 환경변수가 존재 할 경우에 postgres db에 연결
POSTGRES_DB = os.environ.get('POSTGRES_DB', '')
if POSTGRES_DB:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': POSTGRES_DB,
            'USER': os.environ.get('POSTGRES_USER', ''),
            'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''),
            'HOST': os.environ.get('POSTGRES_HOST', ''),
            'PORT': os.environ.get('POSTGRES_PORT', ''),
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }

# CORS 허용 목록에 ec2 ip를 추가
CORS_ORIGIN_WHITELIST = ['http://$ec2_public_ip']
CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST
profile
하루하루 차근차근🌱

0개의 댓글