13일차_이미지에 레이블이 전달되는 과정

최지웅·2024년 12월 5일
0

인프라

목록 보기
17/19

11-1. 도커를 이용한 지속적 통합 절차

  • 즉시 배포 가능한 결과를 위한 CI절차는 프로젝트마다 파이프라인이 다르다는 단점이 있다. 도커를 이용해 이를 통합할 수 있다.

11-2. 도커를 이용한 빌드 인프라 스트럭처 구축하기

  • 신뢰성 높은 매니지드 서비스 외에 보안 혹은 인터넷 다운을 위한 수단으로서 직접 구축할 수도 있다.Gogs의 형상관리기능, Jenkins의 자동화 서버, Docker Registry의 이미지 배포를 사용한다.
#1. 레지스트리 도메인 추가 앞 챕터에서 안한 경우에만 추가
cd ./ch11/exercses/infrastructure

docker-compose -f docker-compose.yml -f docker-compose-linux.yml up -d

echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts # 레지스트리의 도메인을 hosts파일에 추가

docker container ls # 컨테이너 확인. Gogs의 git서버가 포트 3000번, Jenkins가 8080, registry가 5000에서 실행된다.
  • 레지스트리 서버는 컨테이너 이미지 태그에 도메인 registry.local:5000을 포함하여 푸시가능하고, 젠킨스는 플러그인을 사용해야한다. 젠킨스 서버는 1분에 1번씩 Gogs의 git을 확인하며 변경이 발견될 시 CI 파이프라인을 실행한다.
  • 젠킨스 컨테이너가 도커 및 도커 컴포즈 명령을 실행할 수 있게 도커 엔진가 연결시키고, Git 서버와 도커 레지스트리는 DNS를 통해 연결한다.
#2. 젠킨스에 포함된 도커 CLI를 도커 엔진과 연결
# docker-compose.yml
services:
	jenkins:
    	image: diamol/jenkins
        ports:
        	- "8080:8080"
        networks:
        	- infrastructure
 #docker-compose-linux.yml
 jenkins:
 	volumnes:
    	- type: bind # 소켓 바인딩
        	source: /var/run/docker.sock
            target: /var/run/docker.sock
 #docker-compose-windows.yml
 jenkins:
 	volumnes:
    	- type: npipe # 네임드 파이프
        	source: \\.\pipe\docker_engine
            target: \\.\pipe\docker_engine

11-3. 도커 컴포즈를 이용한 빌드 설정

  • 앞서 10장의 애플리케이션 정의를 여러 컴포즈 파일에 나눠 정의했다. 아래 코드에서는 환경 변수 기본값을 의미하는 :- 문법을 사용했다. ${REGISTRY:-docker.io}는 REGISTRY환경변수가 없으면 docker.io를 치환한다는 말이다.
#1. 이미지 태그에 환경 변수가 사용된 코어 컴포즈 파일 docker-compose.yml
services:
	numers-api:
    	image: ${REGISTRY:-docker.io}/diamol/ch11-numbers-api:v3-build-${BUILD_NUMBER:-local}
        networks:
        	- app-net
    numers-web:
    	image: ${REGISTRY:-docker.io}/diamol/ch11-numbers-web:v3-build-${BUILD_NUMBER:-local}
     	environment:
        	- RngApi__Url=http://numbers-api/rng
        networks:
        	- app-net
#2. 빌드
cd ./ch11/exercises

docker-compose -f docker-compose.yml -f docker-compose-build.yml build

docker image inspect -f '{{.Config.Labels}}' diamol/ch11-numbers.api:v3-build-local # 웹 어플리케이션 이미지를 확인
  • 빌드할 이미지가 하나인 경우에도 컴포즈를 이용하여 이미지 태그를 자동으로 생성시키는 게 낫다.
  • 대부분의 도커 리소스에는 키-값 쌍 형태의 추가데이터인 레이블을 부여할 수 윘다.
#3. 빌드인자, 이미지레이블 정의된 도커파일스크립트 예시
FROM diamol/dotnet-aspnet

