본문 바로가기

질문과 답변/DevOps

Docker, CI/CD, Github Action

가상화 단위VMContainer 의 차이를 설명하라

더보기

VM :  Hypervisor를 통해 명시적, 물리적 자원 할당을 해서 그 위에 OS 단위로 프로그램이 구동

완전한 OS 서비스를 제공하는 가상화 플랫폼을 제공한다. (Guest OS + App + Libs/Bins)
Container : Docker를 예로 들면, docker engine을 통해 물리적 자원 분할, 그 위에 라이브러리, 어플리케이션 단위로 구동하는 것이다. (App + Libs/Bins)

또한, 컨테이너의 경우 호스트 OS의 커널을 공유하기 때문에 더 가벼운 성능을 제공한다.

 

Dockerfile 의 최적화 방법의 몇 가지에 대해 설명하라.

더보기

1. 베이스 이미지 경량화 : Alpine, Bullseye, Ubuntu 등
App실행 환경에 적합한 최적화된 가장 가벼운 베이스 이미지를 선택해야 한다.

 

2. 수정 되는 부분, 수정이 잦은 부분은 Dockerfile 뒤쪽에 배치하여 디버깅시 캐시 활용

(Docker Image는 Dockerfile라는 선언형 툴을 기준으로 층층히 layer로 쌓여진 결과물이기에)

 

3. .dockerignore를 통해 불필요, 미사용 파일 변경에 따른 rebuild를 방지

 

4. Multi-Stage Build :  빌드 이미지와 실행 이미지를 따로 두는 방식을 적용.

도커 이미지 내에서 프로그램 빌드를 하는 것은 삼가할 것.
참고로 Java의 경우, build 디렉토리에 쌓인 .class 바이트 코드 사이즈가 너무 크다.

JS의 경우, node_module 사이즈가 너무 크다. -> 절대로 Docker Image로 들어가서는 안된다.

 

5. Image 레이어를 최대한 줄이기

RUN 명령어를 세분화하지 않고 최대한 합치는 방식으로 레이어를 줄여야 한다.

아래 처럼 && 와 같은 명령어를 활용해서 레이어를 통합한다.

RUN apt-get update && \
    apt-get install -y curl && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

 

github aciton 에서 스크립트 내 사용할 환경 변수는 어떻게 설정하는가?

더보기

GitHub Actions에서는 env 섹션을 통해 전체 워크플로우 또는 특정 job, step에 사용할 전역 환경 변수를 설정할 수 있다. 이는 일회성 변수가 필요하거나 로컬 개발에서 필요했던 설정값을 일시적으로 공유해야 할 때 유용하다.

action.yml 파일에서 env 섹션을 통해 전체 workflow에서 전역변수화 하거나 job, step단위에서 env로 설정하고 사용 하는 방법이 있다.

 

github action을 사용할 레포지토리의 setting ➡️ secrets and variables ➡️ actions ➡️ variables 탭에서 설정후 ${{ variables.변수명 }} 으로 필요시 사용이 가능하다.

다만 민감정보의 경우에는 env 섹션을 통한 변수화해서 설정이 아닌, 별개의 설정을 해줘야 한다.

 

setting ➡️ secrets and variables ➡️ actions ➡️ secrets 탭에서 민감정보의 변수를 추가해서 설정 가능하다.

그리고 사용할때는 actions.yml 파일에서 ${{ secrets.변수명 }} 이런식으로 변수처럼 사용이 가능하다.

 

Docker를 사용한다는 가정하에, CI와 CD 는 어떤 절차인지 설명 하시오

더보기

CI : 배포 전 (registry에) 통합 과정이다.

코드를 작성하고, 테스트한 뒤, 실행하고자 하는 프로그램을 빌드하고,

이를 기반으로 한 dockerfile을 통해서 docker image 빌드를 진행할 수 있게 한다.

그 다음, docker build를 진행하여 docker image file을 만들고

만약 docker hub를 활용한다면 원격 저장소의 개념으로

image파일을 업로드 하여 서버에서 내려받을 수 있게 합니다. 

 

