카테고리 없음

원티드 백엔드 챌린지 1회차

sungw00 2024. 4. 2. 23:02
728x90

이 글은 원티드에서 진행한 백엔드 챌린지를 통해 발표자 오시영님의 발표 자료를 토대로 작성되었습니다.

 

 

총 4회로 구성된 원티드 백엔드 챌린지 중 1회차 정리내용


 

1. CI/CD

- CI: Continuous Integration 지속적인 통합. 어플리케이션의 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트 되어 공유 레포지토리에 통합하는 것(가능하다면 하루에 여러 번)

CI의 핵심 목표: 버그를 신속하게 찾아 해결하고, 소프트웨어 품질을 개선하고, 새로운 업데이트의 검증 및 릴리즈의 시간을 단축시키는 것

 

- CD: Continuous Deployment 지속적인 배포. 공유 레포지토리로 자동으로 Release(배포)하는 것.

즉, CI는 새로운 소스코드의 빌드, 테스트, 병합을 의미하고, CD는 개발자의 변경 사항이 레포지토리를 넘어 고객의 프로덕션 환경까지 릴리즈 되는 것을 의미한다. 소프트웨어가 언제든지 신뢰 가능한 수준의 버전을 유지할 수 있도록 support.

CD를 통해 모든 코드 변경 사항이 테스트를 통과하면 운영 환경에 배포될 준비를 마친다.

 

 


 

2. CI/CD 툴

대표적인 CI/CD 툴로는 젠킨스, Travis CI, Bamboo 등이 있다.

 

ECR: AWS에서 제공하는 도커 컨테이너 이미지를 저장, 관리, 배포할 수 있는 완전 관리형 컨테이너 이미지 레지스트리 서비스이다. 

 

젠킨스도 있는데 왜 도커인가?

- 장단점: 

- 여러 가지 선택지 중 왜 도커를 사용하였는지: 

 

깃헙 액션vs젠킨스

깃헙 액션: 설치할 필요가 없다.

젠킨스: 사내 기존 프로그램, 자료를 사용할 수 있다는 점이 좋음

 


도커 공식 사이트 가이드

https://docs.docker.com/guides/walkthroughs/run-a-container/

 

How do I run a container?

Learn how to build your own image and run it as a container

docs.docker.com

 

노드js 내부 3000포트로 실행되게 되어 있음

근데 외부에서 연결할 때 8089 포트로 연결이 되도록 설정해주는 것

 

연결 완료 이미지

 

 


 

 

- 컨테이너는 뭔가?

 

- 컨테이너는 왜 사용하는가(도커를 왜 많이 사용하는지)?

: 성능을 높이기 위해 애플리케이션을 마이크로서비스 단위로 쪼개고 컨테이너화 시키기 위해...

 

[용어] 프로세스? 스레드?
프로세스: 운영 체제에서 실행 중인 프로그램의 인스턴스이다. 컴퓨터의 CPU 시간과 메모리 자원을 할당받아 실행되며, 최소 하나 이상의 실행 흐름(스레드)을 가진다. 운영 체제는 멀티태스킹을 통해 여러 프로세스를 동시에 관리하고 실행할 수 있다.
"프로그램의 인스턴스"라는 표현은 프로그램이 메모리에 로드되어 실행 상태에 있는 그 실행 중인 복사본을 의미한다. 쉽게 설명하면, 프로그램은 디스크에 저장된 코드와 데이터의 정적인 집합이다. 사용자나 시스템에 의해 실행될 때, 운영 체제는 해당 프로그램의 코드와 데이터를 메모리로 로드하고 실행을 시작한다. 이 때 메모리에 로드되어 실행되는 프로그램을 "인스턴스"라고 부른다.
예를 들어, 텍스트 편집기 프로그램이 하드 드라이브에 저장되어 있을 때는 실행 가능한 코드의 모음일 뿐이다. 사용자가 이 텍스트 편집기를 실행할 때마다, 운영 체제는 프로그램의 복사본을 메모리에 로드하며, 이 로드된 복사본이 바로 "프로그램의 인스턴스"가 된다. 사용자가 여러 창을 열어 동시에 여러 문서를 편집하는 경우, 각 창은 텍스트 편집기 프로그램의 별도 인스턴스로 작동한다.

 

