-
자동화는 도커의 핵심이다.
-
애플리케이션 패키징은 패키징 절차를 도커 파일에 작성하여 도커 명령 하나로 전체 패키징 절차를 자동화 했다.
-
애플리케이션 아키텍처는 docker compose파일에 작성해 compose 명령을 사용함으로써 애플리케이션 종료 및 시작 절차를 자동화 햇다.
-
명령행 도구는 매일 일정한 시가겡 실행하거나 개발자가 코드를 푸시할 때 마다 실행하는 작업 같은 어떤 특정한 절차를 자동화하기에 알맞은 수단이다.
-
이들 절차를 실행하는데 어떤 도구를 사용하는지는 중요한 문제는 아니다.
-
어떤 작업이든 스크립트를 작성해 자동화 서버에서 동작하는 도커 워크플로에 통합 시킬 수 있다.
-
이번장에서는 docker를 이용한 CI에 대해서 배운다. CI는 정기적으로 반복되며, 애플리케이션을 빌드하고 일련의 테스트를 수행하는 절차이다.
-
CI 작업 결과가 성공한다면, 현재 애플리케이션 코드 상태가 정상이고, 패키징이 끝나 릴리스 후보로 배포될 준비가 된 상태라는 뜻이다.
-
CI 서버를 설치하고 관리하는 작업은 시간 소모가 상당히 큰 작업이다.
-
도커를 이용하면 CI 작업 대부분을 간소화 할 수 있다.
Docker를 이용한 CI
-
CI 절차는 코드로부터 시작하는 파이프라인이다.
-
일련의 단곌르 밟아 테스트를 통과하고 즉시 배포 가능한 결과물을 내 놓는다.
-
CI에서 어려운 점은 이 파이프라인이 프로젝트 마다 서로 다르다는 것이다.
-
기술 스택이 무엇이냐에 따라 밟아야 하는 단계는 물론 결과물도 달라진다.
-
CI 서버는 프로그래밍 언어와 빌드 프레임 워크의 조합마다 달라질 수 있어 이러한 모든 파이프라인을 다룰 수 있어야 한다.
-
그만큼 관리의 어려움이 커진다.
-
Docker는 CI 절차의 일관성을 유지해준다.
-
모든 도커 프로젝트는 똑같은 단계를 거쳐 똑같은 유형의 결과물을 생성하기 때문이다.
- 위 그림은 Docker 프로젝트의 전형적인 파이프라인을 나타낸 것이다.
- 코드 변경이나 정해진 일정에 따라 CI 절차가시작되면 Docker 이미지를 빌드한다.
- 이 이미지는 빌드 및 테스트, 패키징, 배포를 위해 registry에 push까지 마친 최신 코드를 반영한 이미지 이다.
- CI파이프라인의 각 단계는 도커 혹은 도커 컴포즈에 의해 실행되며, 실제 과정은 컨테이너 내부에서 진행된다.
- 앞서 우리는 애플리케이션을 컨테이너 안에서 빌드 했다.
- 마찬가지로 CI 서버도 컴파일러나 SDK를 서버에 직접 설치할 필요가 없다.
- 자동화된 단위 테스트는 이미지 빌드 단계에 포함되므로 빌드가 깨졌다면 CI 절차도 해당 시점에서 중단된다.
- 또한 Docker compose 로 전체 애플맄이션을 실행하고고여기에 더해 사용자 역할을 맡아 트래픽을 일으킬 별도의 컨테이너를 실행함으로써 복잡한 end to end 테스트를 진행 할 수 있다.
- Docker화 된 CI절차에서는 모든 일이 컨테이너 안에서 진행된다.
- 그래도 전체 절차를 수행하려면 중앙 집권적인 형상관리 시스템, 이미지를 저장할 docker registry, CI 작업을 수행할 자동화 서버 등 몇가지 infrastructure 적인 요소가 필요하다.
- 이들 요소는 선택지가 아주 많지만, 이들 모두 Docker를 지원한다.
- github, azure devops, docker hub 를 조합할 수도 있고, 그냥 이들 모두 한곳에서 제공하는 gitlab을 사용할 수도 있다.
- 아니면 docker container를 사용해 직접 CI infrastructure를 꾸리는 것도 가능하다.
- iner를 사용해 직접 CI infrastruct를 꾸리는 것도 가능하다.
Docker를 이용한 Build infrastructure 구축하기
- 형상관리 기능을 제공하는 Gogs, 이미지 배포를 맡을 오픈 소스 docker registry, 자동화 서버로는 jenkins가 있습니다.
jenkins container
- jenkins는 java 애플리케이션으로, 컨테이너 실행 시 jenkins를 실행하는 스크립트와 함께 Docker image 형태로 패키징 할 수 있다.
- jenkins를 container로 띄웠기 때문에, 전체 CI 파이프라인이 docker container를 통해 실행되므로 다음과 같은 이점이 있다.
- docker에서 실행된 컨테이너는 docker API 그리고, 같은 Docker Engine에서 실행된 container와 연결된다.
- jenkins image에는 docker cli와 젠킨스 컨테이너 설정을 위한 컴포즈 파일을 포함하고 있기 때문에, docker 명령을 실행하면 host 컴퓨터에서 실행 중인 docker 엔진으로 전달한다.