웹 개발 파이프라인 구축 - part1

wltjd1688·2025년 5월 12일

풀사이클

목록 보기
64/74

강의 목표

  • 과정 제목에 포함된 "풀사이클 개발"이라는 것이 무엇을 뜻하는 것이었을까?
  • (웹 서비스 개발의 관점에서)과목 제목에 포함된 "파이프라인"이 무엇을 뜻하는 것일까?
  • CI/CD란 무엇이고 이것은 왜 필요한 것일까?
  • 여기에 이용되는 도구들이 여러 가지 있던데, 각각의 역할이 무엇이고 어떻게 활용하는 것일까?
    • Docker(도커)
    • Kubernetes(쿠버네티스)
    • JenKins(젠킨스)

웹 개발 파이프라인

전통적 인도 프로세스

한계점

  • 느린 인도 기간
    개발 요구사항이 정의된 때로부터 제품 전달이 완료되기까지 긴 시간 소요

  • 느린 패드백 주기
    개발팀의 효율성 항상에 걸림돌로 작용

  • 자동화 미비
    릴리스 회수가 적으므로 필요 감소 -> 릴리스 기간 예측 어려워짐

  • 핫픽스 위험성
    긴급한 코드 변경에 대하여 충분한 테스트가 이루어질 수 없는 위험

  • 개발문화 건전성 제한
    팀 스트레스, 의사소통 부족, 책임의 분산, 낮은 업무 만족도,...

해결책: 지속적 인도/ 배포 방식

  • 변경 내용이 단지 코드 한 줄이라고 할때,

    • 이를 배포하는 데 어느 정도 시간이 소요되는가?
    • 이 배포 작업을 반복해서 안정적으로 수행할 수 있는가?
  • 해결안: 프로세스의 각 단계를 자동화

    • 빠른 제품 인도
    • 짧은 피드백 주기
    • 위험도가 낮은 릴리스: 반복과 롤백
    • 유연한 릴리스 정책 결정 가능

git을 활용한 SCM에서 논리적 연관성이 있는 변경사항을 묶어 잘게 자주 커밋하는 것과 유사

자동 배포 파이프라인

  • 코드의 통합, 테스트, 배포는 (전통적 인도 방식에서와 마찬가지로) 매우 중요한 단계들임
    • 각 단계를 유지하면서 동시에 자동화하는 것이 필요, 또한 지속적 모니터링도 필수

지속적 통합(CI; Cotinuous Integration)

코드가 올바르게 빌드 및 통합되는지를 자동으로 확인

  • 리포지토리에서 코드를 체크아웃
  • 빌드(컴파일 및 링크 등)를 수행하고 단위테스트(UT; Unit Test)를 행함
    • 테스트 커버리지(test coverage)리포트 생성
  • 코드 품질을 검증
    • 정적 분석(static analysis)을 통한 규칙 검사
    • 코딩 규약 등의 준수 여부 검사

개발 팀에 1차적인 피드백 제공

자동 인수 테스트

인수 테스트(UAT; User Acceptance Test)

  • 제품이 릴리스할 준비가 되었는지를 "사용자(고객)요구사항에 견주어" 확인
  • 전통적인 QA팀의 역할
  • 통합 테스트, 인수 테스트, 비기능적 분석등을 포함

CD 파이프라인에 통합

  • 품질 점검을 나중에 하는 것이 아니라 개발 중에 제품에 내재시키자는 것
  • 개발자가 구현을 마치는 즉시 고객이 원하는 제품인지를 검증
  • 소프트웨어의 인도 결정을 자동화한다는 뜻

구성 관리

구성 관리(Configuration Management)

  • 소프트웨어와 환경 변화를 추적하고 제어
  • 전통적으로 운영(Operation)팀의 역할
  • 필수 도구 준비와 설치
  • 응용의 배포와 관련한 다양한 서비스 인스턴스와 배포 버전 관리

CD 파이프라인에 통합

  • 프로덕션 환경의 응용을 자동으로 구성하고 배포
  • 구성관리 도구를 이용하여 구성 관리 파일을 버전 관리 시스템에 저장하고 변경 이력 추적

CD를 위한 기술적 전제 조건

자동 빌드, 테스트, 패키징, 배포

  • 전체 프로세스 중 자동화되지 않는 부분이 있다면 지속적인도가 불가능

신속한 파이프라인 실행

  • 리포지토리에 커밋 발생할 때마다 실행되어야 하므로 소요시간이 길면 안됨