CD : 배포 입니다.

만든 이미지 파일을 구동하고자 하는 서버에 옮긴 후 

서버에 옮겨서 해당 이미지를 도커로 실행합니다.

 

Docker에서 Image와 Container의 차이?

더보기

Docker Image란, Application과 Libs, Bins 등의 실행 환경을 정의한 후 이를 docker위에서 돌아갈 수 있도록

빌드한 Docker의 격리 단위 이다.

 

그리고 이렇게 생성 된 Docker Image를 docker engine 위에서 구동시킨 것이 바로 docker Container이다.

참고로, docker engine = docker daemon+ API + CLI 이다.

 

kubernetes를 간단하게 설명하라

더보기

1개의 인스턴스에 N개의 컨테이너를 정의하는 Docker-compose와는 달리,

kubernetes는 인스턴스에 여러개의 컨테이너를 배치, 

M개의 호스트 내에서 N개의 다수 컨테이너를 설정한다.

오토스케일링, 서비스 디스커버리, 로드 밸런싱

 

꼬리 질문 : Cluster과 Orchestration에 대해 설명하라.

 

더보기

Orchestration은 다수의 컨테이너를 포함한 다수의 호스트까지 관리하는 Kubernetes의 관리 방식이다.

하나의 yml파일로 컨테이너, 호스트를 관리할 수 있다.

 

Cluster는 하나의 시스템으로 함께 작동하는 호스트(노드 :  서버, 인스턴스)의 집합이다.

가용성, 복원력, 성능을 위해서 다중화시킨 동일한 시스템의 집합체가 될 수도 있고,

하나의 Cluster를 구성할때, 각각의 호스트에 역할을 분배하여 Cluster 집단 하나가 Application을 구성할 수 있도록 하는 방식도 가능하다.

 

그리고 Cluster는 다수의 인스턴스를 관리하기 위해서 Orchestration을 사용한다.

 

 

Dockerfile 명령어 중 ARG, ENV의 차이를 설명하라.

더보기

변수의 생명주기와 관련이 있다.

ARG는 도커 이미지 빌드, 생성시에만 사용하는 환경 변수 이지만,

ENV는 컨테이너 실행 시 사용할 환경 변수를 설정한 것이다.

 

Docker 네트워크 중 Bridge 옵션과 Host 옵션의 차이점을 서술해보라.

더보기

Bridge 옵션은 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 하는 방식이며,

명시적으로 설정되어있지 않는다면 이것이 기본으로 제공되는 Bridge이다.

 

추가적으로 Default Bridge와 User-Defined-Bridge가 있는데,

후자의 경우에는 개발자가 직접 명시한 경우, 컨테이너간 Automatic DNS Resolution을 제공한다.

즉, HostName을 통해서 포트번호의 접근이 아닌 주소를 통한 통신이 가능하게 되는 것이다.

 

Host 옵션은 컨테이너를 호스트 컴퓨터와 동일한 네트워크에서 가동하기 위해 사용한다.

간단한 테스트용으로서 사용하기 적합한 네트워크 환경이다.

 

github actions 통한 CI CD 구성시 CD를 자동으로 했을 때 필요한 것들은 무엇인가?

더보기

docker hub(registry) 에 접속 할 수 있는 access key, password

github 에 보안 탭에 이 값들을 등록

 

EC2 instance에 보안 그룹을 설정하여 inbound port열어주고

(pull 받아야하기 때문) EC2 host의 IP, UserId, userPW를 전부 받아서 github action에 환경 변수로 등록

 

IAM 권한 설정이 이루어진 액세스 키의 등록도 추가한다.

동시에 해당 서버에서 docker 실행 환경이 구성되도록 해야 한다.

docker의 설치 및 docker daemon이 실행하고 있도록 한다.

 

Github Action이 사용하는 Platform에 EC2 서버 접근에 권한을 부여해주는 것이 필요하다.

 

 

'질문과 답변 > DevOps' 카테고리의 다른 글

Docker, CI/CD, Github Action (2)  (2) 2024.11.18