Docker-compose로 LightSail에 Flask 프로젝트 배포하기 + 도메인 연결하기

나르·2021년 11월 11일
0

Docker

목록 보기
3/3
post-thumbnail

인스턴스 중지와 도메인 만료로 down된 서비스를 재배포하며 작성한 글입니다.

1.AWS 인스턴스 설정


1.1 AWS LightSail 인스턴스 생성 및 접속


AWS 콘솔에 접속해서 LightSail 인스턴스를 생성해줍니다.
필자는 Ubuntu 20.04 LTS에 1GB로 생성했습니다. 인스턴스 생성 후 브라우저 콘솔로 접속할 수도, SSH키페어를 이용해 터미널로 접속할 수도 있습니다.



인스턴스 생성이 완료되면 퍼블릭 ip를 발급받습니다. 고정 ip를 생성하거나, 도메인을 연결할 수도 있습니다.
터미널에서 chmod 600 {ssh key file}.pem으로 키파일에 권한을 변경해준 후 ssh ubuntu@{public ip} -i {ssh key file}.pem 로 인스턴스에 접속합니다.

1.2 포트 열기


인스턴스에 프로젝트를 배포한 후 올라갈 웹사이트에 접근하기 위해서 Lightsail 방화벽에 port를 열어주어야 합니다. flask에서 사용하는 5000번과 노드에서 사용하는 1230번 포트를 열어줬습니다.

2. 서버 세팅


2.1. Server requirements install


  • pip3
  • Docker, Docker-compose
  • net-tools
$ sudo apt update
# pip3 (우분투 20.04의 기본 파이썬 버전은 3.8)
$ sudo apt-get install python3-pip

# Docker
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update
$ apt-cache policy docker-ce
$ sudo apt install docker-ce

# Docker에 sudo 권한 부여
$ sudo usermod -aG docker $USER
$ newgrp docker

# 설치 확인
$ sudo systemctl status docker

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

# Docker-compose에 실행권한 부여
$ sudo chmod +x /usr/local/bin/docker-compose

# 설치확인
$ docker-compose version

2.2. Project requirements install


서버에 필요한 설정을 완료했으면 프로젝트에 필요한 모듈을 설치합니다. requirements.txt가 있는 위치로 이동해서 pip로 인스톨합니다.

# project requirements
$ cd <project>
$ pip3 install -r requirements.txt

-> 이 부분은 파이썬 프로젝트의 Dockerfile에서 처리하도록 수정했습니다.

2.3. dev 세팅으로 변경


로컬에서 쓰던 환경으로 적용되어있는 상태인데 따로 빌드 스크립트를 작성하지 않아 직접 변경해줬습니다.
소켓을 http://localhost로 연결해 둔 부분을 인스턴스 ip로 변경해주고, 서버에도 cross origin을 열어줬습니다.

3. 프로젝트 배포


3.1 Docker-compose


docker-compose.yml이 있는 위치로 이동해 아래 커맨드를 실행합니다. --build로 수정사항을 반영하고, -d 옵션을 추가해 데몬으로 실행했습니다.

$ sudo docker-compose up --build -d

3.2 로그와 mysql 인스턴스 접속하기


# 실행 중인 서버 로그 출력
$ docker-compose logs -f

# 실행 중인 컨테이너 목록
$ docker ps -a

# 컨테이너 접속
$ docker exec -it {mysql컨테이너이름} bash
root@:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.22 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

3.3. 도메인 연결하기


퍼블릭 ip는 인스턴스를 재시작할 때마다 변경되기 때문에, 그대로 도메인에 연결한다면 재부팅마다 도메인을 다시 지정해줘야 합니다. 때문에 고정 ip를 생성하고 도메인에 연결하는 것이 좋습니다.

LightSail 홈에서 네트워킹 탭으로 들어가 DNS 영역 생성을 선택합니다.

도메인을 입력하고 DNS 영역을 생성합니다.

생성된 영역에 A레코드를 추가해줍니다.
하위도메인(서브도메인)은 www 등으로 설정합니다. 입력하지 않으려면 @로 설정합니다.
확인에는 앞서 생성해둔 인스턴스의 고정ip를 등록합니다.

영역 하단에 있는 네임서버 주소를 Route 53에 등록해야 합니다.
Route53 > 등록된 도메인에서 연결해둔 도메인을 선택해 좌측 이름 서버 추가 또는 편집을 눌러 이름서버를 추가합니다.
전부 등록할 필요는 없고 1~2개만 등록해도 됩니다. 등록 후 적용까지는 시간이 조금 소요되므로 기다리면 됩니다.

문제점?


LightSail 인스턴스는 항상 잘 돌아가다가도 어느날 갑자기 무한로딩 상태가 됩니다....
AWS에 문의도 해보고 구글링도 해봤으나 정확한 원인과 해결책은 찾지 못했습니다ㅜ(고질적인 문제인듯..)
인스턴스를 중지하고 재시작하면 해결이 되긴 하나 언제 죽을지 모르는 상태;;;

+재시작한 서버에서 docker-compose를 다시 올리니 port is already allocated 라는 에러가 발생했습니다.
단순히 해당 포트를 할당받은 컨테이너를 삭제하면 될 줄 알았으나 띠용.. 사용 중인 컨테이너가 없더군요??? 여러 방법들을 시도했지만 사용 중이지를 않으니 난감했습니다ㅠ
그냥 해당 포트를 바인딩해둔 부분을 수정하는 것으로 처리가 됐습니다.

도커 자습서
Docker - Bind for 0.0.0.0:4000 failed: port is already allocated
'port is already allocated'
Docker-compose up failing because "port is already allocated" #4950

++이외의 에러
하루 뒤에 다시 들어가보니 이런 에러가 떠있었습니다.
원인은 conn.close()을 해주지 않아 Connection Leak이 발생한 것이었습니다.
수정 후 정상 작동

profile
💻 + ☕ = </>

0개의 댓글