TIL

24.08.13 TIL - Docker

개발공명 2024. 8. 16. 07:18

오늘 배운 것

  • docker
  • docker-compose

 

Docker란?

  • 애플리케이션 쉽게 만들고, 테스트하고, 배포할 수 있게 도와주는 소프트웨어 플랫폼
  • 격리된 환경인 컨테이너 기반 가상화 플랫폼
  • 애플리케이션을 컨테이너라는 가볍고 이식성 있는 패키지로 실행 가능
  • 애플리케이션을 격리된 환경인 컨테이너로 패키징해 실행하는 기술
  • Docker 이미지는 애플리케이션을 실행하는 데 필요한 모든 것을 포함

기술은 흉악한데 이미지는 귀엽다

 

용어

Docker 이미지

  • 애플리케이션과 그 실행에 필요한 모든 것을 포함하는 것
  • Docker 컨테이너 생성하기 위한 설계도 역할

 

Docker 컨테이너

  • Docker 이미지를 실행한 상태
  • Docker 이미지를 가지고 Docker 컨테이너 생성
  • 격리된 공간에서 애플리케이션을 실행
  • 하나의 시스템에서 여러 개의 컨테이너 독립적으로 실행 가능

 

Dockerfile

  • Docker 이미지를 생성하기 위한 스크립트
  • Docker 이미지 빌드하는데 필요한 명령어들 포함
  • Docker 이미지 생산 과정을 자동화하고 일관되게 만듬

 

특징

  • 컨테이너화: 애플리케이션과 필요한 모든 것을 하나의 패키지로 묶어 어디서든 실행 가능
  • 경량: Docker는 운영 체제의 커널을 공유하므로, 가상 머신보다 훨씬 가볍고 빠르게 실행됨
  • 이식성: Docker 컨테이너는 어디서든 동일하게 실행
  • 확장성: Docker를 사용하면 여러 개의 컨테이너를 효율적으로 관리하고 쉽게 확장 가능

 

Docker 언제 사용하는지?

일관된 개발 환경이 필요할 때

  • 개발, 테스트, 운영 환경이 다를 때 발생하는 문제를 피하고자 할 때 사용한다. 
    • Docker를 사용하면 모든 환경에서 동일한 컨테이너를 실행할 수 있어, 환경 차이로 인한 문제를 줄일 수 있다.
    • 로컬에서 Docker 통해 개발 후 서버에 가도 문제가 없다.

 

애플리케이션을 빠르게 배포하고 싶을 때

  • Docker를 사용하면 애플리케이션을 빠르고 쉽게 배포할 수 있다.
  • Docker 이미지를 빌드하고 이를 컨테이너로 실행하면, 필요한 모든 구성 요소가 포함되어 있어 별도의 설치 과정 없이 바로 실행할 수 있다.

 

마이크로서비스 아키텍처를 도입할 때

  • 각 서비스가 독립적으로 배포되고 실행될 수 있어, 여러 개의 컨테이너를 통해 다양한 서비스를 쉽게 관리할 수 있다.
  • 어플리케이션을 하나의 Docker 컨테이너씩 올린다면 유지보수가 편해집니다.

 

CI/CD 파이프라인을 구축할 때

  • 코드를 변경할 때마다 자동으로 빌드, 테스트, 배포할 수 있도록 설정할 수 있다.
  • 이를 통해 개발 주기를 단축하고 배포의 신뢰성을 높일 수 있다.

 

리소스 효율성을 높이고 싶을 때

  • Docker 컨테이너는 가상 머신보다 적은 리소스를 사용한다.
  • 운영 체제의 커널을 공유하므로, 더 많은 애플리케이션을 동일한 하드웨어에서 실행할 수 있다.

 

애플리케이션 격리가 필요할 때

  • 여러 애플리케이션을 독립적으로 실행하고자 할 때 Docker를 사용하면 각 컨테이너가 서로 격리되어 실행된다.
  • 이를 통해 애플리케이션 간의 충돌을 방지하고 보안을 강화할 수 있다.

 

