도커란 ? 

도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 도커 웹 페이지의 기능을 인용하면 다음과 같다: 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 

 

쉽게 말하자면 내 컴퓨터에서 작업한 결과가 다른 컴퓨터에서도 똑같이 동작한다는 보장이 없다. 컴퓨터 환경이 전부 다르기 때문이다. 도커의 역할은 다른 하드웨어와 운영체제에서 작업하더라도 동일한 환경을 갖출 수 있도록 도와주는 기술이다. 가상환경(env)와 비슷한데 가상환경은 개발 환경을 구축하기에는 충분하지만 구현한 서비스를 서버에 옮겨서 서비스를 제공하는 배포 과정에는 부족하다. 배포를 하기 위해서는 소스 코드를 복제해서 적절한 위치에 저장하고, 웹 페이지를 보여주는 웹 서버, 웹 서버에서 받은 요청을 프레임 워크(Django, Wagtail 등등)에게 넘겨주기 위한 인터페이스, 데이터베이스 등의 추가적인 작업이 필요하다. 가상환경으로는 한계가 있어서 도커를 사용해 모든 환경을 서버로 옮기는 것이다. 

 

 

도커의 작동 방식

1) 도커 설정 파일에 웹 사이트 배포에 필요한 환경설정 정보를 모두 지정한다. 2) 도커를 실행하면 설정 파일에 지정한 대로 서버 전체를 복제한 컨테이너 이미지가 생성된다. 3) 마지막으로 생성된 컨테이너 이미지를 실행시키면 된다. 

 

 

1. Docker 설치 

 

 

Ubuntu 기준으로 설치하는 방법을 간략하게 소개

 

 

1) 오래된 버전 삭제하기

sudo apt-get remove docker docker-engine docker.io containerd runc

 

2) repository 설정하기

$ sudo apt-get update
 
$ sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 

3) Docker Official GPG Key 등록

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

4) stable repository 등록

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

5) Docker Engine 설치

$ sudo apt-get update
 
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

 

6) 버전 확인

docker --version

 

7) Docker Compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose -version

Docker Compose의 최신 버전은 아래 링크에서 확인할 수 있다. 

 

https://github.com/docker/compose/releases

 

 

2. Docker File

 

 

Dockerfile에는 지금까지 프로젝트를 진행한 로컬 환경과 동일한 Container 이미지를 만들기 위해 지정할 내용을 작성한다. 

Wagtail에서 기본으로 제공하는 Dockerfile을 살펴보자. (Dockerfile이 기본명)

# 도커는 파이썬이 설치되어 있는 이미지를 기본으로 제공한다. 이 이미지를 불러온다. 
FROM python:3.8.1-slim-buster

# Container Port 설정 (참고 <1>)
EXPOSE 8000

# 파이썬은 종종 소스 코드를 컴파일해서 확장자가 .pyc인 파일을 생성하는데 
# Docker에서는 필요하지 않으므로 생성하지 않도록 방지
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \ # 파이썬 로그가 버퍼링 없이 즉각적으로 출력하게 만듦
    PORT=8000