하나의 서버에 여러 개의 인스턴스를 안정적으로 density(밀집) 하기 위해.. , isolation(격리) 하기 위해..

 

스레드: 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 방식을 멀티스레드라고 한다.

 

[용어] kernel - 프로세스

  • 커널과 프로세스는 운영 체제 내에서 밀접하게 연관된 두 요소이다. 커널은 운영 체제의 핵심 부분으로, 하드웨어와 소프트웨어 간의 통신을 관리하며, 시스템 자원과 다양한 컴퓨터 작업을 효율적으로 조정하고 제어한다. 프로세스는 실행 중인 프로그램의 인스턴스로, 커널에 의해 생성되고 관리된다. 이 두 요소의 연관 관계는 다음과 같다
  1. 프로세스 생성과 관리: 커널은 프로세스의 생성, 실행, 중지 및 종료와 같은 생명 주기를 관리한다. 사용자나 다른 프로그램에 의해 프로그램이 실행되면, 커널은 해당 프로그램에 대한 프로세스를 생성하고, 필요한 시스템 자원(예: CPU 시간, 메모리 공간)을 할당한다.
  2. 자원 할당: 커널은 여러 프로세스 간에 하드웨어 자원(CPU, 메모리, I/O 장치 등)을 공정하게 분배한다. 이는 멀티태스킹 환경에서 중요한 역할을 하며, 각 프로세스가 필요한 자원을 효율적으로 사용할 수 있도록 한다.
  3. 프로세스 간 통신: 프로세스들이 서로 정보를 교환하거나 동기화할 필요가 있을 때, 커널은 이러한 통신을 가능하게 하는 메커니즘(IPC: Inter-Process Communication)을 제공한다. 예를 들어, 파이프, 메시지 큐, 공유 메모리 등이 있다.
  4. 보안과 격리: 커널은 프로세스 간의 격리를 유지하여, 하나의 프로세스가 다른 프로세스의 메모리나 자원에 무단으로 접근하는 것을 방지한다. 이는 시스템의 안정성과 보안을 유지하는 데 중요하다.
  5. 스케줄링: 커널은 프로세스 스케줄러를 통해 어떤 프로세스가 CPU를 사용할 차례인지 결정한다. 이는 시스템의 반응 시간과 처리량을 최적화하는 데 중요한 역할을 한다.

충분한 리소스를 각 인스턴스 별로 할당하기 위해...

 

가상머신이 필요해진 이유:

  • 소프트웨어 서비스 장애 -> 효율적으로 사용해야함. 자원을 분리해서 사용
  • ' 가상화'(virtualization) 사용해서 하나의 컴퓨터에서 여러 애플리케이션 구동.
  • 가상화는 원래 있었음 -> VM(Virtual Machine)
  • 하이퍼바이저 가상화는 하드웨어 상에 여러 개의 독립적인 가상 운영 체제(가상 머신)를 실행할 수 있게 해주는 기술이다. 이를 통해 하나의 물리적 컴퓨터 내에서 여러 운영 체제를 동시에 실행할 수 있다. 각 가상 머신은 독립적인 컴퓨팅 환경을 제공받으며, 기본적인 하드웨어 자원(CPU, 메모리, 스토리지 등)은 물리적 호스트 시스템에 의해 가상화된 형태로 할당된다.
  • 하이퍼바이저 가상화의 핵심은 하이퍼바이저라는 소프트웨어에 있다. 하이퍼바이저는 물리적 하드웨어와 가상 머신 사이에서 중재자 역할을 하며, 하드웨어 자원을 가상 머신에게 분배하고, 가상 머신들이 이 자원을 안전하고 효율적으로 사용할 수 있도록 관리한다.
  • 가상화를 통해, 개발자는 다양한 운영 체제 위에서 애플리케이션을 테스트하고, IT 관리자는 서버를 더 효율적으로 활용하여 비용을 절감하며, 보안성이 높은 격리된 환경을 구성할 수 있다. 또한, OS 가상화는 클라우드 컴퓨팅, 재해 복구, 시스템 마이그레이션과 같은 다양한 IT 요구 사항을 충족시키는 데 핵심적인 역할을 한다.

 