신속한 장애 복구

  • 신속한 롤백이 가능해야 하며, 그렇지 못할 경우 잦은 릴르스에 따른 위험도가 높아짐

무중단 배포

  • 잦은 배포가 이루어지므로 배포 중 서비스 다운타임이 발생하면 안됨

트렁크 기반 개발

  • 로컬 브랜치에만 코드 체크인하면 코드 통합 검증이 이루어지지 않고 릴리스 회수가 줄어듬

웹 개발 파이프라인 구성 도구

몇가지 의문점

  • Q. 이렇게 많은 도구들의 사용을 익혀야하나?
    • Yes - 도구와 환경을 올바르게 설정하는 것이 파이프라인 구축에 있어서 중요함
  • Q. 그렇다면, 파이프 라인 구축에서 가장 중요한 것은 도구 사용법을 익히는 것?
    • No - 더욱 중요한 것은 각 도구가 프로세스에서 담당하는 역할과 요구되는 조건을 이해하는 것
  • Q. 여기서 소개되는 도구들이 필수인 것인가?
    • NO - 같은 역할을 하는 도구들이 많이 존재, 환경에 맞는 도구를 유연하게 선택해야한다.
  • Q. 그렇다면, 새 도구를 선택할 때마다 다 새로 익혀야하는 것인가?
    • NO - 역할과 요구조건이 같은 도구들은 세부 사항에 차이가 있다고 하더라도 대부분 유사

자동화 도구들

컨테이너 가상화 및 클러스터 운영

  • Docker + Kubernetes

소프트웨어 개발 파이프라인 자동화 서버

  • Jenkins

구성 관리 자동화

  • Ansible

소프트웨어 버전 관리(SCM; Source Code Management)

  • GitHub

그 외

  • 빌드 도구(자동화 지원), 단위 테스트 프레임워크, 정적 코드 분석기, 인수 테스트 프레임워크,...

컨테이너화(Containerization)

응용 프로그램, 설정(configuration)파일, 라이브러리, 그리고 이들 사이의 의존성 관계를 한 군데에 묶어 관리

  • 소프트웨어 개발 및 배포의 효율과 안전성을 향상시킴
  • 하이퍼바이저에 의한 가상 기계의 대체 및 보완 방식으로 각광받고 있음
  • 시스템 의존성이 최소화되어 소프트웨어 시스템의 이식이 용이해짐
  • 예측 가능하고 유연한 소프트웨어 실행 환경을 제공하여 클라우드 컴퓨팅 인프라에서 활용도가 높음

지속적 통합 파이프라인(CI Pipeline)

리포지토리에 코드 커밋이 발생할 때마다 빌드, 단위테스트, 정벅 분석등을 행함

자동 인수 테스트

Docker와 Jenkins를 결합하여 인수 테스트 환경을 만들고 테스트 수행

쿠버네티스 쿨러스터링

Docker Host 대신에 Kubernetes Cluster가 연결된 형태

구성 관리(Configuration Management)

다중 환경을 생성, 미러링하여 테스트 환경과 프로덕션 환경을 미러링

컨테이너 가상화와 도커

가상화

컴퓨팅 자원(리소스; resource)의 추상화를 일컫는 광범위한 용어
(딱딱하게)물리적 컴퓨팅 자원의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 자원과 상호작용하는 방식으로부터 감추는기술
(부드럽게)컴퓨터 안에 또 다른, 즉 가상의 컴퓨터가 존재하도록 하는 기술

가상화 컴퓨팅의 이점

시스템 측면

  • 시스템 이용률*utilization)의 향상
  • 설정(configuration)의 구성과 복원이 용이

비즈니스 측면

  • 자본 및 운영 비용 절감
  • 다운타임 최소화 (또는 제거)
  • 비즈니스 연속성 및 재해 복구 향상
  • 데이터 센터 관리 간소화

우리의 관심

  • 개발한 소프트웨어의 배포, 테스트, 구성 관리 등에 (실제 물리적 하드웨어에 상관없이)통일된 환경을 제공할 수 있음
  • 따라서 소프트웨어 통합/인도 프로세스의 자동화에 적용하기가 좋음

서버 가상화 기술의 진화

가상 기계(VM; Virtual Machine)기반

  • 하이퍼바이저(hypervisor)를 이용
  • Type 1: 네이티브(native)또는 베어메탈(bare-metal)형
    • 전가상화(full virtualization)
    • 반가상화(para virtualization)
  • Type 2: 호스트형(hosted)