쉽게 스케일링하고 싶을 때

  • 컨테이너 기반의 애플리케이션을 쉽게 확장할 수 있다.
  • 필요한 만큼 컨테이너를 추가하여 수평 확장이 가능하다. 
  • 오케스트레이션 도구와 결합하여 자동 확장도 가능합니다.

 

쿠버네티스(Kubernetes)와 함께 사용하고자 할 때

  • 쿠버네티스는 컨테이너 오케스트레이션 도구다.
  • 쿠버네티스는 다수의 Docker 컨테이너를 관리하고 자동 배포, 확장, 운영을 지원한다.

 

Docker-Compose

  • 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구다. 
  • Docker 컨테이너가 많아지면 헷갈린다. 
  • Docker-compose로 하나의 파일에서 많은 컨테이너 모두 조작할 수 있다. 
  • Docker 컨테이너 여러 개 각각 실행할 때의 헷갈림을 방지하고 더 편하게 한번에 조작할 수 있게 하는 것이다. 

 

 

나의 생각

지금까지 늘 도커는 어려운 기술이라는 생각이 있었다. 

 

정리하는 지금까지도 위의 글들을 보면 뭐하는 기술인지 잘 이해가 되지 않는다. 

 

이해한 것을 정리해보면 아래와 같다. 

  1. Dockerfile이라는 것으로 Docker 이미지를 생산한다. 
  2. Docker 이미지에는 어플리케이션에 필요한 모든 것이 담겨 있고 이것으로 Docker 컨테이너 생성한다. 
  3. Docker 컨테이너는 격리된 환경에서 어플리케이션을 실행하는 것이다. 
  4. Dockerfile이라는 것만 있으면 Window던 Mac이던 어디던 어플리케이션을 동일하게 빠르게 실행할 수 있다. 

 

  • Docker를 지금까지 개발을 시작할 때 Window와 Mac이 환경이 달라서 생기는 오류를 줄이고 같은 환경에서 개발할 수 있게 도와주는 것이라고 생각했다. 
    • 그런데 이렇게 사용하는 것은 잘 그림이 그려지지 않는다...
    • Docker 이미지로 같은 환경을 설정해 놓는다 → Docker 이미지를 각자 다운 받는다 → ??
    • Docker 이미지는 어플리케이션 컨테이너의 설계도인데 이것을 받아서 어떻게 개발을 시작하는지....?
    • 이부분이 잘 이해가 안되고 좀 더 알아보고 직접 사용해 봐야 할 것 같다. 
  • 대신 Docker가 배포할 때는 유용할 것 같다는 생각이 들었다. 
    • 서버에서 Docker 이미지 가지고 쉽게 Docker 컨테이너 실행 시켜 어플리케이션 실행 시킬 수 있다고 생각했다. 
    • Docker 없으면 아래와 같은 여러 과정 거쳐야 한다. 
      • 서버에 필요한 것 (자바, redis, MySQL...) 다 설치
      • java jar 명령어로 빌드 파일 실행
      • ...
    • 또 CI/CD에서 유용하고 쉽게 배포할 수 있을 것 같다. 
  • 또 MSA를 도입할 때 Docker로 많은 도움 받을 것 같다는 생각을 했다. 
    • 각 어플리케이션들에 대한 Docker 이미지만 가지고 쉽게 여러 어플리케이션을 실행 시킬 수 있을 것 같다. 
    • 한 어플리케이션이 여러 개 필요하다면 Docker 이미지로 쉽게 여러 개 띄울 수 있을 것 같다. 

 

Docker는 좀 더 깊게 공부해보고 사용해봐야 할 것 같다. 

 

Docker는 개발에 매우 도움이 되는 기술인 것은 맞는 것 같다. 

 

Docker는 쉬운 편이고 쿠버네티스가 정말 어렵다는데 걱정이 든다....