도커란 ?
도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 도커 웹 페이지의 기능을 인용하면 다음과 같다: 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다.
쉽게 말하자면 내 컴퓨터에서 작업한 결과가 다른 컴퓨터에서도 똑같이 동작한다는 보장이 없다. 컴퓨터 환경이 전부 다르기 때문이다. 도커의 역할은 다른 하드웨어와 운영체제에서 작업하더라도 동일한 환경을 갖출 수 있도록 도와주는 기술이다. 가상환경(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
EXPOSE 8000
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PORT=8000
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/*
RUN pip install "gunicorn==20.0.4"
COPY requirements.txt /
RUN pip install -r /requirements.txt
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN python manage.py collectstatic --noinput --clear
RUN find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
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:
nginx:
build: ./nginx
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:
- 80:80
- 443:443
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:
build: .
command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
volumes:
- static_volume:/usr/src/app/_static
- media_volume:/usr/src/app/_media
- ./:/usr/src/app/
ports:
- 8000
env_file:
- ./.env.prod
depends_on:
- db
db:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- ./.env.prod.db
volumes:
postgres_data:
static_volume:
media_volume:
source code file 출처 : https://github.com/saintdragon2/do_it_django_a_to_z/blob/master/docker-compose.yml
nginx/Dockerfile
FROM nginx:latest
RUN rm /etc/nginx/conf.d/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 up -d
docker-compose down
docker-compose down -v
Docker 확인
docker image ls
docker container ls
docker-compose logs
Docker에서 명령어 실행
docker-compose exec web python manage.py createsuperuser
docker-compose exec web python manage.py migrate