티스토리 뷰

정리용/Docker

[Docker] 4. Docker Workflow

hee-ya07 2025. 2. 22. 17:56

0. Dockerfile

:: Docker 이미지를 만들기 위한 스크립트 (Instruction / 명령어 집합)
:: 각 명령어는 Docker 이미지의 하나의 레이어(Layer)로 변환

:: 실행할 프로그램(앱) + 앱을 구동할 엔진 + 구동을 보조해줄 Bins/Libs 정의

  • 구성 요소
    1. Application 파일 (구동 코드)

    2. Environment Variables (환경 변수
    3. Runtime Environment (런타임 환경)
       :: 애플리케이션을 실행하기 위한 OS나 런타임 환경(예: Java, Python 등)의 버전 및 설정을 정의
    4. 서드파티 라이브러리
    5. Cut-down OS
        :: 실제로 컨테이너 내에서 실행되는 최소한의 운영 체제 (예: Alpine Linux).

Ex)

더보기
# FROM :: Base 이미지 설정 (예: Python 3.9)
FROM python:3.9-slim

# WORKDIR :: 작업 디렉토리 생성
WORKDIR /app

# 요구사항 파일 복사 및 의존성 설치 (COPY는 복사, RUN은 빌드 시 수행 명령어)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 코드 복사
COPY . .

# 환경 변수 설정
ENV APP_ENV=production

# 외부와 통신할 포트 열기
EXPOSE 5000

# 애플리케이션 실행 명령어
CMD ["python", "app.py"]

0.1. Docker Image 업로드 방식

- Docker Image 를 안착시키기 위한 방법 2가지

1. SCP Docker Image 결과 -> Tar 로 압축 -> SCP (Secured Copy) 통해 EC2 로 전달  -> EC2 내 실행
2. ECR -> ECR 업로드 -> EC2 내 ECR 로부터 다운로드
  • ECR에 업로드된 이미지는
    -> ECS를 통해 EC2와 연결-> 배포 파이프라인 구축
    -> Terraform을 통해 EC2와 연결 -> 배포 파이프라인 구축

1. Docker Workflow

출처 : ASAC 수업자료

1. Develop 2. Test Java 3. Build Java 4. Build Docker Image 5. Push 6. Pull 7. Run
Java에 관련된 절차 Docker에 관련된 절차
CI 절차 CD 절차

 

  • 3개 타입의 인스턴스 :: (1) Local + (2) Github Actions / Jenkins + (3) Server
    :: CI / CD 전략 혹은 인프라 구성 => 각 인스턴스에 4개의 절차의 배치
  1. Develop :: (1) Local 에서 수행 ← 불변(고정) 절차
  2. Test Java :: (1) Local 혹은 (2) Github Actions / Jenkins 에서 수행 ← 가변 절차
  3. Build Java :: 위와 동일
  4. Build Docker Image :: 위와 동일
  5. Push Docker Image to Registry :: 위와 동일
  6. Pull Docker Image from Registry :: 위와 동일
  7. Run Docker Image :: (3) Server 에서 수행 ← 불변(고정) 절차

2. CI (Continuous Integration)

:: 테스트 및 자바 빌드 & 이미지 빌드

:: Build && Push

2.1 Build Docker Image

// -t :: 빌드한 이미지를 태그로 지정 my-app:1가 이미지 이름, 태그
docker build -t my-app:1.0 .

:: Docker 이미지는 docker build 명령어를 통해 생성

:: 현재 디렉토리의 Dockerfile을 기반으로 이미지를 빌드

 

출처 : https://harshilsays.medium.com/docker-images-9afa499b4077

:: Docker Image 는 매 Instruction 마다 Layer 로 구성되며 이 중간 과정을 Cache함


2.2.  Push Docker Image to Registry

-  Docker Image 를 → Docker Registry(도커 저장소)에 업로드

 

1. Docker Hub에 Push

// 1. Docker Hub에 계정을 만들고 로그
docker login

// 2. 이미지를 Docker Hub에 푸시
// 주의점 :: Docker Hub에서 이미지 이름을 username/repository로 지정 필요
docker push my-app:1.0

 

2. AWS ECR에 Push하기

- AWS ECR 사용 시, 레지스트리를 생성 및 인증 설정 필요

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com

 

- 푸시

// 1. ECR 리포지토리를 생성
aws ecr create-repository --repository-name my-app

// 2. 이미지를 ECR 리포지토리로 푸시
docker tag my-app:1.0 <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/my-app:1.0
docker push <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/my-app:1.0

3. CD (Continuous Deployment)

:: Push && Run

3.1 Pull Docker Image from Registry and Run Docker Image on Host

1. Pull 
:: 어플리케이션 실행하려는 서버 내 Docker Registry(도커 저장소)에서 → Docker Image 다운로드

docker pull my-app:1.0

 

 

2. Run
:: 어플리케이션 실행하려는 서버 내 앞서 다운받은 Docker Image 실행 = Container

docker run -d -p 5000:5001 --name my-app-container my-app:1.0
더보기

 

  • -d :: 컨테이너를 백그라운드에서 실행
  • -p :: 컨테이너의 포트를 호스트 머신에 매핑(5000:5001은 호스트의 포트 5000과 컨테이너의 포트 5001을 연결)
  • --name: 컨테이너의 이름 지정
  • my-app:1.0: 실행할 이미지의 이름과 태그

 

docker ps // 컨테이너 실행 확인
// 종료
docker stop my-app-container

// 삭제
docker rm my-app-container

 


참고

ASAC 수업자료

 

Docker Images

Ever wondered what happens behind the scenes when you build a Docker🐳 image? Docker image layers🗂️ — a fundamental concept that powers…

harshilsays.medium.com

 

'정리용 > Docker' 카테고리의 다른 글

[Docker] 5. 명령어 분류와 Dockerfile 최적화  (0) 2025.02.22
[Docker] 1.1.1 Docker 질문  (0) 2025.02.21
[Docker] 3. Docker Network  (0) 2025.02.21
[Docker] 2. Docker 컨테이너  (0) 2025.02.21
[Docker] 1.1 Docker 개념  (0) 2025.02.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함