Docker 배포하기

Sua·2021년 5월 4일
0

Web

목록 보기
8/8
post-thumbnail

도커 설치

1. 도커 회원가입

https://docker.com 사이트에 접속해서 회원가입을 한다. 가입할때 등록한 ID(not email)는 잘 기억해둔다.

2. 도커 설치

윈도우/맥

윈도우/ 맥 사용자는 https://docker.com 에 접속해서 Get Started 버튼을 누르면 나오는 페이지에서 도커 데스크탑 프로그램을 다운로드 받고 설치한다.

리눅스(우분투)

우분투는 아래의 스크립트를 한줄 한줄 복사해서 설치한다.(본 스크립트는 EC2 우분투에서도 사용된다.)

sudo apt update
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

를 쳤을 때 명령어들이 나오면 설치가 잘 된 것

프로젝트 준비

3. 프로젝트 준비하기

배포할 프로젝트를 git clone 등을 통해 준비하거나, 이미 준비되었다면 안 해도 된다.

4. my_settings.py 생성하기

my_settings.py 파일에 데이터베이스 정보와 시크릿키 등 중요 정보를 따로 저장해둔다.

데이터베이스가 RDS인지, 로컬인지에 따라 내용을 수정한다.
아래는 RDS를 사용한 예시이다.

# my_settings.py 예시
DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'project-name', # DATABASE 명
        'USER': 'root', # DB접속 계정명
        'PASSWORD': 'password1234', # DB접속용 비밀번호
        'HOST': 'ss-database.czg8qoezthk.us-east-2.rds.amazonaws.com', # 실제 DB 주소, RDS면 엔트포인트 주소
        'PORT': '3306', # 포트번호
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        },
    }
}

SECRET = 'YOU_HAVE_TO_GENERATE_RANDOM_SECRET_KEY'

5. requiremets.txt에 gunicorn 설치하기

프로젝트 서버를 실행시키려면 도커 이미지 내에서 gunicorn이 설치되어야 한다. 다른 프로그램을 쓰면 다른 걸 설치해도 된다.

pip install gunicorn
pip freeze > requirements.txt
pip install -r requirements.txt

6. 로컬에서 runserver 해보고 의존성 확인

도커 이미지를 빌드하기 전에 로컬에서 프로젝트가 돌아가는지 확인한다. 여기서 안되면 도커에서도 안된다.

python manage.py runserver

도커 빌드

7. Dockerfile 생성

프로젝트 최상위 디렉토리에 도커 이미지 빌드 설정을 해주는 Dockerfile을 생성한다.

#./Dockerfile
# 기반이 될 이미지 [1]
FROM python:3 
# 작업디렉토리(default)설정 [2]
WORKDIR /usr/src/app 

## Install packages 
# 현재 패키지 설치 정보를 도커 이미지에 복사 [3]
COPY requirements.txt ./ 
# 설치정보를 읽어 들여서 패키지를 설치 [4]
RUN pip install -r requirements.txt

## Copy all src files
# 현재경로에 존재하는 모든 소스파일을 이미지에 복사 [5]
COPY . . 

## Run the application on the port 8080
# 8000번 포트를 외부에 개방하도록 설정 [6]
EXPOSE 8000   

#CMD ["python", "./setup.py", "runserver", "--host=0.0.0.0", "-p 8080"]
#gunicorn을 사용해서 서버를 실행 [7]
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "프로젝트명.wsgi:application"] 
  1. 기반이 될 이미지를 설정. 도커허브에서 가장 표준적인 파이썬 3점대 버전이 설치된 이미지를 가져옴.
  2. 내가 작업할 영역을 지정. WORKDIR /usr/src/app 위치는 로컬이 아니라 도커 안의 위치. 즉, 이 공간은 내 컴퓨터의 공간이 아니고, python3이미지를 받아와서 실행됐을 때 그 안에 있는 공간. 가상화니까 이미지를 불러왔다는 자체가 이미 하나의 컴퓨터를 불러온 상태. 아무것도 없고 python3점대만 깔려있는 서버 하나만 불러와진 것. 그리고 그게 실행이 됐고, 거기에 내가 작업할 공간은 여기라고 지정해준 것.
  3. requirement.txt 한 칸 띄고 ./라고 하면 /usr/src/app 공간에 requirement.txt를 복사한다는 의미.
  4. 파이썬3 이미지에 내가 써야할 장고 프로젝트를 위한 의존성을 해결하기 위해 pip install하는 것. 가상 환경을 설치할 필요는 없음. 어차피 단일 os니까.
  5. 현재경로에 있는 모든 파일을 /usr/src/app 공간에 복사
    --> python3 이미지에 필요한 패키지 다 설치되고, 장고 소스가 다 들어가있는 상태. 가상 컴퓨터에 내가 하고 싶은 애들을 다 복사시켜 둠. 잘 실행되는 애들을 배포해야 함.
  6. 얘도 하나의 컴퓨터니까 네트워크 체계가 있음. 내부 ip가 있고 나름의 방화벽이 있음. 얘는 내 컴퓨터의 안에서 돌아가는 컴퓨터의 네트워크만 가지고 있으니까.(공유기에서 인터넷 받아서 쓰듯, 내컴퓨터 안에서 네트워크 받는 것) 여기서는 8000번을 개방.
  7. runserver는 개발용 러너지 웹서버가 아님. gunicorn 패키지를 받아서 해야 그나마 안정적임. .wsgi 앞에 있는 이름만 프로젝트 이름으로 바꾸면 됨. gunicorn은 내 장고 프로젝트 안에 있는 wsgi 파일을 읽어들여서 걔를 이용해서 서버를 기동하는 것
    CDM는 리스트로 나눠서 실행조건을 넣음. 이게 싫으면 RUN으로 하면 됨.

