
※ 위 책을 읽고 개념 위주로 정리한 내용임을 알립니다.
Pod, Container, Docker, Kubernetes의 관계
- 파드들은 워커 노드라는 노드 단위로 관리
- 워커 노드와 마스터 노드가 모여서 쿠버네티스 클러스터가 됨
- 파드는 쿠버네티스로부터 IP를 받아서 컨테이너가 외부와 통신할 수 있는 경로를 제공하고
컨테이너들이 정상 작동하는지 확인하고 네트워크나 저장 공간을 서로 공유하게 함 - 파드가 이런 환경을 만들기에 컨테이너들은 마치 하나의 호스트에 존재하는 것처럼 작동 가능
- 정리하면, 컨테이너를 돌보는 것이 파드, 파드를 돌보는 것이 쿠버네티스 워커 노드,
워커 노드를 돌보는 것이 쿠버네티스 마스터 - Container : 이 구조를 이루는 가장 기본,
하나의 운영 체제 안에서 커널을 공유하며 개별적인 실행 환경을 제공하는 격리된 공간 - 개별적인 실행 환경 : CPU, 네트워크, 메모리와 같은 시스템 자원을 독자적으로 사용하도록 할당된 환경
- Docker : 각 컨테이너가 독립적으로 작동하기에 여러 컨테이너를 효과적으로 다루기 위한 방법으로 등장
- 컨테이너를 사용하는 방법을 명령어로 정리한 것으로 보면 됨
- 사용자가 따로 신경쓰지 않아도 컨테이너 생성 시 개별적인 실행 환경 분리 및 자원 할당
Container Image
- 도커와 같은 CRI로 불러와야만 실행 가능
- 컨테이너 삭제 시 이미지와 이미 실행된 컨테이너를 모두 삭제해야 디스크 용량 확보 가능
- 이미지는 registry라는 저장소에 모여 있음
- 도커 허브처럼 공개된 유명 registry일 수도 있고, 내부에 구축한 registry일 수도 있음
Image tag
- 이름이 동일해도 버전이나 플랫폼을 구별하기 위해 사용되는 식별자
- docker pull niginx:stable 처럼 : 을 통해 태그 입력
Image layer
- 애플리케이션과 각종 파일을 담고 있다는 점에서 ZIP과 같은 압축 파일에 더 가까움
- 압축 파일은 파일 개수에 따라 용량이 증가하지만
이미지는 같은 내용일 경우 동일 이미지를 공유하므로 전체 용량이 감소
컨테이너 내부 파일 변경 방법 4가지
docker cp <호스트 경로> <컨테이너 이름>:<컨테이너 내부 경로>
- 호스트에 위치한 파일을 구동 중인 컨테이너에 복사
- 컨테이너에 임시로 필요한 파일이 있을 때 단편적으로 전송하는 방법
- 컨테이너에 저장되어 있는 설정 및 로그를 추출해서 확인하는 목적으로도 사용
Dockerfile ADD
- 이미지는 Dockerfile을 기반으로 만들어지기에
Dockerfile에 ADD라는 구문으로 컨테이너 내부에 복사할 파일을 지정 - 이미지 생성 시 복사되지만 사용자가 원하는 파일을 선택해서 사용할 순 없음
바인드 마운트
- 호스트 파일 시스템과 컨테이너 내부를 연결해서 한쪽의 작업이 양쪽에 적용되도록 하는 방법
- 새로운 컨테이너를 구동할 때도 호스트와 연결할 경로만 지정하면 연동 가능
- DB 데이터 디렉토리나 서버 첨부 파일 디렉토리처럼 컨테이너가 바뀌어도 없어지면 안 되는 자료들 보존 가능
볼륨
- 도커가 관리하는 볼륨을 컨테이너와 연결
- 도커가 관리하는 볼륨 공간을 NFS와 같은 공유 디렉토리에 생성하면
다른 호스트에서도 도커가 관리하는 볼륨을 함께 사용 가능
⭐ volume : 도커가 직접 관리하며 컨테이너에 제공하는 호스트의 공간
Container Image를 만드는 4가지 방법 예시
1. 기본 방법 빌드 : Java 소스 빌드 → Dockerfile 빌드
- OpenJDK 1.8 설치 및 mvnw clean package 명령을 통해 JAR 생성
2. GCR(Google Container Registry) 사용하기
- 기초 이미지를 openjdk에서 GCR에서 제공하는 distroless로 변경하면 더욱 경량화할 수 있음
- 이미지 이름 : gcr.io/distroless/java:8
3. 컨테이너 내부에서 빌드하기
- 번거로운 과정 없이 바로 Java 소스를 컨테이너 이미지에서 빌드하는 방법
- 간편하지만 모든 방법 중 가장 큰 크기의 컨테이너 이미지
4. 최적화해서 컨테이너 빌드하기
- Multi-Stage Build를 사용하는 방법
- 최종 이미지의 용량을 줄일 수 있고 호스트에 어떠한 빌드 도구도 설치할 필요가 없음
- 핵심 : 빌드하는 위치와 최종 이미지를 '분리'하는 것
최종 이미지는 빌드된 JAR를 가지면서도 용량을 줄일 수 있음
'Infrastructure' 카테고리의 다른 글
Kubernetes와 친해지기 (0) | 2022.04.28 |
---|---|
Prometheus & Grafana (0) | 2022.04.28 |
Jenkins (0) | 2022.04.27 |
Kubernetes (0) | 2022.04.25 |
컨테이너 인프라 환경 (0) | 2022.04.25 |