컨테이너(container)기반

  • 호스트 OS의 컨테이너 기술을 이용

호스트: 다른 시스템을 가상화하여 실행하는 컴퓨터
게스트: 호스트 시스템 위에 가상화되어 제공되는 (가상)시스템

컨테이너 가상화(Containerization)

컨테이너 사용의 이점

가상기계(VM; Virtual Machine)의 대체 또는 보완 방식으로 각광받고 있음
소프트웨어 개발 및 배포의 효율과 안정성을 향상시킴

  • 응용 프로그램, 설정 파일, 라이브러리, 그리고 이들 사이의 의존성 관계를 한데 묶어 관리
  • 이 "묶음"을 컨테이너라고 부르고,
  • 컨테이너 엔진의 도움으로 시스템 의존성이 최소화되어 소프트웨어 시스템의 이식이 용이해짐

도커(Docker)

널리 이용되고 있는 컨테이너 기반 가상화 플랫폼

  • Linux, Window, MacOS 상에서 실행되는 컨테이너 엔진을 제공
  • AWS, GCP, Azure 등의 클라우드 컴퓨팅 인프라와 결합하면 더욱 유연한 운영이 가능

도커 허브(Docker Hub)

컨테이너 이미지들에 대해 원격 저장, 유지관리, 공유, 권한 관리 등을 효율적으로 행할 수 있는 온라인 서비스 제공
-> 소프트웨어 개발/배포 프로세스의 효율성이 크게 증대

도커 설치

하려는 일

  • 내가 가진 컴퓨터에 도커 엔진을 설치해서, 도커를 이용한 실습 준비를 해보자.
    생각하고 있어야 할 것
  • 나중에 CI/CD 파이프라인 구축을 완성할 대는 "내가 가진 컴퓨터"가 아니라 클라우드 환경을 이용할 것
  • (그 땐 이런 설치 과정은 내가 할 일이 아님)

준비

Docker Desktop 과 Docker Engin

Docker Desktop for linux

  • GUI 제공 - 보다 간단한 컨테이너 및 서비스 관리가 가능
  • Docker Engin을 포함, 그러나 Windows 및 MacOS의 경우와 마찬가지로 VM 위에서 실행
    Docker Engin for Linux
  • Docker는 Linux의 프로세스 컨트롤 그룹을 이용하여 호스트 커널의 서비스들을 이용하며 격리되어 실행
  • 여기에서는 이 방법을 활용하는 것으로 가정

도커 엔진(실행 상태)정검

명령어

  • docker info

  • docker run hello-world


    아래는 처음 실행할때 다음과 같이 처음에는 docker engin이 해당 hello-world:latest를 다운받는걸 볼 수 있다.

도커의 구성 요소

이미지와 컨테이너

도커 이미지

  • 응용을 실행하는 데 필요한 모든 파일들과 그것을 실행하는 방법을 한데 묶어 놓은것
  • 상태를 저장하지 않는 (stateless)방식 - 네트워크로 전송, 레지스트리에 저장, 이름 및 버전 지정가능
  • 계층화되어 있다는 특징을 갖고 있으며, 어떤 이미지로부터 다른 이미지를 만드는 것이 가능

도커 컨테이너

  • 이미지의 실행 인스턴스
  • 하나의 이미지로부터 여러 컨테이너를 만들어 동일한 응용을 여러 개 실행할 수 있음
  • 상태를 저장하는 (stateful)방식 - 컨테이너를 사용하면서 상태를 변경할 수 있음
    • 그러나 컨테이너가 소멸하면 이 상태도 잊어버림
  • 실행 상태를 유지함
    1. 이 "상태"를 조정해서 우리가 원하는 것을 만들 수 있는지 시도해 보자.
    2. 변경한 상태를 반영하는 이미지를 만들 수 있겠지, 당연히?
    3. 이 과정을 자동화하는 방법을 알아보자!

이미지의 계층(Layer)구조