운영체제 수준에서 격리를 시키도록 -> 컨테이너 가상화

이미지 상 Docker: 도커 엔진

 

현업에서는 스테이징 환경을 함께 구현하기 위해(도커를 사용해 테스트 환경과 같이 동일하게 맞추어 개발할 수 있기 때문) 하나의 인스턴스만 사용하는 경우에도 도커를 사용한다.

다만, 도커 컨테이너 별로 보안솔루션 비용을 청구하는 경우가 있어 도커를 사용하지 못할 때도 있다.

 

위 이미지에서 각 가상머신(VM)들에는 Guest Operating System이 있다.

이 Guest Operating System을 없애고 각각의 애플리케이션에서 직접 App을 실행한다면 리소스를 덜 사용하고 효율이 좋아질 것이다.

 

리눅스의 핵심 기술 2가지를 사용해 작업하는 것

- Cgroups

  • Cgroups (Control Groups) 예시
    • 예를 들어, 시스템에 여러 컨테이너가 실행 중이고, 각각 다른 애플리케이션이 작동하고 있다고 가정해보자. 여기서 한 컨테이너가 너무 많은 CPU 시간을 사용하여 시스템의 다른 부분에 영향을 미치기 시작한다면, 시스템 관리자는 Cgroups를 사용하여 그 컨테이너의 CPU 사용량을 제한할 수 있다. 예를 들어, cpu.shares 파라미터를 조정하여 특정 컨테이너 그룹이 사용할 수 있는 CPU 자원의 양을 조절할 수 있다. 이는 시스템 자원이 공정하게 분배되도록 보장하고, 한 애플리케이션이 전체 시스템을 점유하는 것을 방지한다.

- 네임스페이스

  • 네임스페이스 (Namespace) 예시
    • 네임스페이스는 시스템 리소스를 격리하여 프로세스 그룹이 해당 리소스를 독립적으로 보고 관리할 수 있게 한다. 예를 들어, PID (Process ID) 네임스페이스를 사용하는 경우, 각 컨테이너는 자체적인 PID 1부터 시작하는 고유한 프로세스 번호 공간을 가지게 된다. 이는 컨테이너 내부에서 실행되는 프로세스가 시스템의 다른 부분이나 다른 컨테이너의 프로세스와 독립적으로 관리될 수 있음을 의미한다. 결과적으로, 컨테이너 내부의 애플리케이션은 자신이 전체 시스템에서 유일하게 실행되고 있는 것처럼 동작할 수 있으며, 이는 보안과 격리를 강화한다.

 

컨테이너 가상화를 통한 컨테이너 내에서의 프로세스들은 각 Process ID가 1부터 시작한다.(=독립적으로 유일하게 실행이 가능하다.)

 

컨테이너 이미지: 도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태(도장처럼 계속 사용이 가능하다.)

예를 들면, 리눅스 종류 중 Ubuntu 이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle 이미지는 Oracle을 실행하는 데 필요한 파일과 실행 명령어, port 정보 등을 모두 가지고 있다.

 

커널모드 및 유저모드와 관련한 포스트 www.linkedin.com/pulse/kernel-mode-v-user-pallab-sarma

 

Kernel mode V$ User mode!!

Kernel mode is generally reserved for the lowest-level, most trusted functions of the operating system. Crashes in kernel mode are catastrophic; they will halt the entire PC.

www.linkedin.com

 

 

이미지 사용해서 빌드->컨테이너가 만들어짐(인스턴스의 개념)->도커가 컨테이너화 되면 데몬을 사용해 실행시킴

docker build + docker pull = docker run 동일

 

 

