CI/CD와 Docker

진경천·2025년 1월 31일

CI/CD란?

Continuous Integration/Continuous Deployment(Delivery)의 약자로, 지속
적인 통합과 지속적인 제공을 의미

기본 개념

  • 지속적인 통합(Continuous Integration)
  • 지속적인 서비스 제공 (Continuous Delivery)
  • 지속적인 배포(Continuous Deployment)
  • 지속적인 통합(Continuous Integration) : 코드의 지속적인 통합
    • 자동화된 빌드와 자동화된 테스트를 제공
    • 안정적인 코드를 빠르게 제공할 수 있는 밑거름
  • 지속적인 서비스 제공(Continuous Delivery)
  • 지속적인 배포(Continuous Deployment)
    • 배포를 자동화하여 배포 시간을 단축하고 코드 결과물을 빠르게 지속적으로 제

단계

  1. 코드 작성: 개발자들은 소스 코드를 작성하고 저장소(repository)에 업로드
  2. 빌드: 저장소에서 최신 소스 코드를 가져와 빌드를 수행. 빌드는 소스 코드를 컴
    파일하고, 라이브러리를 추가하고, 필요한 파일을 생성하는 과정.
  3. 테스트: 빌드된 결과물을 대상으로 테스트를 수행. 테스트는 기능이 정상적으로
    작동하는지 확인하고, 버그를 발견하고 수정하는 과정.
  4. 배포: 테스트를 통과한 결과물을 배포. 배포는 서버에 업로드하거나, 사용자에
    게 제공하는 과정

Docker란?

어플리케이션을 컨테이너로 격리하여 어디에서든 일관된 환경에서 실행할 수 있도록 해주는 PaaS 서비스이다.

dockerdocs

위 그림과 같이 도커는 클라이언트 - 서버 형식의 아키텍처로 구성되어 있다.

  • Client:

    • Docker 명령어를 사용하여 컨테이너를 실행, 관리, 모니터링하고, 이미지를 빌드하거나 다운로드할 수 있다.
    • Docker 명령어를 통해 Docker Host와 상호작용 하는 역할을 수행한다.
  • Docker Host:

    • Docker 컨테이너를 실행하는 데 사용되는 가상머신을 의미한다.
    • Docker 데몬을 실행하여 컨테이너를 생성, 시작, 중지 및 관리를 수행하는 역할을 수행
    • Client의 요청을 받아들이고 컨테이너를 생성, 시작, 중지, 제거하는 등의 작업을 수행
    • 호스트 운영 체제의 리소스를 사용하여 컨테이너를 실행하고 관리함
  • Docker Registry

    • Docker 이미지를 저장하고 관리하는 중앙 집중식 저장소
    • 공식적인 도커 레지스트리로, 도커 허브(Docker Hub)를 통해서 Docker 이미지를 공유하고 검색할 수 있다.
    • 또한, 개인이나 기업은 독립적인 도커 레지스트리를 구축하여 이미지를 안전하게 저장하고 관리할 수 있다.

Docker Container란?

이미지를 기반으로 만들어진 실행 가능한 인스턴스이다.

컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지이다.

컨테이너를 활용하여 운영체제를 가상화하여 소프트웨어를 어떠한 환경에서도 실행할 수 있다.

Container life cycle

Docker Image란?

이미지는 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변 파일이다.

즉, 어플리케이션 실행 환경을 만드는 것

이미지는 템플릿일 뿐이기 때문에 읽기 전용으로, 실행하거나 쓰기 작업이 불가하다.

이미지의 초기 상태를 변경하고 기존 상태를 저장할 때마다 추가 레이어가 있는 새 템플릿을 만드는 방식으로 하나의 베이스 이미지에서 이미지를 무제한으로 생성할 수 있다.

Image와 Container의 관계

  • Image: 컨테이너에 대한 OS, Application, Library 등등의 정보를 담고 있음
  • Container: Image를 실행한 상태. 1개의 Image로 부터 N개의 Container를 생성
    할 수 있는 1:N의 관계.

Image는 내가 만들고 싶은 붕어빵의 정보를 갖고 있는 틀이라면, Container는 구워낸 붕어빵

왜 Docker인가

  • 애플리케이션 개발과 배포가 편해진다.

    • Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영
      향이 없다.
    • CI/CD에서 지속적인 통합(Continuous Integration) 과정의 테스트에서
      Docker를 활용한다.
    • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표
      준화된 배포를 구성할 수 있다.
  • 여러 애플리케이션의 독립성과 확장성이 높아져요.

  • Docker가 가상화에서 사실상 표준의 위치이다.

정리

유튜버 코딩 애플의 말을 빌려서 사용하면 Image는 밀키트라고 생각하면 편하다.

위 이미지와 같이 우리가 배포하려는 웹 서버의 환경, 소스코드, 라이브러리, DB, OS 등을 미리 image에 세팅해두고 AWS EC2같은 서버에 이미지만 보내면 된다.

또한 협업시에도 유용한게 이 이미지를 생성해두고 팀원들과 공유하게 되면 완전히 동일한 환경에서 개발을 할 수 있다.

컨테이너는 Image 밀키트로 조리한 요리.
즉 Image에 설정된 환경으로 실행되는 가상 컴퓨터라고 생각하면 편하다.
예를 들어서 아래와 같은 항목을 포함하는 Image를 빌드했다고 가정해보자.

  • LinuxOS
  • Python
  • MySQL
    이 Image를 실행시키면 LinuxOS에 Python과 MySQL이 설치된 Container가 실행되는 것이다.

Docker 자주 쓰는 명령어

Image

docker run {imageName}:{tag}
```shell
# docker [image] pull [options] name:[tag]

# 최초에는 docker.io가 default registry로 설정됨.
docker pull debian[:latest]
docker pull library/debian:10
docker pull docker.io/library/debian:10
docker pull index/docker.io/library/debian:10
docker pull nginx:latest
docker pull postgres:latest

# private registry 나 클라우드 저장소의 이미지를 받는 경우
docker pull 192.168.0.101:5000/debian:10 # 현재는 실제로 동작하지 않음
docker pull gcr.io/google-samples/hello-app:1.0

Container

docker pull ubuntu:22.04
docker images

# docker create 은 실제 실행하지 않고 컨테이너 생성만
docker create –ti --name ubuntu2204test ubuntu:22.04
docker ps –a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS    PORTS     NAMES
2ccc1b2a1144   ubuntu:22.04   "/bin/bash"   4 seconds ago   Created             ubuntu2204test

docker start ubuntu2204test
Ubuntu2204test
docker attach ubuntu2204test

# docker run 은 create/start/attach 를 순차적으로 한 번에 실행하는 것과 같음 
docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash
root@57a1a1c759b6:/#
docker run -ti --name=ubuntu2204test3 ubuntu:22.04 /bin/bash
root@1cd125b32870:/#

# 터미널을 한 개 더 열고 
ps -ef | grep ubuntu2204test3
user   9710  7637  0 17:17 pts/4    00:00:00 docker run -ti --name=ubuntu2204test3 ubuntu:22.04 /bin/bash
user   9921  9377  0 17:17 pts/5    00:00:00 grep --color=auto ubuntu2204test3
profile
어중이떠중이

0개의 댓글