개발 기술 블로그

Docker 자원 소비 제어 (CPU, Memory)

  • CPU 자원을 어떤 프로세스(컨테이너)에 얼마나 할당하는지를 정책으로 만드는 것을 CPU스케쥴링 이라고 한다.
  • CPU 사용량 제한을 위해 CFS(Completely Fair Scheduler) 스케쥴러를 사용한다.
    • 말그대로 모든 프로세스가 공평하게 CPU 사용시간을 제공 받로고 하는 OS 알고리즘이다.

  • 메모리는 프로세스들의 작업 공간이다. Docker HostOS의 총 메모리 양과 작업에 사용될 예상되는 메모리 크기를 사전에 파악하여 메모리 최적화를 유지해야한다.
  • 만일 특정 컨테이너가 과도한 메모리 사용 시 메모리 부족(OOM, out of memory)으로 인해 프로세스, 즉 다른 컨테이너의 예기치 않은 강제 종료가 발생할 수 있다.
    • OOM Killer가 프로세스를 kill하지 못하도록 보호: –oom-kill-disable
  • 특히 컨테이더들의 과도한 메모리 사용으로 인해 Docker Daemon이 커널에 의해 강제 종료되면 전체 컨테이너 서비스들에 영향을 주게 된다.
  • 따라서, Docker HostOS의 메모리 사용량 확인과 컨테이너의 메모리 사용 제한이 중요하다

Dockerfile 작성 가이드

  • 커맨드 기반의 인프라 구성 시 사용자 실수 등의 인적 오류 가능성이 높다
  • APM(Apache + PHP + MySQL)구축을 생각해보자. 설치 순서와 상호 연관성 등을 고려하여 각종 라이브러리, 환경설정 정보, 설치프로그램 요구사항과 함께 복잡한 명령어들을 고민해야한다. → 만일 잘못된 설정이 있다면 수정해야 하고 때론 재설치도 불가피하다.
  • 일련의 과정을 하나의 이미지로 만들고 수정사항은 언제든 코드변경이 용이하다면 우리는 개발업무 목적을 이루는 것에만 온전히 집중 할 수 있을 것이다.
  • IaC는 탄력성, 확장성, 반복성을 가지고 있어 눈송이서버가 아닌 동일환경을 보유한 서버(컨테이너)를 수십\~수백대를 운영,관리하게 해준다.
    • 눈송이서버 → 여러정보가 서로 점점 얽혀가는 서버
  • Docker에서 제공하는 베이스 이미지나 사용자가 공유하는 이미지를 통해 컨테이너를 실행하고 거기에 우리가 필요한 환경설정을 들어가서 하는 경우가 있다.
  • 우리가 개발하는 모드는 컨네이너 환경은 획일적(베이스 이미지)이고 동일하게 움직이지 않고 아이디어에 따라 다양하게 개발된다.
  • 애플리케이션에 적용되는 새로운 환경을 사용자가 직접 정의하여 실현 할 수 있는 것이 바로 코드로서 인프라 환경을 프로비저닝하는 Dockerfile이다.
  • Dockerfile은 코드(github)나 이미지(registry)등 다양한 공유방식을 통해 언제 어디서든 컨테이너로 만들 수 있다.

Jenkins CI/CD

  • credentials plugin: 인증 관련으로 VM환경에서 ssh key, AWS/Git 등에서 token 활용
  • git plugin: GitHub source code 접근을 통한 빌드 수행 지원
  • pipline plugin: CI 구축 플러그인
  • docker plugin & pipeline: Jenkins가 docker를 사용 하게 지원
  • blue/ocean plugin: CD pipeline의 시각화지원 구조 파악에 용이
  • Amazon EC2 plugin: EC2 인스턴스 스케일링 가능한 빌드 클러스터 구성 지원
  • Metric plugin: Metric(지표) 측정을 위한 Java library 제공
  • 용도에 맞게 plugin을 조합하여 원하는 CI/CD 자동화를 구성하는 것
  • Pipeline은 자동화 순서를 정의한 스크립트 언더
  • Declarative(선언적), Scripted pipeline 구성 방식이 있음
  • -

컨테이너 격리 (pivot_root)

chroot로 생성한 격리공간에는 다음과 같은 단점이 있었다.

  1. 탈옥이 가능하다.
  2. 완전한 격리가 불가능하다. (Host의 filesystems, network 등에 접근 가능)
  3. root 권한 사용 가능하다.
  4. host의 자원을 무제한으로 사용할 수 있다.

pivot_root란 root 파일시스템의 마운트 포인트를 변경함으로써 특정 디렉토리를 새로운 루트 디렉토리로 만드는 명령어이다.

앞서 chroot로 만든 격리공간은 root 파일시스템이 동일하였기 때문에 탈옥이 가능했던 한편, pivot_root를 이용하면 root 파일시스템의 마운트 포인트 자체가 변경되기 때문에 탈옥 자체가 불가능하다.

Java Entity, DTO, VO 개념과 차이점

Entity 클래스는 실제 DB의 테이블과 1:1로 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들만을 필드로 가지는 객체입니다.

Entity는 데이터베이스 영속성(persistent)의 목적으로 사용되는 객체로 setter 메서드의 사용을 되도록 금지 해야 합니다. setter로 접근이 가능해지면 변경되지 않는 인스턴스에 대해서도 접근이 가능해집니다.

Entity는 Constructor(생성자) 또는 Builder를 사용합니다.

Java OOP(객체 지향 프로그래밍) 개념

OOP (Object-Oriented Programming)이란 객체 지향적인 프로그래밍. 즉, C언어같은 절차 지향적인 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것이다.

  • OOP는 객체의 관점에서 프로그래밍 하는 것을 의미한다.
  • C언어는 절차 지향 프로그래밍인데, 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는 것을 말한다.
  • OOP는 절차지향에 비해서 사람의 사고방식과 더 가깝다.
  • OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다.
  • 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말한다.
  • Object란 말을 번역하여 객체란 말을 썼는데 Object의 사전적 의미는 아래와 같다
  1. 명사 물건, 물체 (→UFO)
  2. 명사 욕망, 연구, 관심 등의 대상 (→sex object)
  • NOUN a thing that you can see and touch and that is not alive
  • NOUN someone or something that makes you feel a specified emotion
  • 영어의 정의를 요약하여 말하면 어떤 네가 인식하거나 특별하게 생각하는 물질(누구, 것)이라 말할 수 있다
  • 즉, 하나의 형태를 가지기위한 목적(Object)을 기반(Oriented)한 프로그래밍 곧 OOP이다
  • 캡슐화(Encapsulation)
    • 캡슐화란
    • 하나의 객체에 대해 그 객체가 특정한 목적에 해당하는 필요한 변수나 메소드를 하나록 묶는것
    • 클래스를 만들때 이 객체가 특정한 목적을 잘 수행 할 수 있도록 변수와 메서드를 관련성 있게 구성해야한다
    • 정보은닉
    • 캡슐을 까기 전까지 내용이 무었인지 모르는 것 처럼 캡슐화를 하는 중요한 목적은 바로 정보은닉이다.
    • 안에서만 접근할 수 있게 private로 선언하여 접근을 제한하여야한다.
    • 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적이다.(보호된 변수가 변경 될 수 있는 setter도 아무생각 없이 만들면 안된다.)

참고