DockerEngine


  • - 도커 엔진 (Docker Engine): 도커 엔진은 컨테이너를 생성하고 관리하는 기능을 제공하는 클라이언트-서버 형태의 애플리케이션이다. 이는 세 가지 주요 구성 요소로 이루어져 있다:
    1. 도커 데몬: 컨테이너 관리를 위한 백그라운드 프로세스로, 이미지 생성, 컨테이너 실행, 네트워크 설정 등의 작업을 수행한다. 이는 컨테이너의 생성, 실행, 중지와 같은 생명 주기를 관리한다. 또한, 이미지를 빌드하고 저장소에서 이미지를 가져오는 역할을 수행한다. 도커 데몬은 다른 도커 클라이언트의 명령을 수행하기 위해 REST API를 통해 접근할 수 있다.
    2. REST API: 도커 데몬과 통신하는 인터페이스로, 이 API를 통해 다양한 도커 클라이언트가 도커 데몬과 상호작용할 수 있다. 이를 통해 애플리케이션의 배포, 관리, 확장을 위한 다양한 명령을 수행할 수 있다.
    3. CLI 클라이언트: 사용자가 커맨드 라인을 통해 도커 엔진과 상호작용할 수 있게 하는 인터페이스다. 사용자는 이를 통해 컨테이너를 생성하고 관리할 수 있으며, 이미지를 빌드하고 도커 허브 같은 이미지 저장소와 상호작용할 수 있다.

컨테이너 라이프 사이클

1. 컨테이너 생성(Create Container)

- Docker 이미지를 기반으로 컨테이너를 생성한다.

- 컨테이너는 이미지의 인스턴스로, 실행 중인 프로세스 또는 애플리케이션을 포함한다.

Create Container Format
docker create --name <container-name> <image-name>

 

 

레이어(도커 실행 시 아래와 같이 실행되는 명령어들의 집합)

#7 [2/6] WORKDIR /app
#7 DONE 0.1s

#8 [3/6] COPY package*.json ./
#8 DONE 0.0s

#9 [4/6] COPY ./src ./src
#9 DONE 0.0s

#10 [5/6] COPY ./public ./public
#10 DONE 0.0s

#11 [6/6] RUN npm install     && npm install -g serve     && npm run build     && rm -fr node_modules

 

 

면접 질문에 대비하기 어려운 이유 및 면접 대비 팁: 내가 뭘 모르는 지 모르기 때문에 도커 관련 서적 가장 첫 페이지 부분에 면접 질문이 나온다...! 

또 기술(툴)의 공식 사이트 메인페이지에서도 확인이 가능하다.

 


실행중인 컨테이너 확인

$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED       STATUS             PORTS                    NAMES
40d47b729d4b   welcome-to-docker:latest   "docker-entrypoint.s…"   2 hours ago   Up About an hour   0.0.0.0:8089->3000/tcp   jolly_cannon

 

도커 버전 확인

$ docker --version
Docker version 25.0.3, build 4debf41

 

apache 웹 서버 실행

$ docker run --name apa02 -d -p 8080:80 httpd # -d는 백그라운드, 8080은 외부에서 접속할 때 포트, 80은 내부에서 설정해둔 포트

 

위 명령어 터미널에 입력하면 아래와 같은 메시지가 출력되며 apache 웹 서버가 실행된다.

Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
8a1e25ce7c4f: Pulling fs layer
8b0a7c8478f8: Pulling fs layer
4f4fb700ef54: Pulling fs layer
7f8fb0a042e0: Pulling fs layer
91e4b2f2b52a: Pulling fs layer
c78cdbf9617d: Pulling fs layer
7f8fb0a042e0: Waiting
91e4b2f2b52a: Waiting
c78cdbf9617d: Waiting
8b0a7c8478f8: Verifying Checksum
8b0a7c8478f8: Download complete
4f4fb700ef54: Verifying Checksum
4f4fb700ef54: Download complete
8a1e25ce7c4f: Verifying Checksum
8a1e25ce7c4f: Download complete
7f8fb0a042e0: Verifying Checksum
7f8fb0a042e0: Download complete
c78cdbf9617d: Download complete
8a1e25ce7c4f: Pull complete
8b0a7c8478f8: Pull complete
4f4fb700ef54: Pull complete
7f8fb0a042e0: Pull complete
91e4b2f2b52a: Verifying Checksum
91e4b2f2b52a: Download complete
91e4b2f2b52a: Pull complete
c78cdbf9617d: Pull complete
Digest: sha256:374766f5bc5977c9b72fdb8ae3ed05b7fc89060e7edc88fcbf142d6988e58eeb
Status: Downloaded newer image for httpd:latest
fda487ad25eb526c425874ffb0f07ff8e5a3002c3e3d8ac87d08a5a59ffe05d4

 

