-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 |