본문 바로가기
IT/Docker & Kubernetes

Docker Final - Docker Compose & Advance

by 스마일엔지니어 2025. 1. 7.

-Depend-on: 서비스간 의존성 확인

 

-Health-Check: 서버가 정상적으로 작동하는 지 상태확인, 내 서비스가 정상적으로 운영중인가? 판단 // n초마다 test 진행하여 m번 이상(time window - 구간) 응답이 없는 경우 -> 지정된 방법(재실행, 삭제)에 의해 처리

+ time window - 이 서비스가 구동되기 위해 필요한 시간을 정의

 

1. Liveness Probe: 이 컨테이너가 정상적으로 살아있는가 (running) 확인 -> 재생성(재부팅)

2. Readiness Probe: 이 컨테이너가 정상적으로 실행할 수 있는 가 확인 -> LB 통해서 해당 서버로 추가적인 업무 배정 X

3. Startup Probe: 서비스가 구동되기 위해 필요한 시간 

 

 

*정리

 

1. DOCKER

 

Docker                                    ------->              Docker Compose                

(Container)                                                           (Project)

 

-Container사용목적: 서비스(App)를 사용 -> 사용 편의성 (추상화)<Repository>:<Tag>(태그는 변경 가능)    /   <Repository>@digest(주민번호, 변경이 불가능한 고윳값)

 

컨테이너는 이미지로 구동이미지: 레이어의 조합

Layer N     (Read Only) docker run
----->
  Container Layer (Read Write)
. Layer N
. ...
Layer 2      (Read Only) Layer 2
Layer 1      (Read Only) Layer 1
Base Image Base Image

 

이미지를 만들기 위해선? Dockerfile(=명세서) 생성 ---->(docker build) 통해 생성

Docker file (라인 하나하나가 레이어, 그리고 캐시 유의!! 캐시 효율적 사용 -> 최적화)
FROM                 내가 수정/변경을 시작할 이미지
ARG                   이미지 제작하는 과정에서 사용되는 변수 (빌드 시)

ENV                    컨테이너 실행하는 과정에서 사용되는 변수 -> 레이어로서 작동

RUN                이미지 제작하는 과정에서 실행할 명령어
CMD               앱 또는 서비스를 실행하기위해 사용되는 명령어
Entrypoint     CMD는 인자(Argument)로서 사용, Entrypoint는 진입점 (변경불가 Executable)
ADD               파일 또는 이미지를 복사할 때 사용
COPY             ADD는 REMOTE 파일 복사할 때 사용, COPY는 로컬 파일 및 내가 아닌 다른 이미지에서 파일을 복사할 때                           COPY -> (멀티빌드 스테이지)

 

-Multi Stage Build: FROM으로 구분되는 단락

-> 하나의 dockerfile에서 FROM이 여러 번 쓰인다.

-> run-time dependency && build-time dependency가 다른 경우

build-time dependency -> 이미지 생성 시: gcc 컴파일러, go 언어

run-time dependency   ->  binary 파일을 실행: X

 

-docker build

: -f path/filename -t <repository>:<tag> . (context, dockerfile에 적힌 상대 경로를 해석할 때 사용)

./src -> 상대경로 (.으로 시작)

/etc/src -> 절대경로

 

-컨테이너 -> 격리 (kernel, network, storage, resource ...)

Container Layer (Read Write)
Layer N
...
Layer 1
Base Image

 

컨테이너는 메인 프로세스가 실행중이어야 RUNNING / 종료될 경우 컨테이너는 EXIT

Attach Exec
Main Process의 STDIN, STDOUT, STDERR
(PID = 1)
Main Process에서 실행 X
(PID ≠ 1)
Stop&Start 통해 재부팅한 경우 부활 X (유실됨)

 

호스트는

통신 (Network)

공유 (Volume)

공개 (publish / expose)

 

-Volume: 컨테이너 가 아닌 외부에 파일을 저장 및 관리

docker run -v src:dest

 

docker volume은 2가지 종류!

1. host file system (bind)   src = 경로(상대,절대 경로) - 일부 연결

2. docker volume (mount) src = 파일명 - 통째로 연결

 

-Network: 컨테이너 하나 사용할 게 아니라 컨테이너들로 구성된 서비스를 이용하기 위해서

             -> 서비스 간 통신/불통신을 따지기 위해서 

 

네트워크의 드라이버

1. host : 컨테이너가 내 호스트의 네트워크를 사용중 (호스트=나, 네트워크 격리 X)

2. bridge : 일종의 VPC, 자기만의 네트워크 영역 (CIDR, 게이트웨이) 존재  LIKE 공유기

3. none (isolated) : 모든 트래픽이 막혀 있고 통신이 불가능

 

