개발자의 오르막

[Udemy] - Docker & Kubernetes 실전 가이드 후기 본문

카테고리 없음

[Udemy] - Docker & Kubernetes 실전 가이드 후기

계단 2024. 4. 3. 16:04

 
 

개요

글또를 진행하던 도중 Udemy에서 강의 쿠폰을 받게 되어 후기를 작성하게 되었다. 원래 알고 즐겨쓰던 강의사이트였지만 글또를 통해 다시 한번 강의를 듣게되니 반가운 마음이 들었다.
 
udemy 는 여타 다른 강의사이트와 확연하게 차별화되는 부분은 바로 외국인의 강의가 엄청 많다는 점이다. 만일 java 나 Spring 의 경우라면 인프런이나 패스트캠퍼스 등 국내 인터넷 강의사이트에도 컨텐츠가 넘칠만큼 많지만, Docker, Kubernetes, Golang, Mongodb 등 카테고리가 조금만 벗어나게 되면 인터넷 강의의 숫자가 확연하게 줄어든다.
 
그리고 있더라도 처음 도입 부분에 대한 내용을 다루거나, 중복되는 내용이 많다. 컨텐츠의 절대적인 숫자가 적어 어쩔수가 없는 현실이다. 심지어 Golang 같은 경우는 카테고리 자체가 존재하지 않는 경우가 더러 있다… ㅠㅠ
 
 

https://www.udemy.com/courses/search/?src=ukw&q=golang

 
 
그러나 udemy 의 경우에는 이처럼 강의의 절대적인 숫자가 많다보니, 품질이 높은 강의 또한 존재한다.
 
 

 
이처럼 번역된 언어같은 경우 기재를 해놓는데, 번역 자막 자체가 있다는 것은 그만큼 자막의 품질이 보증되어있다는 것을 의미한다. 저같은 경우 한국어 자막을 볼 때 강의를 시청하는데 있어서 불편함이 없을 정도였다.
 
이번에 선택한 강의는 아래와 같다.
 

https://www.udemy.com/course/docker-kubernetes-2022/?couponCode=ST13MT40224

 
 

https://www.udemy.com/course/docker-kubernetes-2022/?couponCode=ST13MT40224

 
 
강의의 커리큘럼만 봐도 총 길이 23 시간 24분, 261개의 강의만 봐도 정말 내용이 많은 것을 알 수 있다. 그러나 인기가 많은 강의이다보니 자세하고 친절하게 설명되어 있고, 실습을 병행할 수 있다.
 
실습은 Node.js + MongoDB 결합의 형태로 이루어지는데, 저같은 경우는 Golang 기반으로 간단하게 짜봐서 같이 실습을 진행했다. Docker 의 기능을 확인하는 것이 주된 강의 목적이다 보니 Node.js 에 대한 배경지식은 없어도 괜찮았다.
 

 

데이터관리 및 볼륨으로 작업하기


강의에서 강사님은 먼저 Image 를 통해 Docker Container 의 구조를 설명해준다. (이미지는 저작권 문제로 Skip 한다.)
이번 주제에서도 우리가 사용하는 데이터를 먼저 개념적으로 분류한다.

데이터의 종류

  • 도커 이미지 (코드)
    • 이미지를 빌드할 때 코드가 이미지에 복사됩니다. 이미지가 복사되면 코드는 고정됩니다.
    • 이미지는 읽기 전용이기 때문에 실행 중 코드는 변하면 안됩니다. (불변)
  • 임시데이터
    • 사용자가 들어와 입력한 데이터
  • 영구 데이터
    • ex) 사용자 회원 정보 데이터
    • 영구 데이터는 파일이나 데이터베이스에 저장된다.
    • container 의 stop 이나 restart 로 인해 데이터가 소실되면 안된다.
    • conatiner 나 volume 에 저장된다.

도커의 데이터 쓰는 방식

  • 이미지가 아닌 컨테이너에 저장된다는 것은 부가(extra) 레이어에 대해 이야기하는 것
  • 이 레이어는 실제 컨테이너를 구성합니다.
  • 이미지의 파일 시스템을 인식하며, 복사하지 않고 파일을 미러링하는 로직입니다.
  • 도커는 read-write 권한을 가지며, 파일의 시스템을 조작할 수 있습니다.
  • 이미지 자체는 변경하지 않은 채 부가레이어에서 변경합니다.
  • 도커는 컨테이너의 변경 사항을 추적하고, 이미지와 파일 시스템을 가져와 최종 파일 시스템을 파생시켜 read-write 레이어에 저장된 변경 사항과 결합시킵니다.
  • 컨테이너 내부에 쓰여진 데이터는 컨테이너 자체가 삭제되지 않는 이상 컨테이너에 유지된다.

 

볼륨이란?

  • 호스트 머신의 폴더, 호스트 컴퓨터에 장착된 하드 드라이브에 존재하며, 컨테이너로 매핑된 것을 의미
  • COPY
    • 실제로 복사하도록 명령한 스냅샷을 가져와 파일과 폴더를 이미지에 복사하는 것이 전부
    • 지속적인 관계나 연결이 없으며, 이미지에 복사되는 일회성 스냅샷일 뿐
  • VOLUME
    • 컨테이너 내부의 폴더를 호스트 머신 상의 컨테이너 외부 폴더에 연결할 수 있음
    • 두 폴더의 변경 사항은 동기화됨
    • 볼륨은 컨테이너가 종료된 경우에도 지속되며 계속 존재함

 

