본문 바로가기

질문과 답변/DevOps

Docker, CI/CD, Github Action (2)

Docker 는 왜 사용하는가? 핵심들만 간단 명료하게 설명하라

더보기

Application의 일관적인 실행 환경을 제공하기 위해 사용되는 가상화 플랫폼이다.

로컬 실행 환경과 격리된 환경에서 필요한 실행 환경만을 구성할 수 있다. 

 

Docker 가 없을 때와, Docker 를 사용할 때의 차이를 통해 Docker 사용 이유에 대해 설명하라

더보기

가령 개발 환경에서의 JVM의 버전이 17이고, 테스트를 위한 실행 환경에서의 버전은 11이라면

Docker가 없을 경우에 로컬에는 두 가지 버전의 JVM의 설치가 필요해 로컬 환경이 오염된다.

Docker를 사용한다면 격리된 실행 환경을 통해 추가 버전 설치의 필요가 없어진다.

 

하나의 인스턴스에서 다중 컨테이너를 사용하는 사례 몇 가지만 이야기하라

더보기

side car 패턴을 사용한 ELK 스택 - 서버 인스턴스에서 서버 컨테이너 서비스와 logstash와 같은 로그 수집 컨테이너 서비스를 구동하고, logstash는 elasticsearch로 서버의 로그 데이터를 보낸후, kibana와 같은 것을 통해 서버의 정보, 통계를 확인하는 방식의 기술 스택이다.

 

서버 컨테이너와 DB 컨테이너를 두어서 사용하는 케이스도 존재.

 

심화 : Docker 의 상세 원리를 설명하시오 - LXC, kernel namespaces, cgroup 통해

더보기

LXC : linux container 기술 ( 격리된 공간에서 프로세스가 동작하는 기술 )이 docker container 기술의 바탕이 된다.

 

linux kernel을 통해 namespace, cgroup이 제공되는데

Namespace(Kernel namespace) : 프로세스 격리 (linux의 6가지 네임스페이스에 대한 격리 환경을 제공, 이중 mount namespace에서는 FS(파일 시스템)의 격리를 지원, 기타 프로세스별 FS, 네트워크, UID 등 또한 영역 분리를 한다.)

 

cgroup : 자원 격리(메모리, cpu 격리) 프로세스에 대한 리소스 할당을 쉽게 관리하고 모니터링하고 CPU, 메모리 및 네트워크 제한과 같은 리소스 제한을 설정할 수 있다.

 

Docker 에서 이미지와 컨테이너는 각각 무엇인가?

더보기

Docker에서 이미지란 Application과 실행환경(library, binary 설정)이 담겨진 Docker의 격리 단위이다.

컨테이너란, 이미지를 docker engine 위에서 동적자원을 할당받아 실행되고 있는 프로세스를 말한다.

 

Dockerfile 은 무엇인가?

더보기

Dockerfile은 Docker image를 정의하는 선언형 툴이다. 어떤 실행환경(Bins, Libs)을 구성할지, 어떤 Application을 구동할지에 대한 이미지 생성 규칙이 정의되어 있다.

 

Dockerfile(Docker) 와 Docker-Compose 의 차이를 설명하라

더보기

Dockerfile은 단일 컨테이너에서 사용할 단일 Image를 정의한 선언형툴이고,

Docker-compose는 다중 컨테이너를 사용하는 서비스를 정의한 선언형 툴이다.

Dockerfile과 다른점은 container간의 의존성과 docker bridge network 설정 등을 포함한다.

 

심화 : Declarative 선언형 툴 몇가지를 나열하고, 그 특성을 설명하시오

더보기

Dockerfile, docker-compose.yml, terraform 과 같은 것이 있다.

선언형 툴은 최종적으로 어떻게 생성이 되어야 한다는 상태를 정의한다.

어디에서 사용해도 같은 상태가 되는 상태성과

스냅샷 기반이라 조금이라도 바꾸면 버전이 달라지는 버전관리의 유용함이 그 특징이다.

 

심화 : Docker Network 원리를 간단하게 설명하시오

더보기

(사실상 다중 컨테이너 간 네트워크 연결 원리이기에 docker compose 네트워크 원리이긴 하다)

소프트웨어 기반의 가상 브릿지, docker0라는 L2 switch 를 중심으로 네트워크를 구성하고,

포트포워딩을 사용한다.

 

Docker는 NIC라는 가상 네트워크 카드를 사용해 실제 물리 컴퓨터의 NIC와 연결되는 방식으로

내부의 네트워크를 구성한다.

외부와의 네트워크 연결은 NAPT와 ip masquerade를 사용한다.

 