ARG BUILD_NUMBER=0 # 환경변수(이미지 빌드 시점에만 유효. ENV와 유사)
ARG BUILD_TAG=local # 실행 중에는 정의되지 않는 환경변수.

LABEL version="3.0"
LABEL build_number=${BUILD_NUMBER} # 레이블
LABEL build_tag=${BUILD_TAG}

ENTRYPOINT ["dotnet", "Numbers.Api.dll"]
  • 모든 설정값이 치환된 docker-compose-build.yml이다. context는 작업 디렉토리 경로, dockerfile은 도커파일스크립트 경로, args는 빌드인자(ARG)
#4. 인자 재사용 가능
x-args: $args
	args:
    	BUILD_NUMBER: ${BUILD_NUMBER:-0}
        BUILD_TAG: ${BUILD_TAG:-local}
        
services:
	numbers-api:
    	build:
    		context: numbers
            dockerfile: numbers-api/Dockerfile.v4
            <<: *args # 덧붙임

numbers-web:
	build:
    	context: numbers
        dockerfile: numbers-web/Dockerfile.v4
        <<; *args
  • image build로 빌드하면 컴포즈 파일 설정을 덮어써 이미지 레이블을 바꿀 수 있다.
cd ch11/exercies/numbers

docker image build -f numbers-api/Dockerfile.v4 --build-arg BUILD_TAG=ch11 -t numbers-api . # --build-arg가 가장 우선순위. 지정 안하면 도커파일스크립트에 :-로 지정된 기본값.

docker image inspect -f '{{.Config.Labels}}' numbers-api # 이미지의 레이블 확인
  • 이미지 레이블을 확인해 빌드된 CI작업을 추적하여 어떤 버전의 코드가 수정된 것인지 확인할 수 있는 감사 추적 역활을 수행한다.

11-4. 도커 외의 의존 모듈이 불필요한 CI작업 만들기

  • 의존적이지 않게 설계하면 빌드 서버 없이, 개발 도구를 최신버전으로 할 필요가 없이 간결한 스크립트와 통합적인 파이프라인을 유지할 수 있어 이점이 많다.
  • 이를 젠킨스 CI 파이프라인을 통해 설정한다.
#1. Jenkinsfile의 CI 작업 빌드 단계
stage("Build"){ # 스크립트 파일을 만든다
	steps{
    	dir("ch11/exercises"){
        	sh 'chmod +x ./ci/01-build.bat'
            sh './ci/01-build.bat'
        }
    }
}

# 만든 스크립트 파일을 실행한다.
docker-compose -f docker-compose.yml -f docker-compose-build.yml build --pull # --pull은 빌드에 필요한 이미지를 무조건 최신 버전으로 내리라는 의미
  • 젠킨스 빌드의 모든 단계는 컨테이너에서 실행된다. CI파이프라인 각 단계는 아래와 같다. 모든 과정을 거친 릴리스 후보 이미지만 레지스트리에 푸시된다.
  • 검증 단계에서 0-verify.bat스크립트를 실행하여 빌드에 필요한 의존 모듈인 도커 버전정보를 로그 맨 처름에 출력시킨다.
  • 빌드단계: 01-build.bat스크립트를 실행하여 도커 이미지를 빌드한다. Jenkins는 환경변수 REGISTRY가 정의돼 있다.
  • 테스트단계: 02-test.bat스크립트를 실행하여 빌드된 어플리케이션을 실행한다.
  • 푸시단계: 03-push.bat 스크립트를 실행하 빌드된 이미지를 도커 레지스트리에 푸시한다.

11-5. CI파이프라인에 관계된 컨테이너

  • 도커를 사용하면 빌드 프로세스의 최상위 레이어가 항상 동일하기에 CI파이프라인에 이미지에 디지털 서명 컨테이너 추가 등 다양한 기능을 추가할 수 있다. 이를 '안전 소프트웨어 공급 체인'이라고 부른다.
  • 기반 이미지와 도커파일스크립트만 달라질 뿐 CI파이프라인은 변경하지 않아도 된다.
profile
이제 3학년..

0개의 댓글