4.1 도커를 알아야 하는 이유
•
쿠버네티스를 이루는 기본 오브젝트가 파드고, 파드는 컨테이너로 이루어져 있으며, 컨테이너를 만들고 관리하는 도구가 도커이기 때문
•
하지만 최근엔 도커를 몰라도 쿠버네티스를 사용하는게 가능해짐
•
하지만 쿠버네티스를 이루고 있는 기술 자체는 컨테이너를 벗어날 수 없는 만큼 트러블 슈팅을 하기위해서 컨테이너를 알고 있어야 함
4.1.1 파드, 컨테이너, 도커, 쿠버네티스의 관계
쿠버네티스 클러스터의 구조
쿠버네티스, 파드 그리고 컨테이너 간의 연결 구조
•
파드는 쿠버네티스로부터 IP를 받아 컨테이너가 외부와 통신할 수 있는 경로를 제공
•
쿠버네티스 마스터 역시파드로 이루어져 있음
•
컨테이너는 하나의 운영 체제 안에서 커널을 공유하며 개발젹인 실행 환경을 제공하는 격리된 공간
◦
개별적 환경이란 CPU, 네크워크, 메모리 같은 자원을 독자적으로 사용하도록 할당된 자원
•
각 컨테이너가 독립적으로 작동하기 때문에 컨테이너를 효과적으로 다룰 방법이 필요했음
◦
파일을 설정하고, 자원과 공간을 관리하는 등 복잡한 과정을 수행하는 과정을 간편하게 만든도구가 바로 도커!
4.1.2 다양한 컨테이너 관리 도구
•
도커 이외에도 다양한 컨테이너 관리도구들이 존재함
구분 | 컨테이너디 | 크라이오 | 카타 컨테이너 | 도커 |
명령어 도구 | 별도 지원 | 타 도구 사용 | 자체 지원 | 자체 지원 |
내부 구조 | 단순 | 매우 단순 | 복잡 | 복잡 |
확장성 | 좋음 | 좋지 못함 | 좋지 못함 | 매우 좋음 |
컨테이너 관리 | 좋음 | 좋음 | 좋음 | 매우 좋음 |
이미지 관리 | 좋음 | 좋음 | 좋음 | 매우 좋음 |
보안성 | 좋음 | 좋음 | 매우 좋음 | 좋음 |
자원 사용량 | 매우 좋음 | 매주 좋음 | 좋지 못함 | 좋음 |
정보량 | 적음 | 거의 없음 | 거의 없음 | 매우 많음 |
결론? 정보 많은 도커가 짱짱이다!
4.2 도커로 컨테이너 다루기
4.2.1 컨테이너 이미지 알아보기
이미지 검색하고 내려 받기
•
태그 : 태그 이름을 통해 이미지를 내려받을 때 사용한 태그를 알 수 있음
◦
latest는 가장 최신 이미지를 의미
•
레이어 : pull을 수행해 내려받은 레이어
◦
하나의 이미지는 여러 개의 레이어로 이루어져 있음
•
다이제스트 : 이미지의 고유 식별자, 이미지에 포함된 내용과 이미지 생성 환경등 식별
◦
다이제스트는 고유한 값 이미지의 이름이나 태그가 다르더라도 다이제스트가 동일하면 같은 이미지
•
상태 : 이미지를 내려받은 레지스트리, 이미지, 태그 등의 상태 정보
이미지 태그
이미지 태그를 통해서 동일한 이미지의 버전이나 플랫폼 등을 구분할 수 있음
이미지의 레이어 구조
•
컨테이너는 각종 파일을 담고 있다는 점에서 ZIP과 같은 압축파일에 가깝다고 할 수 있음
•
이미지는 같은 내용일 경우 여러 이미지에 동일한 레이어를 공유
◦
전체 용량 감소
4.2.2 컨테이너 실행
docker run -d --restart always nginx
Shell
복사
단순한 이미지 실행
책에도 여러 방법이 소개 되지만 가장 좋은 방법은 공식 문서를 참고하기!
4.2.3 컨테이너 내부 파일 변경하기
구분 | docker ps | Dockerfile ADD | 바인드 마운트 | 볼륨 |
컨테이너 적용 | 구동 중 복사 | 이미지 생성 시 복사 | 구동시 디렉터리 연결 | 구독 시 도커의 볼륨 연결 |
파일 보관 위치 | 컨테이너 내부 | 컨테이너 내부 | 호스트(디렉터리) | 호스트(도커 볼륨) |
주 활용 용도 | 임시 파일 | 컨테이너 생성시 필요한 파일 | 보존이 필요한 파일 | 보존이 필요한 파일 |
관리 편의성 | 좋지 못함 | 좋음 | 좋음 | 매우 좋음 |
파일 보존성 | 좋지 못함 | 좋음 | 매우 좋음 | 매우 좋음 |
바인드 마운트 혹은 볼륨이 가장 효과적인 방법
4.2.4 사용하지 않는 컨테이너 정리하기
•
사용이 끝나고 더 이상 사용하지 않을 컨테이너라면 공간을 확보하기 위해 삭제하는 편이 좋음
•
컨테이너 삭제 전 컨테이너를 정지해야 함
docker stop <Container ID / Conainer Name>
docker rm <Container ID / Conainer Name> --force
Shell
복사
•
force 옵션의 경우 강제 삭제
◦
오류가 발생할 수 있으니 주의
4.3 4가지 방법으로 컨테이너 이미지 만들기
컨테이너 이미지 생성방법
4.3.1 기본 방법으로 빌드
FROM openjdk:8
LABEL description="Echo IP Java Application"
EXPOSE 60431
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
•
일반적으로 gadle 혹은 maven을 통해서 프로젝트를 빌드 한 후 도커 파일에 빌드 파일의 path를 맞춘후 빌드
docker가 외부와 연결되는 방법
•
도커는 172.17.0.0/16 범위에서 IP를 할당 받음
•
컨테이너는 네트워크 어댑터(0.0.0.0)를 통해서 특정 포트로 들어오는 요청을 내부로 전달하도록 설정
•
반면 localhost와 같은 내부 IP에서 컨테이너 내부로 요청을 전달할 경우 docker-proxy 프로세스가 컨테이너 내부로 요청을 전달함
4.3.2 컨테이너 용량 줄이기
FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60432
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
•
자바 실행을 위하 가볍게 설계된 이미지를 사용한다.
4.3.3 컨테이너 내부에서 컨테이너 빌드하기
FROM openjdk:8
LABEL description="Echo IP Java Application"
EXPOSE 60433
RUN git clone https://github.com/iac-source/inbuilder.git
WORKDIR inbuilder
RUN chmod 700 mvnw
RUN ./mvnw clean package
RUN mv target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
•
별도로 빌드하는 과정이 없어서 간편하게 도커만드로 빌드가 가능하다.
•
하지만 도커 이미지가 매우커지기 때문에 좋은 방법은 아님
4.3.4 최적화해 컨테이너 빌드하기
FROM openjdk:8 AS int-build
LABEL description="Java Application builder"
RUN git clone https://github.com/iac-source/inbuilder.git
WORKDIR inbuilder
RUN chmod 700 mvnw
RUN ./mvnw clean package
FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60434
COPY inbuilder/target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
•
멀티스테이지를 이용한 도커 빌드
◦
멀티스테이지는 docker-ce 17.06 버전부터 지원함
•
앞서 Dockerfile 하나만 가지는 간편한 빌드 방법을 따르면서 가벼운 이미지를 만들어냄
•
멀티스테이지의 핵심은 빌드 위치와 최종 이미지를 분리하는 것
◦
이름이 없는 이미지를 댕글링 이미지라 함
4.4 쿠버네티스에서 직접 만든 컨테이너 사용하기
4.4.1 쿠버네티스에서 도커 이미지 구동하기
4.4.2 레지스트리 구성하기
•
호스트에서 생성한 이미지를 쿠버네티스에서 사용하려면 모든 노드에서 공통으로 접근하는 레지스트리가 필요
•
직접 만든 이미지가 외부에 공개되기를 원하지 않는 경우엔 사설 레지스트리를 만들거나 유료 레지스트리를 이용할 수 있음
구분 | 키 | 하버 | 넥서스 리포지터리 | 도커 레지스트리 |
가격 | 유/무료 | 무료 | 유/무료 | 무료 |
저장 형식 | 도커 이미지, 헬름 | 도커 이미지, 헬름 | 다양함 | 도커 이미지 |
설치 방법 | 직접 설치, 클라우드 | 직접 설치 | 직접 설치 | 직접 설치 |
기능 | 부가 가능 있음 | 부가 가능 있음 | 매우 많음 | 최소 |
관련 자료 | 적음 | 보통 | 많음 | 많음 |