8. 도커 이미지 빌드하기

우분투는 docker 명령어 앞에 sudo를 붙여줘야 한다.

Dockerfile이 있는 위치에서 아래 명령어를 쳐서 도커 이미지를 생성한다.

-t는 tag라는 의미로 안써도 되지만 버저닝을 하려고 사용했다.

마지막에 있는 .은 현재 디렉토리에 있는 Dockerfile을 사용하겠다고 명시해주는 역할을 한다. 이미지는 여기 저장되는 게 아니고 도커가 원하는 저장공간에 저장되지만, 참고하는 도커파일이 현재 경로에 있기 때문에 dot를 쓰는 것이다.

# docker build -t 도커계정명/이미지명:버전 Dockerfile위치
docker build -t suasue/project:0.1.0 .

docker images로 만들어진 이미지를 확인할 수 있다. (-a는 찌꺼기 같은 거까지 다 보여주는 것.)

docker images -a

실행 중인 이미지(컨테이너) 조회
지금은 아무것도 없어야 함.

docker ps -a

9. 빌드된 이미지 실행하기

이미지가 잘 만들어졌는지 확인하는 방법은 실행해보는 방법 밖에 없음.
실행을 해보자!

# docker run -d -p 호스트포트:컨테이너포트 --name 컨테이너명 도커계정명/이미지명:버전
ex) docker run -d -p 8000:8000 --name sua01 suasue/project:0.1.0

-d : 데몬으로 실행하기 위한 옵션. 데몬은 백그라운드 프로세스를 의미.
(도커 프로세스가 백그라운드 작업이라는 게 아니라, 도커 안에 실행되고 있는 구니콘이 백그라운드 작업으로 실행될 것라는 얘기)

-p 8000:8000 : 내 컴퓨터의 8000번 포트(호스트포트)에 연결하면 컨테이너의 8000번 포트에 연결된다는 의미. 컨테이너 포트는 Dockerfile을 만들 때 설정한 8000포트로 설정됨
만약 프로젝트를 여러 개 할 경우 가상환경 두 개 만들 필요 없이 포트만 바꿔서 두 대를 올릴 수 있음

http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220278762795

--name sua01: 컨테이너 이름 지정. 안해도 랜덤으로 지정해줌, 그래서 보통은 안 함

suasue/project:0.1.0 : 이미지정보, 콜론 태그명 정확하게 넣어줘야 함.

---> 실행된 컨테이너의 해쉬값 출력됨

docker ps를 사용하면 현재 실행 중인 컨테이너를 확인할 수 있다.

docker ps -a

10. 이미지 push

이미지를 도커 허브의 레포지토리에 푸쉬한다. 코드를 깃허브 레포지토리에 푸쉬하는 개념과 같다고 생각하면 된다.

도커 허브에 로그인한다.

sudo docker login

이미지를 푸시한다.

sudo docker push suasue/project:0.1.0

푸시가 잘 되면 도커 허브에 들어보면 업로드한 이미지가 리스트에 뜬다.

https://hub.docker.com/ 에 로그인해서 확인.

EC2에 배포하기

11. EC2에 도커 설치하기

pem 파일이 있는 위치로 가서 내 ec2 서버에 접속

ssh -i suasue.pem ubuntu@12.12.123.123

내 ec2는 우분투로 되어 있기 때문에 위에서 우분투에서 도커를 설치할 수 있는 명령어를 한줄씩 입력해준다.

sudo apt update
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로 설치 확인

docker

12. 이미지 pull

ec2에 도커 설치하고 ec2 장고 끄고, 도커 풀한 다음 run하면 됨,

로컬에서와 마찬가지로 도커에 로그인한다.

sudo docker login

레포지토리에 있는 이미지를 pull해온다.

sudo docker pull 이미지정보
ex) sudo docker pull suasue/project:0.1.0

이미지가 잘 pull되었는지 확인한다.

sudo docker images -a

13. 이미지 실행하기

이미지를 실행하기 위해서는 로컬에서와 마찬가지로 run 명령어를 실행하면 된다.

# sudo docker run -d -p 호스트포트:컨테이너포트 --name 컨테이너명 도커계정명/이미지명:버전
ex) sudo docker run -d -p 8000:8000 --name sua01 suasue/project:0.1.0

실행 상태를 확인한다.

sudo docker ps 

STATUS를 잘 봐야 함. Up 6 seconds라는 것은 서버 시작되고 6초 동안 실행되고 있는 중이라는 뜻. 만약 Up이 아니라 Exited 되면 중단된 것이다.

그외 명령어

컨테이너 중단

docker stop 컨테이너명

중단한 컨테이터 실행

docker start 컨테이너명

컨테이너 삭제. 이미지가 삭제되는 건 아님

docker rm 컨테이너명

run은 이미지로부터 새로운 컨테이너를 만드는 것이고, start, stop은 기존에 실행되었던 컨테이너를 중지시키거나 실행시키는 것이다.

이미지 삭제

docker rmi 이미지아이디

이미지를 삭제하면서 생성된 컨테이너도 강제로 삭제

docker rmi f 이미지아이디

참고사이트
https://velog.io/@devmin/Docker-deployment

profile
Leave your comfort zone

0개의 댓글