Docker 기반 CI·CD 파이프라인 구축

CI/CD - 프로젝트 코드 작업 (AWS ECR push 하기 전 Dockerfile, Docker Image, container까지)

wy-family 2024. 12. 5. 17:26

우선, 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 파일에는 애플리케이션에 필요한 라이브러리와 버전 정보가 포함되어 있습니다.
  • 작동 흐름:
    1. 컨테이너가 실행되면 /opt/app/requirements.txt 파일을 찾습니다.
    2. 해당 파일의 내용을 읽고, pip가 지정된 모든 패키지를 설치합니다.
    3. 설치된 라이브러리는 컨테이너 내부에 저장됩니다.
  • 중요:
    • 이 명령이 실행될 때 인터넷 연결이 필요하며, 패키지 설치 중 오류가 발생하면 이미지 빌드가 실패합니다.

5. CMD ["python3", "app.py"]

  • 설명:
    • CMD는 컨테이너가 실행될 때 기본적으로 실행할 명령을 지정합니다.
    • 여기서는 python3 app.py를 실행하여 Python 애플리케이션을 시작합니다.
      • python3: Python 3 인터프리터.
      • app.py: 실행할 Python 스크립트.
    • 이 명령은 컨테이너 실행 시점에 실행되며, 빌드 단계에서는 실행되지 않습니다.
  • 특징:
    • CMD는 컨테이너의 "진입점" 역할을 합니다. 컨테이너 실행 시 이 명령이 실행되지 않으면 컨테이너가 종료됩니다.

Dockerfile의 전체 동작 요약

  1. Python 3.9를 기반으로 하는 경량 이미지를 사용하여 컨테이너를 설정합니다.
  2. 작업 디렉토리를 /opt/app으로 지정합니다.
  3. 애플리케이션 소스 코드(.)를 컨테이너 내부 /opt/app 디렉토리에 복사합니다.
  4. requirements.txt를 읽어 Python 라이브러리를 설치합니다.
  5. 컨테이너 실행 시, python3 app.py 명령으로 애플리케이션을 시작합니다.

도커파일로 부터 도커이미지를 실제로 만드는 과정, 도커이미지 빌드를 해보려고 한다.

이제 도커이미지에서 컨테이너를 만들어볼 것.

요청까지 잘 들어온 걸 확인할 수 있다!