도커의 워크플로우 (Docker Lifecycle)

  • 도커는 애플리케이션을 개발하고 배포하는 과정을 Build(구축) 🡲 Ship(전송) 🡲 Run(실행) 이라는 3단계로 표준화함
    • 도커의 가장 핵심적인 표준 워크플로우(Lifecycle)
  • 이는 전통적인 배포 방식의 복잡성을 제거하고 소프트웨어 공급망을 단순화하는 핵심 프로세스

1. Build (구축)

  • 개발자가 애플리케이션의 실행 환경을 독립된 하나의 ‘도커 이미지’로 정적 패키징하는 단계 🡲 환경을 코드로 정의하고 이미지화
    • Dockerfile 작성 (레시피 정의):
      • 베이스 OS 선택부터 소스 코드 복사, 의존성 패키지 설치, 환경 변수 정의, 컨테이너 기동 명령(CMD/ENTRYPOINT)까지의 과정을 텍스트 스크립트로 작성
      • 인프라 구성을 명문화함으로써 ‘인프라의 코드화(IaC, Infrastructure as Code)’를 실현
    • docker build 명령 수행 (이미지 굽기):
      • 도커 클라이언트가 빌드 명령을 내리면 🡲 도커 데몬이 Dockerfile의 명령을 한 줄씩 해석하면서 독립된 레이어(Layer)들을 쌓아 올림
      • 최종적으로 애플리케이션 실행에 필요한 모든 파일 시스템이 압축된 ‘읽기 전용(Read-only) 이미지’가 호스트 로컬 저장소에 생성됨
  • 실무적 관점
    • 캐시(Cache) 효율을 극대화하도록 Dockerfile 명령어 순서를 배치
    • 멀티 스테이지 빌드(Multi-stage Build)를 도입
    • 이미지의 용량을 최소화하고 보안 취약점을 줄이는 최적화 작업이 수행됨
  • 예제: “Python Flask 웹 서버”를 띄우는 예제
    • 내 컴퓨터에 파이썬이 설치되어 있지 않아도 웹 서버를 도커 컨테이너로 띄울 수 있게 됨
    1. 🛠️ 실습 환경 준비 (파일 2개 만들기)
      1. 작업할 빈 폴더를 하나 만들고, 그 안에 아래의 파일 2개를 생성하기

         //#file: "app.py"
         from flask import Flask
         app = Flask(__name__)
        
         @app.route('/')
         def hello():
             return "<h2>Docker Build 실습 성공!</h2><p>컨테이너에서 실행 중인 웹 서버입니다.</p>"
        
         if __name__ == '__main__':
             # 0.0.0.0으로 설정해야 컨테이너 외부(호스트)에서 접속이 가능합니다.
             app.run(host='0.0.0.0', port=5000)
        
      2. Dockerfile (설계도 파일) 만들기

        • 확장자(txt 등) 없이 파일명을 정확히 Dockerfile로 만들어야 함
         //#file: "Dockerfile"
         # 1. 베이스 이미지 지정 (파이썬이 내장된 가벼운 리눅스 이미지)
         FROM python:3.9-slim
        
         # 2. 컨테이너 내부의 작업 디렉토리 설정
         WORKDIR /app
        
         # 3. 필요한 패키지(Flask) 설치
         RUN pip install flask
        
         # 4. 현재 폴더의 소스 코드(app.py)를 컨테이너 안으로 복사
         COPY app.py .
        
         # 5. 컨테이너가 사용할 포트 명시 (안내용)
         EXPOSE 5000
        
         # 6. 컨테이너가 켜질 때 실행할 명령어
         CMD ["python", "app.py"]
        
    2. 🚀 터미널 명령어로 빌드 및 실행하기
      • 파일이 있는 폴더에서 터미널(CMD, 파워쉘, 또는 Git Bash 등)을 열고 아래 명령어를 순서대로 입력
      • 1 단계: 이미지 빌드 (docker build)
        • Dockerfile을 읽어서 my-flask-app이라는 이름의 이미지를 만듦
          docker build -t my-flask-app:1.0 .
        
        • ⚠️ 주의:
          • 맨 끝에 있는 점(.)을 반드시 찍어야 함!
          • 이는 ‘현재 디렉토리’를 빌드 컨텍스트로 사용하겠다는 의미임
          • 첫 빌드 시에는 파이썬 이미지를 다운로드하고 패키지를 설치하느라 시간이 조금 걸릴 수 있음
      • 2 단계: 빌드된 이미지 확인
        • 이미지가 성공적으로 구워졌는지 목록 확인
          docker images
        
        
        • 목록에 my-flask-app과 태그 1.0이 보인다면 빌드 성공
      • 3 단계:

