글 검색

공개된 글의 제목과 본문을 검색합니다.

    닫기 Esc

    4.1 도커를 알아야 하는 이유#

    • 쿠버네티스를 이루는 기본 오브젝트가 파드고, 파드는 컨테이너로 이루어져 있으며, 컨테이너를 만들고 관리하는 도구가 도커이기 때문
    • 하지만 최근엔 도커를 몰라도 쿠버네티스를 사용하는게 가능해짐
    • 하지만 쿠버네티스를 이루고 있는 기술 자체는 컨테이너를 벗어날 수 없는 만큼 트러블 슈팅을 하기위해서 컨테이너를 알고 있어야 함

    4.1.1 파드, 컨테이너, 도커, 쿠버네티스의 관계#

    쿠버네티스 클러스터의 구조
    쿠버네티스 클러스터의 구조
    쿠버네티스, 파드 그리고 컨테이너 간의 연결 구조
    쿠버네티스, 파드 그리고 컨테이너 간의 연결 구조
    • 파드는 쿠버네티스로부터 IP를 받아 컨테이너가 외부와 통신할 수 있는 경로를 제공
    • 쿠버네티스 마스터 역시파드로 이루어져 있음
    • 컨테이너는 하나의 운영 체제 안에서 커널을 공유하며 개발젹인 실행 환경을 제공하는 격리된 공간
      • 개별적 환경이란 CPU, 네크워크, 메모리 같은 자원을 독자적으로 사용하도록 할당된 자원
    • 각 컨테이너가 독립적으로 작동하기 때문에 컨테이너를 효과적으로 다룰 방법이 필요했음
      • 파일을 설정하고, 자원과 공간을 관리하는 등 복잡한 과정을 수행하는 과정을 간편하게 만든도구가 바로 도커!

    4.1.2 다양한 컨테이너 관리 도구#

    • 도커 이외에도 다양한 컨테이너 관리도구들이 존재함
    구분컨테이너디크라이오카타 컨테이너도커
    명령어 도구별도 지원타 도구 사용자체 지원자체 지원
    내부 구조단순매우 단순복잡복잡
    확장성좋음좋지 못함좋지 못함매우 좋음
    컨테이너 관리좋음좋음좋음매우 좋음
    이미지 관리좋음좋음좋음매우 좋음
    보안성좋음좋음매우 좋음좋음
    자원 사용량매우 좋음매주 좋음좋지 못함좋음
    정보량적음거의 없음거의 없음매우 많음

    결론? 정보 많은 도커가 짱짱이다!

    4.2 도커로 컨테이너 다루기#

    4.2.1 컨테이너 이미지 알아보기#

    이미지 검색하고 내려 받기#

    • 태그 : 태그 이름을 통해 이미지를 내려받을 때 사용한 태그를 알 수 있음
      • latest는 가장 최신 이미지를 의미
    • 레이어 : pull을 수행해 내려받은 레이어
      • 하나의 이미지는 여러 개의 레이어로 이루어져 있음
    • 다이제스트 : 이미지의 고유 식별자, 이미지에 포함된 내용과 이미지 생성 환경등 식별
      • 다이제스트는 고유한 값 이미지의 이름이나 태그가 다르더라도 다이제스트가 동일하면 같은 이미지
    • 상태 : 이미지를 내려받은 레지스트리, 이미지, 태그 등의 상태 정보

    이미지 태그#

    이미지 태그를 통해서 동일한 이미지의 버전이나 플랫폼 등을 구분할 수 있음

    이미지의 레이어 구조#

    • 컨테이너는 각종 파일을 담고 있다는 점에서 ZIP과 같은 압축파일에 가깝다고 할 수 있음
    • 이미지는 같은 내용일 경우 여러 이미지에 동일한 레이어를 공유
      • 전체 용량 감소

    4.2.2 컨테이너 실행#

    shell
    docker run -d --restart always nginx
    단순한 이미지 실행

    책에도 여러 방법이 소개 되지만 가장 좋은 방법은 공식 문서를 참고하기!

    4.2.3 컨테이너 내부 파일 변경하기#

    구분docker psDockerfile ADD바인드 마운트볼륨
    컨테이너 적용구동 중 복사이미지 생성 시 복사구동시 디렉터리 연결구독 시 도커의 볼륨 연결
    파일 보관 위치컨테이너 내부컨테이너 내부호스트(디렉터리)호스트(도커 볼륨)
    주 활용 용도임시 파일컨테이너 생성시 필요한 파일보존이 필요한 파일보존이 필요한 파일
    관리 편의성좋지 못함좋음좋음매우 좋음
    파일 보존성좋지 못함좋음매우 좋음매우 좋음

    바인드 마운트 혹은 볼륨이 가장 효과적인 방법

    4.2.4 사용하지 않는 컨테이너 정리하기#

    • 사용이 끝나고 더 이상 사용하지 않을 컨테이너라면 공간을 확보하기 위해 삭제하는 편이 좋음
    • 컨테이너 삭제 전 컨테이너를 정지해야 함
    shell
    docker stop <Container ID / Conainer Name>
    docker rm <Container ID / Conainer Name> --force
    • force 옵션의 경우 강제 삭제
      • 오류가 발생할 수 있으니 주의

    4.3 4가지 방법으로 컨테이너 이미지 만들기#

    컨테이너 이미지 생성방법
    컨테이너 이미지 생성방법

    4.3.1 기본 방법으로 빌드#

    docker
    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" ]
    • 일반적으로 gadle 혹은 maven을 통해서 프로젝트를 빌드 한 후 도커 파일에 빌드 파일의 path를 맞춘후 빌드

    docker가 외부와 연결되는 방법#

    • 도커는 172.17.0.0/16 범위에서 IP를 할당 받음
    • 컨테이너는 네트워크 어댑터(0.0.0.0)를 통해서 특정 포트로 들어오는 요청을 내부로 전달하도록 설정
    • 반면 localhost와 같은 내부 IP에서 컨테이너 내부로 요청을 전달할 경우 docker-proxy 프로세스가 컨테이너 내부로 요청을 전달함

    4.3.2 컨테이너 용량 줄이기#

    docker
    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" ]
    • 자바 실행을 위하 가볍게 설계된 이미지를 사용한다.

    4.3.3 컨테이너 내부에서 컨테이너 빌드하기#

    docker
    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" ]
    • 별도로 빌드하는 과정이 없어서 간편하게 도커만드로 빌드가 가능하다.
    • 하지만 도커 이미지가 매우커지기 때문에 좋은 방법은 아님

    4.3.4 최적화해 컨테이너 빌드하기#

    docker
    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 --from=int-build inbuilder/target/app-in-host.jar /opt/app-in-image.jar
    WORKDIR /opt
    ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
    • 멀티스테이지를 이용한 도커 빌드
      • 멀티스테이지는 docker-ce 17.06 버전부터 지원함
    • 앞서 Dockerfile 하나만 가지는 간편한 빌드 방법을 따르면서 가벼운 이미지를 만들어냄
    • 멀티스테이지의 핵심은 빌드 위치와 최종 이미지를 분리하는 것
      • 이름이 없는 이미지를 댕글링 이미지라 함

    4.4 쿠버네티스에서 직접 만든 컨테이너 사용하기#

    4.4.1 쿠버네티스에서 도커 이미지 구동하기#

    4.4.2 레지스트리 구성하기#

    • 호스트에서 생성한 이미지를 쿠버네티스에서 사용하려면 모든 노드에서 공통으로 접근하는 레지스트리가 필요
    • 직접 만든 이미지가 외부에 공개되기를 원하지 않는 경우엔 사설 레지스트리를 만들거나 유료 레지스트리를 이용할 수 있음
    구분키하버넥서스 리포지터리도커 레지스트리
    가격유/무료무료유/무료무료
    저장 형식도커 이미지, 헬름도커 이미지, 헬름다양함도커 이미지
    설치 방법직접 설치, 클라우드직접 설치직접 설치직접 설치
    기능부가 가능 있음부가 가능 있음매우 많음최소
    관련 자료적음보통많음많음
    전체 글 둘러보기