□ CI / CD에 대해
- CI : Continuous Integration의 약자로 지속적인 통합을 의미
- 각 개발자들이 github등의 관리시스템에 코드를 통합
- 통합된 코드를 빌드 및 테스트 진행
- 버그 발생 시 버그를 해결
→ 빌드 및 테스트를 사람이 매번 할 필요없이 프로그램이 실행하고, 발생한 버그를 사람이 수정
- CD : Continuous Deployment(Delivery)의 약자로 지속적인 제공을 의미
- 기본 개념
- 지속적인 통합
- 자동화된 빌드와 자동화된 테스트를 제공
- 안정적인 코드를 빠르게 제공할 수 있는 밑거름
- 지속적인 서비스 제공
- 지속적인 베포
- 베포를 자동화하여 베포 시간을 단축하고 코드 결과물을 빠르게 지속적으로 제공
- 지속적인 통합
- 단계
- 코드 작성 : 개발자들은 소스 코드를 작성하고 저장소에 업로드
- 빌드 : 저장소에서 최신 소스 코드를 가져와 빌드를 수행, 빌드는 소스코드를 컴파일하고, 라이브러리를 추가하고, 필요한 파일을 생성하는 과정
- 테스트 : 빌드된 결과물을 대상으로 테스트를 수행, 테스트는 기능이 정상적으로 작동하는지 확인하고, 버그를 발견하고 수정화는 과정
- 베포 : 테스트를 통과한 결과물을 베포, 베포는 서버에 업로드하거나, 사용자에게 제공하는 과정
□ Docker Image
- Docker Container 서비스를 위한 이미지는 Container 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않음(Immutable, Read-Only)
- 상태 저장 없음(Stateless) : 애플리케이션과 관련된 모든 파일과 라이브러리를 포함하고 있기 때문에, 다른 환경에서도 동일한 애플리케이션을 실행 가능
- 불변성(Immutable) : 이미지가 한번 생성되면 변경할 수 없는 것을 의미
- 도커 이미지가 필요한 파일만 포함하고 있기 때문에 용량이 작으며, 이미지를 변경할 필요가 있을 경우에는 새로운 이미지 생성 필요
□ Docker Container
- Docker 컨테이너는 애플리케이션을 가상 환경에서 격리하여 실행할 수 있는 경량화된 실행 단위이다.
- 이를 통해 개발자는 애플리케이션과 그에 필요한 모든 라이브러리, 종속성, 설정 파일 등을 하나의 컨테이너 이미지에 패키징하여 어디서든 동일하게 실행할 수 있다.
- Docker 컨테이너는 가상 머신과 비슷해 보이지만, 더 가볍고 빠르며, 호스트 운영체제의 커널을 공유하면서 그 위에서 격리된 환경을 제공한다.
- Docker 컨테이너의 주요 특징
- 격리된 환경 : 컨테이너는 애플리케이션을 격리된 공간에서 실행하여, 다른 애플리케이션과의 충돌을 방지한다.
- 경량화 : 컨테이너는 호스트 운영체제의 커널을 공유하므로, 가상 머신보다 적은 리소스를 사용
- 이식성 : 컨테이너 이미지를 사용하면 애플리케이션을 어느 환경에서든 동일하게 실행할 수 있다. 로컬 개발 환경, 테스트 환경, 프로덕션 서버 등에서 일관된 실행 환경을 보장
- 빠른 시작 : 가상 머신과 달리 컨테이너는 빠르게 시작하고 중지할 수 있다.
- 배포 자동화 : 컨테이너는 CI/CD 파이프라인에서 쉽게 배포할 수 있다.
- Docker 컨테이너 관리 주요 명령어
- `docker run`: 새로운 컨테이너를 실행할 때 사용.
- `docker ps`: 현재 실행 중인 컨테이너 목록을 확인.
- `docker stop`: 실행 중인 컨테이너를 중지.
- `docker rm`: 컨테이너를 삭제.
- `docker exec`: 실행 중인 컨테이너에 명령을 실행.
- `docker logs`: 컨테이너의 로그를 확인.
□ Docker File
컴퓨터에서 돌아가는 앱을 만들기 위한 레서피같은 것, 이 file을 토대로 Docker Image를 만들 수 있음
- Docker File을 사용하는 이유
- 앱을 컨테이너로 만들 때 이미지를 만드는 용도로 사용, 이렇게 하면 앱이 필요한 모든 것을 한 곳에 담을 수 있음
- 누구나 똑같은 앱 환경을 쉽게 만들 수 있음
- 앱을 만드는 과정을 자동화 할 수 있음
□ Docker Compose
- Docker Compose 를 사용하는 이유는?
- 편하게 설정하기: Docker Compose는 여러 컨테이너를 한 파일에 적어서 설정할 수 있다, 이 파일에는 컨테이너가 무슨 이미지를 쓸지, 어떤 포트를 사용할지, 환경 변수는 뭐가 필요한지 등을 작성 이렇게 하면 여러 컨테이너를 한 번에 쉽게 설정 가능.
- 자동으로 배포하기: 설정 파일이 있으면, Docker Compose가 알아서 컨테이너들을 만들어 주고 실행,. 개발자가 일일이 명령어를 입력할 필요가 없어짐.
- 의존성 관리: 컨테이너들이 서로 의존하는 관계가 있으면, Docker Compose가 이를 관리, 예를 들어, A 컨테이너가 B 컨테이너를 필요로 하면, A를 먼저 켜고 나서 B를 실행하는 방식.
- 모니터링과 로깅: Docker Compose는 컨테이너들이 어떻게 돌아가는지 지켜보고, 로그도 모아줌, 이렇게 하면 문제가 생겼을 때 빨리 찾아서 고칠 수 있음.
- 확장성: 여러 컨테이너를 하나의 그룹으로 관리할 수 있음, 예를 들어 웹 앱을 만드는 여러 컨테이너를 한꺼번에 관리하고 확장하기 쉬워짐.
- 유연성: Docker Compose는 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지
- 보안 강화: 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한할 수도 있음
- 유지보수 용이: 설정 파일 하나로 컨테이너들을 관리하기 때문에, 뭔가 바꿀 일이 있으면 파일만 수정됨, 그러면 Docker Compose가 알아서 변경사항을 적용해줌.
- Docker Compose의 특장점
- 한 번에 여러 컨테이너 설정하기 : Docker Compose는 여러 컨테이너의 설정을 하나의 YAML 파일에 넣어서 관리, 이 파일 하나로 여러 컨테이너의 모든 환경을 설정하고, 그걸로 여러 컨테이너를 한 번에 실행가능
- 빠른 서비스 실행 : 설정 값들을 저장해 두고 다시 쓸 수 있음, 만약 설정이 바뀌지 않았다면, Docker Compose는 이전에 저장해둔 정보를 다시 사용해서 서비스를 더 빨리 시작할 수 있다.
- 같은 네트워크에서 쉽게 연결 : docker-compose.yaml 파일에 있는 애플리케이션들은 모두 같은 네트워크에 자동으로 연결, 이렇게 하면 복잡한 네트워크 설정 없이도 여러 컨테이너가 서로 쉽게 통신할 수 있다.