2. Ship (전송/배포)

  • 로컬 환경에서 검증을 마친 불변의 이미지를 원격 저장소에 업로드하여 어디서나 다운로드할 수 있도록 유통하는 단계 🡲 표준화된 이미지의 중앙 저장 및 공유
    • docker tag를 통한 버전 관리:
      • 생성된 이미지를 docker push를 통해 레지스트리(Docker Hub 등)에 업로드
      • 업로드 전, 이미지에 레지스트리 주소와 프로젝트명, 고유한 버전(Tag)을 부여
        • 예: [myregistry.com/myapp:v1.0.0](https://myregistry.com/myapp:v1.0.0)
      • 태그 관리를 통해 상용 환경에 배포된 버전과 이전 버전들을 명확히 구분하고 관리할 수 있음
    • docker push 명령 수행 (레지스트리 업로드):
      • 로컬에 저장된 이미지 레이어들을 네트워크를 통해 도커 레지스트리(Docker Registry)로 전송
      • 도커는 레이어 아키텍처를 따름 🡲 이미 레지스트리에 존재하는 레이어는 제외하고 새롭게 변경된 레이어만 전송
        • 대역폭과 시간을 크게 절약
  • 실무적 관점
    • 전 세계 공용 저장소인 Docker Hub를 사용할 수 있음
    • 또는 기업의 보안 정책에 따라 사내 폐쇄망에 사설 레지스트리(Private Registry)나 AWS ECR, Github Packages 등을 구축하여 배포 파이프라인(CI/CD)과 연동

3. Run (실행/운영)

  • 운영 서버, 테스트 서버, 혹은 다른 개발자의 PC에서 레지스트리에 저장된 이미지를 가져와 격리된 프로세스(컨테이너)로 구동하는 단계 🡲 이미지를 실체화하여 서비스 가동
    • docker pull 명령 수행 (이미지 다운로드):
      • 도커 호스트(데몬)가 지정된 레지스트리로부터 이미지를 다운로드
      • 로컬에 이미 동일한 레이어가 있다면 다운로드를 건너뛰고 없는 레이어만 수신
    • docker run 명령 수행 (컨테이너 인스턴스화):
      • 내려받은 정적 이미지 위에 쓰기 가능 레이어(Writable Layer)를 한 층 얹어 동적인 컨테이너 프로세스로 실행
      • 인프라 자원을 할당
        • 호스트와 컨테이너 간의 가상 통신로를 여는 포트 포워딩(-p)
        • 데이터 영속성을 위한 볼륨 매핑(-v)
        • 실행에 필요한 환경 변수(-e) 등을 함께 주입
  • 실무적 관점:
    • 개발 PC에서 테스트를 마친 이미지와 운영 서버에서 구동하는 이미지가 완벽히 동일 🡲 환경 차이로 인한 장애가 발생하지 않음
    • 서비스 스케일 아웃(Scale-out)이 필요할 때 docker run 명령을 반복하는 것만으로 단 몇 초 만에 동일한 서버를 수십 대 수준으로 확장할 수 있음


  • 요약 : Build 🡲 Ship 🡲 Run이 주는 궁극의 이점
    • 이 라이프사이클은 단순히 단계의 나열이 아니라, “한 번 빌드하면 어디서나 실행된다(Build Once, Run Anywhere)”는 철학을 완성하는 주기
    • 개발자는 Build 단계에서 환경 설정을 완결 짓고, 배포 담당자는 Ship 단계에서 유통을 표준화하며,
    • 운영자는 Run 단계에서 환경 설정에 대한 고민 없이 서비스 안정성에만 집중할 수 있게 됨

4. 도커 사용하기

  • 도커의 핵심은 “어디서나 동일하게 실행되는 소프트웨어 패키징”
  • 핵심 명령어
    • docker pull [이미지명]: 레지스트리에서 이미지 다운로드
    • docker run [옵션] [이미지명]: 이미지를 기반으로 컨테이너 생성 및 실행
    • docker ps: 실행 중인 컨테이너 목록 확인
    • docker exec -it [컨테이너ID] /bin/bash: 실행 중인 컨테이너 내부에 접속

© 2020. AiDALab Co. All rights reserved.

Powered by Hydejack v9.2.1