정리

  • 도커 이미지를 이용해서 컨테이너를 만들어 실행할 수 있다.
  • 도커 이미지는
    • 계층 구조를 가지고 있음
    • 컨테이너를 만드는 데 이용되는 거푸집으로서 상태를 저장하고 있지 않음
    • 이미지 레지스트리를 통하여 네트워크를 통해 전송 가능
  • 도커 컨테이너는
    • 이미지를 이용하여 만들어진, 응용 소프트웨어를 실제로 실행하는 격리된 환경
    • 도커 엔진에 의해서 관리되며 마치 컴퓨터 하나가 새로 생겨 정해진 일을 수행하는 것과 같은 모습을 보여준다.

컨테이너와 이미지 관련 명령어 요약

docker run <이미지 이름>

  • 이름이 주어진 이미지를 로컬에서 또는 레지스트리에서 가져다가 컨테이너를 만들어 실행

docker ps, docker ps -a

  • 현재 실행 중인 (또는 중단되어 있는 것까지 포함화여) 컨테이너들의 정보를 조회

docker images

  • 로컬 컴퓨터에 가지고 있는 이미지들의 정보를 조회

docker stop <컨테이너 이름/ID>

  • 현재 실행중인 컨테이너의 실행을 중단
  • 컨테이너가 없어지지는 않음

docker rm <컨테이너 이름/ID>

  • 컨테이너를 삭제

docker rmi <이미지 이름/ID>

  • 이미지를 삭제
$> docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED        STATUS       PORTS                    NAMES
cf3698b80c63   mariadb   "docker-entrypoint.s…"   3 months ago   Up 12 days   0.0.0.0:3306->3306/tcp   mariadb

$> docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS                          PORTS                    NAMES
3d27925c3872   httpd         "httpd-foreground"        2 minutes ago    Exited (0) About a minute ago                            keen_greider
90f2fd663341   nginx         "/docker-entrypoint.…"   3 minutes ago    Exited (0) 3 minutes ago                                 busy_heyrovsky
7cc943949891   httpd         "httpd-foreground"        9 minutes ago    Exited (0) 7 minutes ago                                 objective_lehmann
0feb45133c20   hello-world   "/hello"                  49 minutes ago   Exited (0) 49 minutes ago                                keen_elion
2684eef6f3ee   hello-world   "/hello"                  51 minutes ago   Exited (0) 51 minutes ago                                thirsty_hoover
cf3698b80c63   mariadb       "docker-entrypoint.s…"   3 months ago     Up 12 days                      0.0.0.0:3306->3306/tcp   mariadb

$> docker rm 3d27925c3872
3d27925c3872

$> docker rm objective_lehmann
objective_lehmann

$> docker ps -a               
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS                      PORTS                    NAMES
90f2fd663341   nginx         "/docker-entrypoint.…"   5 minutes ago    Exited (0) 4 minutes ago                             busy_heyrovsky
0feb45133c20   hello-world   "/hello"                  51 minutes ago   Exited (0) 51 minutes ago                            keen_elion
2684eef6f3ee   hello-world   "/hello"                  52 minutes ago   Exited (0) 52 minutes ago                            thirsty_hoover
cf3698b80c63   mariadb       "docker-entrypoint.s…"   3 months ago     Up 12 days                  0.0.0.0:3306->3306/tcp   mariadb

$> docker images
REPOSITORY    TAG            IMAGE ID       CREATED         SIZE
nginx         latest         a5cdc6683c84   3 weeks ago     198MB
alpine        latest         8d591b0b7dea   2 months ago    8.17MB
httpd         latest         3405bcd9d2a6   3 months ago    178MB
hello-world   latest         f1f77a0f96b7   3 months ago    5.2kB
vdb           v1.7.3-fix.1   d4bdee73aa9c   5 months ago    244MB
mariadb       latest         d045ae11ce7e   5 months ago    443MB
ubuntu        latest         a2f229f811bf   21 months ago   69.2MB

$> docker rmi 3405bcd9d2a6
Untagged: httpd:latest
Untagged: httpd@sha256:c11efd67f6308f2c25965e4e9d13ded15e7c45c0367b95f619a16e03c6c1e2b1
Deleted: sha256:3405bcd9d2a6068536f9fd108e0d5684478896a26d25d875a2901448d453fea7
...

$> docker images          
REPOSITORY    TAG            IMAGE ID       CREATED         SIZE
nginx         latest         a5cdc6683c84   3 weeks ago     198MB
alpine        latest         8d591b0b7dea   2 months ago    8.17MB
hello-world   latest         f1f77a0f96b7   3 months ago    5.2kB
vdb           v1.7.3-fix.1   d4bdee73aa9c   5 months ago    244MB
mariadb       latest         d045ae11ce7e   5 months ago    443MB
ubuntu        latest         a2f229f811bf   21 months ago   69.2MB