실행 완료

 

다시 웹 서버 종료

$ docker stop apa02
apa02

 

8081 포트로 접속이 가능한 apa03 컨테이너 실행

$ docker run --name apa03 -d -p 8081:80 httpd
f5702c4e41a25576a0b191149891996afbbf0f12853d465ed37b3e1b40c4f6a3

 

8082 포트로 접속이 가능한 apa04 컨테이너 실행
$ docker run --name apa04 -d -p 8082:80 httpd
445c53c1fc1a35fdd3a333c6039332d2b351f40a3899184d11ab81303db64955

 

8083 포트로 접속이 가능한 apa05 컨테이너 실행
$ docker run --name apa05 -d -p 8083:80 httpd
51f7355fa5888460606244723f4e84288522da78369b040fcc94b5ceb2b551d2

 

실행된 컨테이너 확인 - apa03,apa04,apa05 컨테이너가 정상적으로 실행되고 있다.
$ docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS             PORTS                    NAMES
51f7355fa588   httpd                      "httpd-foreground"       5 seconds ago    Up 5 seconds       0.0.0.0:8083->80/tcp     apa05
445c53c1fc1a   httpd                      "httpd-foreground"       13 seconds ago   Up 13 seconds      0.0.0.0:8082->80/tcp     apa04
f5702c4e41a2   httpd                      "httpd-foreground"       23 seconds ago   Up 22 seconds      0.0.0.0:8081->80/tcp     apa03
40d47b729d4b   welcome-to-docker:latest   "docker-entrypoint.s…"   2 hours ago      Up About an hour   0.0.0.0:8089->3000/tcp   jolly_cannon

 

apa03, apa04, apa05 컨테이너 실행 종료

$ docker stop apa03 apa04 apa05
apa03
apa04
apa05

 

apa03, apa04, apa05 컨테이너 삭제
$ docker rm apa03 apa04 apa05
apa03
apa04
apa05

 

잘 삭제가 되어진 것이 확인된다.

$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                      PORTS                    NAMES
fda487ad25eb   httpd                      "httpd-foreground"       13 minutes ago   Exited (0) 10 minutes ago                            apa02
40d47b729d4b   welcome-to-docker:latest   "docker-entrypoint.s…"   2 hours ago      Up About an hour            0.0.0.0:8089->3000/tcp   jolly_cannon

 

이제 나머지 하나의 httpd 이미지로 실행되고 있는 컨테이너도 삭제해보자.

$ docker stop apa02

apa02
$ docker rm apa02
apa02

 

내려받았던 도커 이미지 확인

$ docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
welcome-to-docker   latest    472874bbeec3   2 hours ago    227MB
httpd               latest    ac45b24b92cc   2 months ago   167MB

httpd 도커 이미지 삭제

$ docker image rm httpd
Untagged: httpd:latest
Untagged: httpd@sha256:374766f5bc5977c9b72fdb8ae3ed05b7fc89060e7edc88fcbf142d6988e58eeb
Deleted: sha256:ac45b24b92cc0527c6af660679d0701f680a6d4214cf5cf9a147f20127d9685e
Deleted: sha256:f05921eb27f3a6477b22284fcb69a1d5be244dd94ddee40700014305c6e7b8f3
Deleted: sha256:6721078d05153c2ea23c831c8b87d437177abca9edafe43f7fcdb405a8ac8430
Deleted: sha256:7c89dd89a4101d1bb42d0eb9d9cf145906c4e574826c3792f7211325362e563a
Deleted: sha256:34fa6dddb40afdba66482396f5e08ad22f646fb4fc9770e5d02dd4c61c18db00
Deleted: sha256:25c712dda17c439dc446a448c708596dbda15aa42f88e99685eda1b25d30b2c0
Deleted: sha256:a483da8ab3e941547542718cacd3258c6c705a63e94183c837c9bc44eb608999

 

도커 이미지도 삭제 완료

$ docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED       SIZE
welcome-to-docker   latest    472874bbeec3   2 hours ago   227MB

728x90