# requirements.txt에서 필요한 라이브러리를 설치하기 위해 필요한 gcc, musl-dev 등을 미리 설치
RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends \
    build-essential \
    libpq-dev \
    libmariadbclient-dev \
    libjpeg62-turbo-dev \
    zlib1g-dev \
    libwebp-dev \
 && rm -rf /var/lib/apt/lists/*

# 서버 배포를 위한 gunicorn 설치
RUN pip install "gunicorn==20.0.4"

# requirements.txt 설치
COPY requirements.txt /
RUN pip install -r /requirements.txt

# 로컬 컴퓨터의 현재 위치에 있는 파일을 모두 작업 폴더로 복사.
# /usr/src/app는 복사할 작업 폴더를 의미.
WORKDIR /usr/src/app

COPY . /usr/src/app

# static file 관리
RUN python manage.py collectstatic --noinput --clear

RUN find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

# 추가 
# 엔트리 포인트 설정, Docker 버전 문제로 권한 문제가 발생하므로 'sh'를 붙인다.
# 권한 문제는 아래로도 해결할 수 있다. 
# docker-compose -f docker-compose.yml build --no-cache
ENTRYPOINT ["sh", "/home/app/web/entrypoint.prod.sh"]

<1> expose와 ports 모두 컨테이너 포트를 노출 시키는 것이지만 expose는 호스트 내부의 다른 컨테이너들만 액세스가 가능하고 ports로 노출하면 ports에 설정한 호스트 포트번호로 호스트 외부의 다른 호스트들도 호스트 포트번호로 액세스가 가능.

 

 

참고) Dockerfile의 명령어에 대해서 정리해놓은 블로그이다. 

https://www.daleseo.com/dockerfile/

 

 

3. Docker Compose File

 

 

Docker Compose file을 사용하면 Container를 여러 개를 한 번에 실행시킬 수 있고, Container를 실행시킬 때 옵션도 줄 수 있다. (docker-compose.yml이 기본명)

# 도커 컴포즈 파일 포맷 버전  
version: '3'

services:
  # service에 nginx라는 이름의 컨테이너를 추가
  nginx:
  	# nginx 컨테이너를 만들기 위한 파일을 넣을 nginx 폴더를 생성
    build: ./nginx    
    # 컨테이너가 종료되면 컨테이너 안에 저장되어 있는 내용도 사라지는데 
  	# Nginx의 Volume 기능을 이용하면 컨테이너를 다시 실행했을 때 바로 불러올 수 있다.
  	# 웹 사이트 방문자가 정적 파일을 요청하면 vloume에 저장되어 있는 파일을 바로 보내줌.
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
    	# 도메인이나 ip 주소 뒤에 아무것도 쓰지 않으면 80이 기본값.
      - 80:80
      - 443:443
    # nginx는 web container에 의존성을 갖음
    depends_on:
      - web
  certbot:
    image: certbot/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
      
  # web이라는 이름의 서비스 실행
  web:
  	# 현재 폴더를 build
    build: .
    # 터미널에서 실행했던 명령어를 대신 실행(귀니콘으로 실행)
    command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
    # volumes으로 로컬 컴퓨터의 폴더와 도커의 폴더를 연결. (현재 폴더를 /usr/src/app/ 폴더와 연결)
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
      - ./:/usr/src/app/
    # 포트 설정
    ports:
      - 8000
    # 배포 환경 설정
    env_file:
      - ./.env.prod
    # web 컨테이너는 db 컨테이너가 실행된 이후에 시작해야 함.
    depends_on:
      - db
  
  db:
  	# docker에서 제공하는 postgres db 버전 설정
    image: postgres:12.0-alpine
    # 컨테이너 실행이 중단되더라도 데이터베이스의 내용 유지
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    # 데이터 베이스의 사용자명, 암호, 데이터베이스 명을 저장한 env파일 연결
    env_file:
      - ./.env.prod.db
volumes:
  postgres_data:
  # 위에서 언급한 volume nginx volume을 위해 추가
  static_volume:
  media_volume:

source code file 출처 : https://github.com/saintdragon2/do_it_django_a_to_z/blob/master/docker-compose.yml

 

 

nginx/Dockerfile

# 도커가 제공하는 nginx 사용하기
FROM nginx:latest
# 이 이미지 안의 default.conf에는 도커가 제공하는 Nginx의 기본 설정값이 있다. 
# rm을 통해서 삭제.
RUN rm /etc/nginx/conf.d/default.conf
# 삭제한 default.conf 대신 새로 생성한 설정 정보를 사용
COPY nginx.conf /etc/nginx/conf.d

nginx를 docker에서 사용하기 위한 설정이다. 

 

 

docker compose 명령어

docker-compose build
docker-compose --build # 이미지 실행시키면서 빌드
docker-compose up
docker-compose -f docker-compose.dev.yml up # 특정 docker compose file 실행
docker-compose up -d # 백그라운드에서 실행

docker-compose down # 실행중인 컨테이너 종료

docker-compose down -v # 컨테이너를 내리고 연결되어 있는 볼륨도 전부 삭제

 

 

Docker 확인

docker image ls # 도커 이미지 확인
docker container ls # 도커 컨테이너 확인

docker-compose logs # 로그 확인

 

 

Docker에서 명령어 실행

# docker-compose 명령을 이용해 현재 실행 중인 web 컨테이너에 접속해서 실행
docker-compose exec web python manage.py createsuperuser
docker-compose exec web python manage.py migrate

 

'Back-End > Wagtail, Django 배포' 카테고리의 다른 글

DumpData  (0) 2022.01.08
Wagtail RichText API  (0) 2022.01.07
2. Gunicorn, Nginx 적용  (0) 2021.12.23
1. PostgreSQL 적용  (0) 2021.12.22
4. AWS (인스턴스 생성, 서버 접속)  (0) 2021.12.20

+ Recent posts