실험 계획

상태를 깨끗이 하고

  • 이전에 가져왔던 이미지, 실행했던 컨테이너들을 모두 삭제

httpd 이미지를 가져다가 실행하되

  • "It works!" 말고 다른 기본 페이지가 나오도록 설정
  • 컨테이너 안의 특정 파일을 수정하는 작업

이 상태로 실행되는 이미지를 작성

  • 이후에는 이 이미지로 컨테이너를 만들어 실행하면 항상 우리가 원하는 문서가 기본 페이지로 제공되도록

오류! docker run httpd172.17.0.2를 받았는데 무한로딩만 걸리고 나오는게 없다.
gpt>

포트 포워딩을 걸어주기

docker run -d -p 8080:80 httpd
  • p 호스트포트:컨테이너포트 옵션으로, 컨테이너의 80번 포트를 호스트의 8080번 포트에 연결합니다.
    이후 브라우저에서 http://localhost:8080 으로 접속하면 Apache 기본 페이지가 뜹니다.
  • 이후 cmd에서 수동으로 실행하게되면 macOS에서 접근하기 어렵다고 한다.

이미지 생성 자동화

Dockerfile

  • 계층 구조를 이용하여 도커 이미지를 만드는 절차를 기술하는 파일(텍스트)

  • FROM [--platform=<platform>]<image>[AS<name>]

  • RUN <command>

  • ENTRYPOINT ["executable","param1","param2"]

    이미지 빌드 명령어

  • docker build [OPTIONS]PATH|URL|-

요약 정리

도커의 편리함 (CI/CD 관점에서 생각해 보기)

  • 응용을 실행하는데 이용되는 실제(물리적)컴퓨터 환경과 독립적으로 통일된 실행 환경 제공 가능
  • 이미지로부터 여러 개의 동일한 컨테이너 인스턴스를 만들고 실행 가능
  • 필요한 소프트웨어 도구 및 설정 파일 등을 사전에 지정해 두고 알려진 상태로 컨테이너 생성 가능(자동화!)

남아있는 일들

  • 환경 변수의 이용
  • 컨테이너들 사이 및 호스트와 컨테이너 사이에 TCP/IP를 이용한 통신 가능하게 하기
  • 호스트와 컨테이너 사이의 볼륨 공유
  • 도커 클린업

과제

간단한 도커 응용 만들기 - 이미지 이름 (과 태그)는 hello:0.1
- 베이스 이미지:ubuntu:22.04
- 패키지 설치: python3(apt-get이용)
- 응용 스크립트 설치: hello.py
로컬 이미지 이용하여 컨테이너 만들고 실행
- docker run hello:0.1

도커에서 환경 변수의 이용

  • 환경 변수를 참조하도록 hello.py를 수정
import os

print("Hello World from %s!" %os.environ["NAMA"])
  • Dockerfile 내에 ENV 지시자를 이용하여 환경변수 내용 지정(FROM 보다 바로 뒤에)
    ENV NAME Grepp

  • 이미지 빌드(hello:0.2)하고 실행해서 결과 확인

실행이 끝난 컨테이너의 자동 삭제

docker run 명령에 -rm 옵션을 붙이면 실행 완료와 함께 컨테이너 삭제

호스트에서 컨테이너에 접속할 수 있으나

tomcat이 실행되고 있는 컨테이너의 TCP/8080 포트를 호스트의 외부로부터도 접속 가능하도록(서비스를 실행했다고 가정해보자)설정하려면?
-> 호스트의 특정 포트를 특정 컨테이너의 특정 포트와 연결하는 방법이 필요

컨테이너 이름 지정하기

도커 컨테이너는 이름과 ID에 의하여 식별

  • 이름을 지정하지 않으면 docker가 컨테이너를 만들 때 이름을 자동 부여
  • 그러나 관리 편의 및 자동화를 위해서 이름을 지정하는 것이 필요해짐

명령어

  • docker run --name <컨테이너 이름> <이미지>

도커 클린업

컨테이너 삭제

  • docker rm <컨테이너>

이미지 삭제

  • docker rmi <이미지>

컨테이너 전체 삭제

  • docker container prune

이미지 전체 삭제

  • docker image prune -a

요약

