배포 진행 순서

1. docker swarm init 초기화

2. django에서 보안 사항들을 docker secrets에 저장

3. docker secrets에 저장한 보안 사항들을 배포할때 django project로 불러오기

4. docker image를 만들기위한 Dockerfile 생성

4-1. portainer에서 docker image 생성

5. docker stack를 위한 docker-compose.yml 생성

6. docker stack 생성 및 실행

1. docker swarm init 초기화

https://docs.docker.com/engine/reference/commandline/swarm_init/

 

docker swarm init

docker swarm init: Initialize a swarm. The docker engine targeted by this command becomes a manager in the newly created single-node swarm.

docs.docker.com

docker swarm init

2. django에서 보안 사항들을 docker secrets에 저장

portainer -> secrets -> add secrets

아래와 같이 django secret key 등 생성

3. docker secrets에 저장한 보안 사항들을 배포할때 django project로 불러오기

django secrets 에 저장한 내용은 /run/secrets/ 위치에 저장됨

settings.py 나 deploy.py 등 배포에 사용할 환경파일에서 파일을 읽어 사용

# docker secrets의 파일 읽어오기

def read_secret(secret_name):
    file = open("/run/secrets/" + secret_name)
    secret = file.read()
    secret = secret.rstrip().lstrip()
    file.close()

    return secret

# 실제 사용
SECRET_KEY = read_secret("DJANGO_SECRET_KEY")

4. docker image를 만들기위한 Dockerfile 생성

- 파이썬 3.9 버전 위에서

FROM python:3.9.0

- /home 폴더 위치로 이동하여 (없으면 생성)

WORKDIR /home/

- github에서 프로젝트 소스코드를 가져와서 다운

RUN git clone [https://github.com/{user}/{project}.git](https://github.com/mugon-dev/django-pinterest.git)

- 다운받은 폴더로 이동하여

WORKDIR /home/[project](https://github.com/mugon-dev/django-pinterest.git)/

- 라이브러리를 설치하고

RUN pip install -r requirements.txt

- container에 8000번 포트를 열어주고

EXPOSE 8000

- 배포 환경으로 실행하는데 static파일들을 한 곳에 모으고, migrate하고 8000번 포트에 bind해서 실행

CMD ["bash", "-c", "python manage.py collectstatic --noinput --settings=config.settings.deploy && python manage.py migrate --settings=config.settings.deploy && gunicorn --env DJANGO_SETTINGS_MODULE=config.settings.deploy config.wsgi --bind 0.0.0.0:8000"]

4-1. portainer 에서 docker image 만들기

portainer -> images -> build a new image

upload 탭에서 위에서 만든 Dockerfile 불러와 생성

5. docker stack를 위한 docker-compose.yml 생성

# docer compose 버전
version: "3.7"
# docker service 생성
services:
# nginx container 생성
  nginx:
  # nginx image 불러오기
    image: nginx:1.19.5
    # nginx가 속할 network
    networks:
      - network
    # voluems 정의
    volumes:
    # 내가 올린 nginx.conf를 nginx폴더의 nginx.conf와 연결
      - /home/django_course/nginx.conf:/etc/nginx/nginx.conf
      # volumes에 저장할 파일들의 경로
      - static-volume:/data/static
      - media-volume:/data/media
    # nginx가 사용할 ports
    ports:
      - 80:80
  # django container 생성
  # container name은 nginx.conf에서 hostname과 동일하게 작성
  django_container_gunicorn:
    # 위에서 만든 image 불러오기
    image: django_test_image:5
    # 장고가 속할 네트워크
    networks:
      - network
    # volumes에 저장할 파일들의 경로
    volumes:
      - static-volume:/home/django-pinterest/staticfiles
      - media-volume:/home/django-pinterest/media
    # 위에서 저장한 django secrets에서 가져올 파일
    secrets:
      - MYSQL_PASSWORD
      - DJANGO_SECRET_KEY
  # mariadb container 생성
  # container name은 djago settings의 host명과 동일하게 작성
  mariadb:
      # 사용할 이미지
    image: mariadb:10.5
    # 사용할 네트워크
    networks:
      - network
    # volumes에 저장할 db 데이터
    volumes:
      - maria-database:/var/lib/mysql
    # 위에서 저장한 django secrets에서 가져올 파일
    secrets:
      - MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD
    # maria db의 환경변수
    # docker secrets에서 패스워드 가져오기
    environment:
      MYSQL_DATABASE: django
      MYSQL_USER: django
      MYSQL_PASSWORD_FILE: /run/secrets/MYSQL_PASSWORD
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/MYSQL_ROOT_PASSWORD

# 사용할 네트워크
networks:
  network:

# 사용할 volume
volumes:
  static-volume:
  media-volume:
  maria-database:

# 사용할 secrets
secrets:
  DJANGO_SECRET_KEY:
    external: true
  MYSQL_PASSWORD:
    external: true
  MYSQL_ROOT_PASSWORD:
    external: true

6. docker stack 생성 및 실행

portainer -> stack -> add stack

upload 탭에서 위에서 만든 docker-compose.yml 불러와서 생성

7. 확인

portainer -> swarm -> go to cluster visulizer

728x90

'Study > Django' 카테고리의 다른 글

[Django] gunicorn  (0) 2021.05.28
[Django] 배포를 위한 환경파일 분리  (0) 2021.05.28
[Django] field lookup  (0) 2021.05.25
[Django] decorator  (0) 2021.05.25
[Django] code formatting black 설치 및 적용  (0) 2021.05.20

docker network

Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능합니다. 하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결시키면 서로 통신이 가능해집니다.

portainer 에서 network 생성

network -> add network

name -> nginx-django 생성

container 를 network에 연결

container -> add container 의 하단부

container name 지정할때 주의 -> container name == host name

network 탭에서 container가 참가할 네트워크를 찾아 설정

network 내에서 요청

docker network 내에서는 컨테이너 이름을 호스트 네임으로 사용

그렇기에 nignx.conf 같은 설정에서 django 같은 서버를 호출할때 

컨테이너네임:포트번호 를 주소로 사용

아래의 proxy_pass 부분

worker_processes auto;

events {
}

http {
  server {
    listen 80;

    location / {
        proxy_pass http://django_container_gunicorn:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
}

 

728x90

aws ec2 linux2 , docker, portainer

aws ec2 인스턴스에 docker 설치

  1. 인스턴스에 설치한 패키지 및 패키지 캐시를 업데이트합니다.
sudo yum update -y
  1. 최신 도커 엔진 패키지를 설치합니다.
  • Amazon Linux 2
sudo amazon-linux-extras install docker
  1. 도커 서비스를 시작합니다.
sudo service docker start
  1. ec2-user를 사용하지 않고도 도커 명령을 실행할 수 있도록 docker 그룹에 sudo.를 추가합니다.
sudo usermod -a -G docker ec2-user
  1. 로그아웃하고 다시 로그인해서 새 docker 그룹 권한을 선택합니다. 이를 위해 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스를 다시 연결할 수 있습니다. 새 SSH 세션은 해당되는 docker 그룹 권한을 갖게 됩니다.

  2. ec2-user 없이도 sudo.가 도커 명령을 실행할 수 있는지 확인합니다.

docker info

portainer 설치

공식 사이트
https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/

  1. portainer를 설치할 volume 생성
docker volume create portainer\_data
  1. portainer 다운 및 9000 포트에서 실행
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer\_data:/data portainer/portainer-ce

portainer 접속

주소창에 호스트 : 9000

docker swarm

docker swarm init

아래 내용이 나오면 성공

728x90

+ Recent posts