당신은 멋쟁이, 우리는 장고쟁이~

0%

TodoList 29편 - Dockerfile 작성후 이미지 생성

Dockerfile 작성


배포를 위해 현재까지 진행한 단계는, 아래와 같습니다.


각 단계마다 매우 꼬이고 있어서, 순서를 좀 정리 해봅니다.

  1. AWS EC2 생성
  2. AWS RDS 생성 - PostgreSQL 을 Django 프로젝트에 적용
  3. AWS S3 생성 및 Django 프로젝트에 적용
  4. AWS S3 정적 이미지와 CSS 파일 적용
  5. Docker 설치
  6. Dockerfile 작성 후 이미지 생성
  7. DockerHub Push

Dockerfile 이란?

Dockerfile 은 Docker 이미지를 생성하기 위해 필요한 명령어를 가지고 있는 파일로,

이 파일이 있는 디렉토리에서, Docker 이미지를 만들수 있습니다.

Dockerfile 에 나열되어 있는 명령어들을 자동으로 실행하여, 이미지를 빌드할때 해당 이미지에 필요한

파일과 설정값들을 정할수 있습니다.


확장자 없이도 동작하고,

RUN, COPY, WORKDIR 과 같은, Dockerfile 언어로 작성할수 있습니다.




잘 작성된 Dockerfile 을 사용하여, 이미지를 생성할수 있고, 이미지는 컨테이너 실행에 필요한 파일들과 설정값들을 포함하고 있습니다.


일단 dockerfile 과 start 파일을 작성해 보려 합니다. 작성을 마친뒤에는, 작성된 Dockerfile 을 사용하여, 이미지를 생성해 볼겁니다.


프로젝트 구조 확인하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── db.sqlite3
├── Dockerfile # 확장자가 없는 Dockerfile 파일
├── manage.py
├── requirements.txt
├── secrets.json
├── start # 확장자가 없는 start 파일
├── static
└── todo

확장자가 없는, Dockerfilestart 파일을 생성해 줍니다


Dockerfile 파일과 start 파일


컨테이너 실행에 필요한 이미지는 아래 사항들을 바탕으로 작성되어야 합니다


  • 기본 이미지는 Python 3.8 을 베이스로 합니다

  • 이 이미지는, 로컬에 존재하는 todolist 프로젝트 파일들을 복사해서 가지고 있습니다

  • 이미지 안에, todo/requirements.txt 를 가지고 있기 때문에, pip install -r /todo/requirements.txt를 실행하여, 필요 패키지들을 설치 합니다


  • 이 이미지를 사용하여 실행되는 컨테이너는, runserver 를 실행 시킵니다 (runserver 명령어를 실행하기 이전에 공통된 명령어들, python manage.py makemigrations, python manage.py migrate 그리고 python manage.py runserver 같은 명령어들은, todo/start 파일에 담겨져 잇어서, 해당 이미지는 이 start 파일을 실행시켜서 서버를 시작합니다.)


todolist/Dockerfile 을 아래와 같이 작성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 기본설정 
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
postgresql-client \
&& rm -rf /var/lib/apt/lists/*

# Django 프로젝트 파일들을 이미지로 복사
# 이미지 안에서도 todolist/ 폴더로 복사되게 지정
COPY . /todolist

# 이미지에 복사된 requirements.txt 를 사용하여 패키지 설치
RUN pip install -r /todolist/requirements.txt

# start 파일을 실행할수 있게 파일 설정
RUN chmod 755 /todolist/start

# 워킹 디렉토리를 /todolist 로 설정
WORKDIR /todolist

# 8000 포트를 expose
EXPOSE 8000

# app/start 파일을 실행
ENTRYPOINT ["/todolist/start"]



todolist/start 파일을 아래와 같이 작성

  • 참고 : start 파일은 확장자가 없음

1
2
3
4
5
6
#!/bin/bash 

python manage.py makemigrations
python manage.py migrate

python manage.py runserver 0.0.0.0:8000

Dockerfile 로 이미지 생성하기


Dockerfile 과 start 파일을 작성해 주었으니,


이 파일들을 이용하여, 이미지를 하나 생성해 볼수 있습니다.


프로젝트 폴더인, todolist/폴더로 이동하여, 아래 명령어를 사용합니다.


1
docker build -t todolist .

-t : 생성될 이미지의 이름을 지정


.: Dockerfile 과 프로젝트 파일들이 있는 경로를 표시, Dockerfile 이 있는 위치이므로, 현재경로인 . 을 입력


docker images 명령어를 사용하여,

todolist:latest 와 Base 이미지인, python 3.8 이 있는것을 확인 할수 있습니다.

영상참고


https://blog.naver.com/headfat1218/221975245936



Docker 실행 시키기


이미지가 생성되었으니, Docker 를 로컬에서 실행 시켜 보려 합니다.


8000번 포트를 열어 주기 때문에, -p 8000:8000 옵션을 넣어줍니다.


1
docker run -d -p 8000:8000 --name todolist todolist:latest

옵션 descriptions
-d 백그라운드 실행
-p 8000:8000 호스트와 컨테이너 포트를 매핑
–name todolist 컨테이너의 이름을 todolist 로 지정
todolist:latest 이미지의 이름과 버전을 지정


todolist:latest 이미지를 사용하여, 컨테이너를 하나 실행 시켜 주었습니다.


이 컨테이너는, 백그라운드로 실행이 되고, dockerfile 에서 지정해준대로, runserver 를 구동하고 있습니다

브라우저로, 서버에 접속해 봅니다 (http://127.0.0.1:8000)

로컬에서는 잘 작동하는것을 확인 할수 있습니다.



마치며..


배포가 제일 어려운것 같습니다. 틀린 순서일지도 모르지만,


지나온 순서를 다시 리마인드 합니다.


  1. AWS EC2 생성

  2. AWS RDS 생성 - PostgreSQL 적용

  3. AWS S3 생성 및 적용

  4. AWS S3 정적 이미지와 CSS 파일 적용

  5. Docker 설치

  6. Dockerfile 작성 후 이미지 생성

  7. DockerHub Push