이 강의에서 배우고 실습한 것들

  • 도커 컨테이너에 환경 변수 전달(두 가지 방법)
  • 백그라운드로 컨테이너 실행하는 방법, 실행 마친 컨테이너가 자동 삭제되도록 하는 방법
  • 호스트의 포트를 컨테이너의 포트에 연결하여 컨테이너 안에서 실행되는 서비스를 바같으로 노출하는 방법
  • 컨테이너의 이름 지정하기, 삭제하기 정리하기, 이미지 정리하기

컨테이너 안의 파일들과 도커 볼륨

컨테이너 안의 파일들에 접근하는 방법

실행하고 있는 컨테이너와 호스트 사이의 파일 복사

  • 명령어docker cp를 이용

이미지 빌드할 때 호스트로부터 파일을 컨테이너에 추가

  • Dockerfile 안에 ADD 지사자를 활용

바인드 마운트

  • docker -v 옵션을 호스트의 특정 디렉토리를 컨테이너와 공유

도커 볼륨

  • docker -v 옵션으로 호스트와 공유하는 것은 비슷하지만 컨테이너가 마운트하는 것은 추상화된 볼륨

컨테이너 안의 파일들 다루기

실습 준비

  • nginx:latest 이미지로 컨테이너를 실행하되, 컨테이너의 80포트를 호스트의 8080포트에 연결
  • 호스트에서 브라우저 실행하여 localhost:8080 주소에서 웹 접속 성공하는지 확인
    • 보다 확실히하고자 한다면, 컨테이너를 종료하고 접속 안 되는것도 확인

대체할 파일을 하나 준비

  • 기본으로 표시되는 내용과 식별되는, 간단한 html파일을 하나 준비해서 이것을 컨테이너에 보낼 준비

이미지 빌드에 파일 추가

Dockerfile 내에 ADD 지시자를 이용해서 호스트가 제공하는 파일을 특정 위치에 둠

  • ADD <호스트 내 source 파일의 경로> <컨테이너 내에 배치할 파일의 경로>

바인드 마운트(bind mount)

명령어
docker run -v <호스트 경로>:<컨테이너 경로> <이미지>

실습

  • 호스트에 실험용 디렉토리를 하나 만들고, 이 안에 간단한 텍스트 파일 하나를 생성
  • 이미지 ubuntu:22.04를 interactive/tty 모드로 하여 /bin/bash 실행하되, 위 디렉토리를 볼륨 공유
  • 컨테이너 안에서 새로운 파일 하나를 생성, 컨테이너는 종료
  • 호스트에서 새로 생성된 파일 확인

도커 볼륨 이용

볼륨 생성 명령어

  • docker volume create <볼륨의 이름>

요약

다음 사항에 답변을 달아 보세요. 나는,

  • 도커 이미지가 무엇이고 컨테이너가 무엇인지 설명할 수 있다.
  • 왜 CI/CD에 도커가 큰 역할을 하는지 이해한다.
  • 레지스트리에서 이미지를 찾아 컨테이너를 만들어 실행할 수 있다.
  • 기본적인 Dockerfile을 작성해서 필요한 이미지를 만들어낼 수 있다.
    • Dockerfile에 대해서는 예제를 찾아 참고해 보세요.
  • 컨테이너에 이름을 부여할 수 있고, 이미지에 태그를 달 수 있다.
  • 만든 이미지를 레지스트리 (도커 허브)에 푸시하여 게시할 수 있다.

실습 과제

간단한 (아주 간단한) 웹 응용을 하나 만들어 서버를 도커 이미지로 구성해보세요.

  • 코딩
    • 가장 쉽게 만들 수 있는(자신있는) 방법을 이용해서 코드를 개발해 봅시다.
  • 서버 환경 구성
    • 필요한 패키지는 (컨테이너 안에)apt-get등으로 설치해 보면서 테스트합니다.
  • 이미지 만들기
    • 위 패키지 구성, 코드 배치(ADD 하거나 tar를 옮겨 풀거나, git pull 하거나, ...), 설정 파일 구성등을 Dockerfile에 작성하고 docker build 해서 만들어 docker run 으로 테스트 합니다.
  • 레지스트리에 게시하기
    • 테스트가 잘 끝난 이미지에 태그를 붙이고 docker push 해 봅시다.

이 과정에서, 코드 변경이 일어나면 어떤 일들이 자동으로 실행되어야 할지 생각해 봅시다.

profile
일단 해!!!!

0개의 댓글