볼륨을 설정하는 방법

  • Dockerfile 에 VOLUME 명령어를 추가하는 방법
    • 익명 볼륨과 명명 볼륨
      • 익명 : docker run -v /app/data busybox
      • 명명 : docker volume create my-named-volume , docker run -v my-named-volume:/app/data busybox
      • 차이
        • 생성방법 : 익명 볼륨은 컨테이너 실행 시 자동으로 생성, 명명 볼륨은 명령어를 통해서만 생성
        • 이름 지정 : 익명 볼륨은 컨테이너 종속적이며, 이름이 없음, 명명 볼륨은 다른 컨테이너에서도 동시에 사용 가능
        • 수명 : 익명 볼륨은 컨테이너의 수명과 일치하며, 컨테이너 삭제 시 삭제됨. 명명 볼륨은 명시적으로 삭제하지 않는 한 계속해서 존재
          • 그러나 익명 볼륨은 --rm 옵션이 없다면 자동으로 제거 되지 않음
          • docker volume rm {volume_name}
          • docker volume prune
    • 컨테이너 내부 경로와 마운트하고자 하는 외부 경로를 명시해야 한다.
  • 도커에는 실제로 여러 가지의 외부 데이터 저장 메커니즘이 존재함.
    • 볼륨
    • 바인드 마운트
# docker volume 삭제
docker volume rm {volume_name}

# 사용하지 않는 볼륨 제거
docker volume prune

 

바인드 마운트

  • 우리는 도커에 의해 관리되는 볼륨의 위치는 실제 알지 못한다.
  • 바인드 마운트의 경우에는 알 수 있다. 왜냐하면 호스트 머신 상 매핑될 컨테이너의 경로를 설정할 수 있기 때문이다.
  • 바인드마운트는 그대로 폴더를 연결하기 때문에 영구적이고 편집 가능한 데이터에 적합하다.
  • 명명된 볼륨은 영구 데이터에 도움이 되지만 편집은 실제로 불가능하기 때문이다.
  • -v 로 선언할 때 : 앞에 로컬 머신 경로가 있으면 바인드 마운트, 볼륨 이름이 있으면 명명 볼륨으로 설정된다.

 

도커 볼륨 명령어

  • 익명 볼륨 생성
    • docker run -v /app/data ...
    • 컨테이너가 유지될 때까지만 유지됨
    • 컨테이너 간 데이터 공유할 수 없음
    • 시간 절약 가능
    • 호스트머신 안 파일을 생성하지만, 컨테이너가 중지될 때 지움
  • 명명 볼륨 생성
    • docker run -v data:/app/data ...
    • 특정 컨테이너에 연결되지 않은 채 생성 가능
    • 컨테이너 간 데이터를 공유할 수 있음
    • 다양한 컨테이너에서 동일한 볼륨에 저장 및 접근 가능
  • 바인드 마운트
    • docker run -v /path/to/code:/app/code ...
    • 다수 컨테이너에 연결될 수 있음
    • 호스트머신의 파일 경로와 연동
    • 컨테이너 재시작 되어도 재사용 가능

 

읽기 전용 볼륨 마운트

  • 디폴트로 볼륨은 read-write 이며, 이는 컨테이너가 볼륨에서 데이터를 읽고, 쓸 수 있음을 의미합니다.
  • 컨테이너는 내부 경로 뒤에 콜론을 추가한 다음 readonly 를 의미하는 ro 를 추가하면 readonly 가 적용됩니다. (컨테이너만 적용)
  • 호스트 머신에서는 파일을 읽고 쓸 수 있습니다.
  • 도커파일에서 Volume 을 지정해도 docker run 명령어에서 명시된 Volumn 이 우선권을 가진다.

 

도커 볼륨 명령어

# docker volume 관련 명령어
docker volume --help

# volume 목록
docker volume ls

# volume 생성
docker volume create

# volume inspect
docker volume inspect {volume_id}
  • 볼륨은 호스트머신의 /var/lib/docker/volumes/… 에 저장된다.
  • 읽기전용 같은 경우 volume inspect 의 Options 에서 해당 옵션이 기재된다.

 

바운드 마운트와 COPY 의 차이점

  • docker run 명령어는 보통 개발용으로 사용한다.
  • COPY 는 스냅샷을 가질 수 있어 캐시가 가능하다.

.dockerignore

  • docker ignore 를 사용하면 COPY 명령어로 복사하지 못하게 할 수 있다.

 

인수와 환경변수

  • docker build 를 실행할 때 --build-arg 옵션을 사용해서 함께 제공되는 인수를 활용할 수 있다.
  • 환경변수와 arg 은 Dockerfile 내부에서 사용 가능하다.
    • ARG DEFAULT_PORT=80
    • ENV PORT $DEFAULT_PORT
  • 도커 파일 안에서의 변수는 변경 될 때마다 캐시된 레이어를 모두 바꾸기 때문에 변경되지 않는 레이어 아래에 선언하는 것이 좋다.
  • 환경변수는 docker 명령어 옵션에서도 사용 가능하다.
    • --build-arg DEFAULT_PORT=8000
    • --e PORT=8080
  • 인수는 실행 중인 애플리케이션의 전체 애플리케이션 코드에서 사용할 수 있다.
  • 포트의 디폴트 값의 경우도 인수로 다룰 수 있음. (ARG)

 

결론


이번 강의에서 다른 주제들도 기초부터 모든 내용에 대한 설명을 차근차근 해주고 있다. 저같은 경우 회사에서 Docker 와 Kubernetes 를 운영하고 있어 아는 부분이나 실습 부분은 빠른 배속으로 보고, 개념적인 부분은 노션에 정리하면서 강의를 진행했다. 내용 자체는 방대하나 이 강의를 1번이라도 훑게되면 기본적인 지식들로 바닥을 다질 수 있을 것이란 생각이 든다.

Comments