Docker 에서 호스트 포트와 컨테이너 포트를 설명하라, 그리고 어떻게 설정하는가?

더보기

호스트 포트란, 호스트 OS의 포트를 말하는 것이고,

컨테이너 포트란 Docker network 내부의 각각의 container별로 할당된 포트를 말한다.

 

Docker Compose 다중 컨테이너 구성 시 컨테이너 내부에서와 호스트 외부에서의 접근 차이를 설명하라

더보기

컨테이너 내부에서 접근 하는 방식 : user-defined bridge나 hostname을 설정하여 docker network port 간 연결을 진행하는 것이고,

호스트 외부에서의 접근은 각각의 컨테이너 별 docker network 포트와 local host 포트를 매핑해서 외부에서 접근하는방식이다.

 

Docker Engine 혹은 Docker Daemon 은 무엇인가?

더보기

docker container 기반의 애플리케이션을 실행, 관리, 조정하는 중심 컴포넌트이다

컨테이너 실행 뿐만 아니라 네트워크, 스토리지, 이미지 빌드등 컨테이너화와 배포 자동화를 지원한다.

 

CI 와 CD 는 각각 어떤 절차인지 Docker 를 기준으로 설명하라

더보기

CI는 지속적인 통합 (Continuous Integration)으로

docker를 사용한다고 가정할 시 소스코드를 기반으로 한 실행 환경을 개발후

테스트, 그리고 빌드 파일을 형성하며, 이를 통해 docker image파일을 만든다.

이후 docker hub와 같은 public registry나 private registry에 push하는 과정까지를 일컫는다.

 

CD는 지속적인 배포 (Continuous Deployment)로,

push 한 docker image파일을 실행주체(서버인스턴스, 혹은 로컬 환경 등)에 pull 받아 업데이트 한 후

이를 docker engine을 통해 실행하여 container화 하는 과정까지를 말한다.

 

CI / CD 툴 몇 가지만 설명하라

더보기

Jenkins와 Github Action이 있다.

jenkins는 Jenkins를 위한 서버를 구축할 필요가 있지만,

Github Action은 소스코드 중앙관리를 위한 Github Repository를 사용하고, 이것과 github action과의 호환성이 좋아 연계해서 사용하기 편리하다.

 

일반적으로 Docker 를 활용한 CI/CD 배포 프로세스를 할 수 있는 최대한의 상세로 설명하라

더보기

push

test

build

docker image build

push

pull

run image

 

Docker Image 를 서비스(구동)하기위한 인스턴스에 전달하는 방식 2가지를 상세히 설명하라

더보기

1. 직접 서버 인스턴스에 전달하는 방식 : scp(Secured copy) 방식 :  tar 파일로 압축해서 전달하는 방식

2. Registry를 통해 Registry 에 push -> 서버에서 pull 하는 방식으로 제 3자를 통해 전달하는 방식이 존재

 

아래 Docker 명령어들을 각각 언제 사용하는지 설명하라

더보기

docker build : dockerfile을 통해 image를 빌드할 때 사용한다.

docker images : 현재 local 환경 내에 등록되어있는 docker image들을 조회할 때 사용한다.

docker rmi : docker image를 삭제할 때 사용한다.

docker run : docker image를 container화 해 application을 실행할 때 사용한다.

docker ps : 현재 docker에서 실행되고 있는 container를 조회할 때 사용한다.

docker start : 실행이 중단된 docker container를 실행할 때 사용한다.

docker stop : 실행중인 docker container를 멈출때 사용한다.

docker restart : 실행중인 docker container를 재시작할때 사용한다.

docker rm : docker container를 삭제할 때 사용한다.

 

심화 : Docker 빌드 시 민감 정보를 그대로 전달하면 어떤 문제가 있고, 어떻게 해결할 수 있는가?

더보기

public으로 노출된 docker hub와 같은 docker registry에서 임의로 접근해 나의 민감 정보에 접근할 수 있게 된다.

"docker run -it my_image /bin/bash"

ls /app # 소스 코드가 포함된 경로 로 확인가능.

jdbc를 통한 db접근과 같은 민감 정보를 그대로 확인이 가능하다.

 

그렇기 때문에 jasypt 와 같은 java 기반 라이브러리로 민감 정보를 미리 암호화해두고,

복호화키를 github action과 같은 ci/cd 배포 툴에 환경변수로 등록해 복호화 키 없이는 JAR가 실행되지 않도록 제약을 걸어 둔다.

 

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

Docker, CI/CD, Github Action  (0) 2024.10.29