--publish (-p)    외부공개 --expose     내부공개
host를 포함한 내가 속한 네트워크가 아닌 곳에서의 접근 내가 속한 네트워크 안에서 접근
(나와 같은 네트워크 내 누군가에게)

 

도커는 항상 기본 전제조건 자체가 나 혼자, 서로 격리 !!!

이와 달리 도커컴포즈는 디폴트로 같은 네트워크를 공유

그래서 도커에서는 expose를 쓸 일이 많이 없고 컴포즈에서 많이 사

2. DOCKER COMPOSE

: ∑서비스 -> 컨테이너들을 유기적으로 연결 + 운영 및 관리

 

**yaml 파일 작성법 매우 중요!!!

 

Docker-Compose.yaml (명세서)
1. version: 3.8  (참조용, 주석)
2. name: (프로젝트의 이름, 없는 경우 디렉토리 이름 사용)

<프로젝트의 이름 우선순위, 가급적이면 1~2안에서 손보기!!>
1. CLI 통해 제공된 이름 (docker compose -p 이름)
2. yaml 파일에 작성된 이름
3. 내가 실행한 working directory의 이름
3. services: (필수값)
    서비스 이름:
       image: <repo>:<tag> / <repo>@digest
       
       # 이미지와 다음으로 젤 중요한 것 바로 통신!!
       expose:
       ports:                내가 공개할 포트 : 요청받을 포트

       # 실행할 때 필요한 것 환경변수
       environment:
       env.file:

       환경 변수의 우선 순위: environment > env.file 가장 마지막으로 쓴거 (아래에 있는 거) > 도커 파일에 있는 거

       # 서비스 구동을 위한 명령어
       command:
       entrypoint: 도커 파일의 entrypoint와 달리 변경가능하나, 가급적이면 X
                         바꿀 시, 기존 entrypoint 대체 + 기존 CMD 폐기 // CMD는 바꿀 시 기존꺼 대체

       # 운영 및 관리 측면
       pull_policy: 외부에서 이미지를 가져오는 것
      1. Always: 항상 새로 가져옴 (해당 컨테이너 실행할 필요가 있을 때)

      2. Never: 이미지를 절대 가져오지 않음
      3. Missing: 이미지가 없는 경우 가져옴 (default) // 새로운 서버에서 이미지 보기 가능
      4. Build: 이미지를 즉석에서 제조해서 사용 (개발 목적)

       restart: 서버가 꺼졌을 때 어떤 식으로 행동하는가
      1. No (default) : 서버 꺼지든 말든 신경 X, 부활 X
      2. Always : 정상이든 아니는 항상 되살려주기
     3. On-failure : 정상이면 손대지말기, 에러나면 재실행 
     4. Unless-stopped : 종료/삭제 제외하고는 재실행

      volumes:
            <key>:
            - <name>:<dest>[:ro or rw]  # access mode
            - <path>:<dest>[:ro or rw]  # 경로는 꼭 슬래쉬(/) 넣을 것!!  여기까지 short 
            - type: bind or mount
            - source: <name> or <path>
            - target: <dest>
     
     networks:
           - <key1>:
           - <key2>:     # 리스트 방식 (사용할 네트워크를 나열)

           key1:
              aliases:
                   -web  # map 방식, dns는 도커 컴포즈에서 서비스 이름, 컨테이너 id, 컨테이너 이름{프젝}_{서비스}_{번호/index}
                            # 서비스 이름이 가장 중요한데, 서비스에는 이를 구성하는 모든 컨테이너에 이름이 할당해 있어
                            # 따라서 도커 컴포즈에서 alias를 쓸 이유가 없음!!   서비스이름을 호출할건데 일을 또하는거나 마찬가지
        

4. volumes: 
          
<key>:  (서비스 호출할 때 사용되는 이름)
               name:  (docker volume create name에서 생성되는 name이 이 name)
               external:   true/false  (기존에 생성한 것 사용할 것인가?)

# config와 secret은 일종의 volume이라 생각하면 되고, 도커 컴포즈에서 그리 엄청 쓰이진 않다.
# config - root directory , secret - /var/secret 에 저장되고 암호화 유무의 차이 (config x, secret o)
# 쿠버네티스에선 엄청 쓰임
5. networks:
          <key>:
               name:  
               external:   true/false
         

 

'IT > Docker & Kubernetes' 카테고리의 다른 글

Kubernetes - Label, Namespace, Probe, Replicas  (0) 2025.01.09
Kubernetes - Baseline  (0) 2025.01.09
Docker Compose  (0) 2025.01.06
Docker - Muliti-Builds & Docker Compose  (1) 2025.01.03
Docker Image II - Volume & Network & Buildx  (1) 2025.01.02