우선, Group 을 만들고, 거기서 project (test-app) 을 생성하는데, 그 안에는 Dockerfile, Makefile 이 있을 것이다.
Docker Image가 만들어지고 나면, push 를 해서 AWS ECR에 저장될 것이고 Docker Container를 실행할 수 있게 된다.
일단 지금은, AWS ECR 에 push 하기 전까지의 단계까지만 진행해볼 것.
GitLab 기반 Docker 이미지 생성 및 AWS ECR 푸시 워크플로
--------------------------------------------------
1. 그룹 생성:
- GitLab에서 새로운 그룹(Group)을 생성.
└── 그룹 이름: [그룹 이름]
2. 프로젝트 생성:
- 그룹 안에 새로운 프로젝트(Project)를 생성.
└── 프로젝트 이름: test-app
├── 파일 구성:
│ ├── Dockerfile
│ └── Makefile
3. Docker 이미지 생성 워크플로:
┌────────────────────────────────────────────┐
│ GitLab에서 저장소 클론: │
│ └── git clone <저장소 URL> │
│ │
│ Dockerfile을 사용해 Docker 이미지 생성: │
│ └── docker build -t <이미지 이름> . │
│ │
│ Docker 이미지 확인: │
│ └── docker images │
└────────────────────────────────────────────┘
4. AWS ECR에 푸시 (추후 단계):
┌────────────────────────────────────────────┐
│ Docker를 AWS ECR에 인증: │
│ └── aws ecr get-login-password ... │
│ │
│ ECR에 맞게 Docker 이미지 태그 변경: │
│ └── docker tag <이미지 이름> <ECR URL> │
│ │
│ Docker 이미지를 ECR에 푸시: │
│ └── docker push <ECR URL> │
└────────────────────────────────────────────┘
5. 현재 진행 범위:
- Docker 이미지 생성 및 확인 단계까지 완료.
└── AWS ECR 푸시는 나중에 진행.
GitLab Workflow for Docker Image Creation and Push
--------------------------------------------------
1. Group Creation:
- Create a new Group in GitLab.
└── Group Name: [Your Group Name]
2. Project Creation:
- Create a new Project under the Group.
└── Project Name: test-app
├── Files:
│ ├── Dockerfile
│ └── Makefile
3. Docker Image Creation Workflow:
┌────────────────────────────────────────────┐
│ Clone Repository from GitLab │
│ └── git clone <repository-url> │
│ │
│ Create Docker Image using Dockerfile: │
│ └── docker build -t <image-name> . │
│ │
│ Verify Docker Image: │
│ └── docker images │
└────────────────────────────────────────────┘
4. Push to AWS ECR (Future Step):
┌────────────────────────────────────────────┐
│ Authenticate Docker to AWS ECR: │
│ └── aws ecr get-login-password ... │
│ │
│ Tag Docker Image for ECR: │
│ └── docker tag <image-name> <ECR-URL> │
│ │
│ Push Docker Image to ECR: │
│ └── docker push <ECR-URL> │
└────────────────────────────────────────────┘
5. Current Scope:
- Complete up to Docker Image verification step.
└── Skip AWS ECR steps for now.
GitLab 왼쪽 메뉴창에 보면 Group 창이 있는데, 새로운 그룹을 만들어주자
그리고나서 그룹에 들어가서 새로운 프로젝트 test-app 를 만들자
만들었고, 그러면 아까 flask-app 처럼
터미널에서 clone 을 해보자
이제 프로젝트 폴더 안에 python 파일 3개를 만들어볼 것이다.
vs code를 실행해서 app.py 를 만들자
코드 해석
1. Flask 모듈 임포트
from flask import Flask
- Flask는 파이썬의 웹 프레임워크입니다.
- 웹 애플리케이션을 쉽게 만들 수 있도록 도와주는 도구입니다.
2. Flask 애플리케이션 생성
app = Flask(__name__)
- Flask(__name__)은 Flask 애플리케이션 객체를 생성하는 코드입니다.
- __name__: 현재 실행 중인 파일의 이름(모듈 이름)을 전달합니다.
- Flask는 이 정보를 기반으로 애플리케이션의 경로를 설정합니다.
3. 라우트 설정
@app.route('/')
def home():
return 'Hello, Flask World!'
- @app.route('/'):
- Flask에서 URL과 함수(뷰)를 연결하는 데 사용됩니다.
- '/'는 애플리케이션의 기본 URL(루트 경로)입니다. 예: http://localhost:5000/.
- def home()::
- 루트 경로로 접속했을 때 실행될 함수를 정의합니다.
- 이 함수는 문자열 'Hello, Flask World!'를 반환합니다.
- 결과적으로 사용자가 브라우저에서 http://localhost:5000/에 접속하면 "Hello, Flask World!"라는 텍스트를 보게 됩니다.
4. 애플리케이션 실행
if __name__ == '__main__':
app.run(debug=True)
- if __name__ == '__main__'::
- 현재 파일이 직접 실행되는 경우에만 아래 코드를 실행합니다.
- 다른 모듈에서 이 파일을 가져가 사용할 경우 실행되지 않습니다.
- app.run(debug=True):
- Flask 애플리케이션을 실행하는 명령입니다.
- debug=True:
- 디버그 모드를 활성화합니다.
- 코드를 변경하면 서버가 자동으로 재시작됩니다.
- 디버그 화면이 활성화되어 오류 메시지가 자세히 표시됩니다.
- Flask 서버는 기본적으로 http://127.0.0.1:5000 (혹은 http://localhost:5000)에서 실행됩니다.
코드 실행 결과:
- 파일을 실행하면 Flask 서버가 실행되고, 브라우저에서 http://127.0.0.1:5000로 접속합니다.
- 화면에 "Hello, Flask World!" 메시지가 표시됩니다.
어쨌든, 의존성 관리를 위해서 기록을 해야한다.
Flask 패키지를 설치를 해야 한다고 알려줘야 한다.
의존성 정보를 담고 있는 파일을 만들어야 한다.
다 저장을 누르고 나서, 터미널에서 다시 확인을 해보면 2개의 파일이 만들어진걸 확인할 수 있다
그리고 나서, pip install -r requirements.txt 를 통해서 의존성을 설치하면 된다. (나는 이미 flask 가 설치가 되어 있었음)
app.py 를 실행해보자!
flask 어플을 개발했고,
이제는 Docker Image 로 만들어야 한다.
Dockerfile 을 만들자
1. FROM python:3.9-slim
- 설명:
- FROM은 Docker 이미지를 생성할 때 기반이 되는 베이스 이미지를 지정합니다.
- python:3.9-slim은 Python 3.9가 설치된 경량 버전의 공식 Docker 이미지입니다.
- slim은 크기를 최소화한 이미지로, 개발에 필요한 추가 도구가 없어서 빠르고 가벼움.
- 이 베이스 이미지에서 새로운 이미지를 빌드합니다.
2. WORKDIR /opt/app
- 설명:
- WORKDIR은 컨테이너 내부에서 작업 디렉토리를 설정합니다.
- 이후 명령(COPY, RUN, CMD 등)은 기본적으로 이 디렉토리 안에서 실행됩니다.
- /opt/app은 컨테이너 내부의 경로이며, 애플리케이션 파일을 저장하고 실행할 디렉토리로 설정.
- 예시:
- COPY나 RUN 명령은 /opt/app 디렉토리를 기준으로 작동하게 됩니다.
3. COPY . /opt/app
- 설명:
- 현재 호스트 시스템의 디렉토리(.) 내용을 컨테이너의 /opt/app 디렉토리로 복사합니다.
- 왼쪽 .:
- Dockerfile이 위치한 디렉토리를 나타냅니다.
- 오른쪽 /opt/app:
- 컨테이너 내에서 복사될 대상 경로입니다.
- 애플리케이션 소스 코드 및 설정 파일(app.py, requirements.txt 등)이 복사됩니다.
4. RUN pip install -r requirements.txt
- 설명:
- RUN 명령은 이미지를 빌드하는 동안 실행됩니다.
- pip install -r requirements.txt는 애플리케이션의 Python 의존성을 설치합니다.
- requirements.txt 파일에는 애플리케이션에 필요한 라이브러리와 버전 정보가 포함되어 있습니다.
- 작동 흐름:
- 컨테이너가 실행되면 /opt/app/requirements.txt 파일을 찾습니다.
- 해당 파일의 내용을 읽고, pip가 지정된 모든 패키지를 설치합니다.
- 설치된 라이브러리는 컨테이너 내부에 저장됩니다.
- 중요:
- 이 명령이 실행될 때 인터넷 연결이 필요하며, 패키지 설치 중 오류가 발생하면 이미지 빌드가 실패합니다.
5. CMD ["python3", "app.py"]
- 설명:
- CMD는 컨테이너가 실행될 때 기본적으로 실행할 명령을 지정합니다.
- 여기서는 python3 app.py를 실행하여 Python 애플리케이션을 시작합니다.
- python3: Python 3 인터프리터.
- app.py: 실행할 Python 스크립트.
- 이 명령은 컨테이너 실행 시점에 실행되며, 빌드 단계에서는 실행되지 않습니다.
- 특징:
- CMD는 컨테이너의 "진입점" 역할을 합니다. 컨테이너 실행 시 이 명령이 실행되지 않으면 컨테이너가 종료됩니다.
Dockerfile의 전체 동작 요약
- Python 3.9를 기반으로 하는 경량 이미지를 사용하여 컨테이너를 설정합니다.
- 작업 디렉토리를 /opt/app으로 지정합니다.
- 애플리케이션 소스 코드(.)를 컨테이너 내부 /opt/app 디렉토리에 복사합니다.
- requirements.txt를 읽어 Python 라이브러리를 설치합니다.
- 컨테이너 실행 시, python3 app.py 명령으로 애플리케이션을 시작합니다.
도커파일로 부터 도커이미지를 실제로 만드는 과정, 도커이미지 빌드를 해보려고 한다.
이제 도커이미지에서 컨테이너를 만들어볼 것.
요청까지 잘 들어온 걸 확인할 수 있다!