배포 진행 순서

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

네트워크 생성 이유

컨테이너 이름을 기반으로 서로 요청을 주고 받기 위해 생성

네트워크 생성

network -> add network

name 직관적으로 설정

컨테이너 생성

1. django container

name, image 지정

network 탭에서 위에서 만든 네트워크 지정

2. nginx 컨테이너 생성

name, image 지정

nginx는 사용자와의 통신을 위해 외부 포트 연결 필요 

참가할 네트워크 지정

nginx 설정파일 연결 (컨테이너 외부 파일을 내부로 연결시킬때 volumes의 bind를 통해 지정)

728x90

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

[Docker] portainer를 이용한 docker network 구성  (0) 2021.05.28
[Docker] aws ec2 Linux2, docker, portainer  (0) 2021.05.26

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