231011_docker

장종민·2023년 10월 11일

mentor

목록 보기
24/24

Docker

도커의 구성요소에는?

  • 엔진

  • 이미지

  • 컨테이너

  • 허브 가 있음.

    ...

  • 버거킹을 사용하여 Docker의 주요 구성 요소를 비유하면

    1. Docker Engine: 버거킹의 전체 운영 시스템

      • Docker Engine은 이미지를 생성하고 컨테이너를 실행하는 핵심 기능을 제공
      • 버거킹의 매장에서 주방, 직원, 메뉴판 등이 모두 함께 작동하여 손님에게 서비스를 제공하는 시스템과 같음
    2. Docker Image: 버거킹의 표준화된 레시피

      • Docker 이미지는 애플리케이션과 그에 필요한 모든 파일, 라이브러리, 의존성을 포함한 패키지
      • 이미지는 버거킹의 표준화된 레시피. 예를 들면, "후퍼"의 레시피는 어떤 버거킹 매장에서도 동일하게 준비됨
    3. Docker Container: 실제로 준비된 햄버거

      • 컨테이너는 이미지를 기반으로 실제로 실행되는 인스턴스입니다.
      • 컨테이너는 버거킹에서 손님에게 제공되는 실제 햄버거나 프렌치 프라이. "후퍼" 레시피를 사용해도, 여러 번 햄버거를 만들 수 있고, 각각의 햄버거 (컨테이너)는 독립적으로 준비딤
    4. Docker Hub: 버거킹의 전세계 프랜차이즈 레시피 가이드북

      • Docker Hub는 Docker 이미지들이 저장되고 공유되는 중앙 저장소입니다.
      • 비유: 이는 버거킹의 전세계 프랜차이즈에서 사용되는 표준화된 레시피 가이드북과 같습니다. 모든 버거킹 매장 (개발자)은 이 가이드북 (Docker Hub)에서 정해진 레시피 (이미지)를 찾아서 손님 (사용자)에게 일관된 품질의 햄버거를 제공합니다.

    따라서 Docker를 사용하면, 버거킹처럼 어디서든 일관된 품질과 경험을 제공할 수 있는 애플리케이션 환경을 구축할 수 있다!

이미지란?

  • 어플리케이션을 실행하는데 필요한 모든 패키지(라이브러리, 의존성, 실행할 파일 등등)

VM과 이미지의 차이

  • VM (Virtual Machine)
    • VM은 컴퓨터 안에 또 다른 컴퓨터를 만들어내는 기술입니다.
    • 예를 들면, Windows 운영체제 위에서 Linux 운영체제를 돌리는 것처럼 생각하시면 됩니다.
    • 이렇게 동작하려면 VM은 자체적인 '전체 운영체제'와 필요한 소프트웨어, 라이브러리, 시스템 자원 등을 모두 포함해야 합니다.
    • 또한, VM은 '가상의 하드웨어'도 포함합니다. 그래서 VM을 실행하면 마치 진짜 컴퓨터를 새로 켜는 것처럼 동작합니다.
  • Docker Container
    • Docker Container는 VM보다 경량화된 기술입니다.
    • Docker는 '전체 운영체제'를 포함하지 않습니다. 대신 호스트 컴퓨터의 운영체제 (예: Linux)와 일부 공유합니다.
    • 그러나, 각 Docker Container는 격리된 환경에서 동작하므로, 다른 컨테이너나 호스트 시스템에 영향을 주지 않습니다.
    • Container에는 해당 어플리케이션을 실행하는데 필요한 라이브러리, 의존성, 파일 등만 포함되어 있습니다.
  • VM은 '진짜 컴퓨터'를 흉내내기 위해 전체 운영체제와 가상의 하드웨어를 모두 포함하고 있음. 반면에 Docker Container는 필요한 부분만 포함하고 나머지는 호스트 컴퓨터와 공유함.

호스트 컴퓨터란?

  • 호스트 컴퓨터 = 가상화나 컨테이너 기술에서 사용되는 용어
  • 호스트 컴퓨터는 Docker 소프트웨어가 설치되어 있는 "실제 컴퓨터나 주 운영체제"를 의미
  • 호스트가 있으면?
    • 게스트가 있음. 게스트란. 호스트 컴퓨터 위에서 격리된 환경에서 실행되는 도커 컨테이너들이 게스트.

그럼 윈도우 환경에서 도커를 깔면, 호스트 컴퓨터의 운영체제 = 윈도우?

YES.

따라서 vm으로 실행하는것에 비해서 무슨 이점이??

Docker 컨테이너와 전통적인 VM (Virtual Machine)은 비슷한 격리와 리소스 할당 기능을 제공하지만, 아키텍처와 기술적 특징에는 큰 차이가 있습니다. 이러한 차이점으로 인해 Docker 컨테이너는 VM에 비해 여러 이점을 가집니다:

  1. 시작 시간:
    • 컨테이너: 컨테이너는 초 단위 혹은 그보다 더 빠르게 시작됩니다.
    • VM: 전체 운영체제를 부팅해야 하므로 시작하는 데 일반적으로 몇 분이 소요됩니다.
  2. 리소스 효율:
    • 컨테이너: 모든 컨테이너는 호스트 시스템의 같은 OS 커널을 공유하므로 추가적인 OS 인스턴스가 필요하지 않습니다. 이로 인해 메모리와 CPU 사용이 훨씬 효율적입니다.
    • VM: 각 VM은 전체 운영체제와 그에 필요한 리소스를 포함합니다, 이로 인해 상대적으로 많은 리소스를 소비합니다.
  3. 디스크 사용량:
    • 컨테이너: 이미지 레이어를 효율적으로 공유하므로 디스크 공간 사용이 최적화됩니다.
    • VM: 각 VM은 전체 OS와 어플리케이션을 포함하기 때문에 디스크 사용량이 많습니다.
  4. 이식성:
    • 컨테이너: Docker 이미지는 OS와 어플리케이션, 라이브러리, 의존성 등 모든 것을 패키징하므로 다양한 환경에서 일관성 있게 실행됩니다.
    • VM: VM은 특정 하드웨어에 종속적인 경우가 있어 이식성이 제한적일 수 있습니다.
  5. 크기:
    • 컨테이너: 컨테이너 이미지는 작게 압축되고, 필요한 것만 포함하기 때문에 크기가 작습니다.
    • VM: 전체 OS를 포함하기 때문에 크기가 큽니다.
  6. 관리 및 확장성:
    • 컨테이너: Docker와 같은 도구는 컨테이너의 생성, 삭제, 스케일링 등을 간편하게 만듭니다.
    • VM: VM 관리는 일반적으로 더 복잡하며, 확장 및 스케일링이 상대적으로 느립니다.
  7. 밀도:
    • 컨테이너: 한 서버에서 수백에서 수천 개의 컨테이너를 실행할 수 있습니다.
    • VM: 일반적으로 한 서버에서 실행할 수 있는 VM의 수는 제한적입니다.

물론, Docker 컨테이너와 VM은 각기 다른 케이스와 요구 사항에 따라 적합할 수 있습니다. 보안, 완전한 격리, 하드웨어 가상화 등의 특정 요구 사항이 있는 경우 VM을 사용하는 것이 좋을 수 있습니다. 하지만 빠른 배포, 높은 이식성, 리소스 효율성 등을 원하는 애플리케이션 개발 및 배포에는 Docker 컨테이너가 더 적합할 수 있습니다.

Docker Hub란?

  • 로컬에 없던 "Hello World" 메뉴 (즉, Docker의 "hello-world" 이미지)는 Docker Hub라는 중앙 저장소에서 가져왔습니다.

    Docker Hub는 Docker 이미지들이 저장되어 있는 공개적인 저장소입니다. 개발자들은 자신들이 만든 Docker 이미지를 Docker Hub에 올려서 다른 사람들과 공유할 수 있습니다. 반대로, 사용자들은 Docker Hub에서 필요한 이미지를 검색하고 다운로드하여 사용할 수 있습니다.

    레스토랑 비유로 돌아가보면, Docker Hub는 큰 중앙 주방이나 공급 업체로 생각할 수 있습니다. 레스토랑은 메뉴에 없는 특별한 재료나 요리를 중앙 주방이나 공급 업체로부터 주문하여 가져올 수 있습니다.

    따라서 docker run hello-world 명령을 실행할 때, 로컬에 "hello-world" 이미지가 없으면 Docker는 자동으로 Docker Hub에서 해당 이미지를 다운로드하여 로컬에 저장하고, 그 이미지를 기반으로 컨테이너를 실행하게 됩니다.

Docker Hub에 어떤 이미지가 있는지는 어떻게 알 수 있고, 대표적인 이미지에는 뭐가 있을까?

  • https://hub.docker.com/

    • 이미지 검색가능
  • 대표적인 이미지

    • Base OS 이미지:

      • ubuntu, debian, centos, alpine 등 다양한 리눅스 배포판을 기반으로 하는 기본 OS 이미지입니다.
    • 웹 서버 및 프록시:

      • nginx: 웹 서버, 리버스 프록시, 로드 밸런서 등 다양한 용도로 사용되는 소프트웨어입니다.
      • apache, httpd: 널리 사용되는 웹 서버 소프트웨어입니다.
    • 데이터베이스:

      • mysql, postgres, mongo, redis 등 다양한 데이터베이스 소프트웨어 이미지입니다.
    • 개발 언어 및 프레임워크:

      • node, python, ruby, java, golang 등의 프로그래밍 언어 런타임 이미지.
      • django, express, flask 등의 웹 프레임워크 이미지.
    • 도구 및 서비스:

      • jenkins: CI/CD(지속적 통합/지속적 배포) 작업을 위한 자동화 서버입니다.
      • elasticsearch: 검색 및 로그 분석을 위한 서비스입니다.
      • rabbitmq, kafka: 메시지 큐 및 스트리밍 플랫폼입니다.

      vsc, docker desktop 사용

  • Docker Desktop 설치함 & 실행

  • vsc 확장에서 Docker(ms배포)설치

  • vsc에서 장고 프로젝트 디렉토리 생성

  • requirements.txt생성

    • pip freeze > requirements.txt
  • 프로젝트 루트에 Dockerfile이라는 파일 생성 및 아래와 같이 작성함(확장자 없이 Dockerfile)

    • FROM python:3.9
      WORKDIR /app
      COPY requirements.txt requirements.txt
      RUN pip install --no-cache-dir -r requirements.txt
      COPY . .
      CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
  • 프로젝트 루트 경로에서 아래 명령어로 이미지 빌드

    • docker build -t mydjangoapp .
    • 2~3분 걸림

    • 리눅스 환경에 설치되지 않는 라이브러리의 경우 충돌 일어남 >> 꼭 필요하지 않다면 requirements.txt에서 제거

  • 빌드완료

  • 컨테이너 실행하기

    • docker run -d -p 8000:8000 mydjangoapp
      • 컨테이너의 ID를 반환함
  • localhost:8000주소로 들어가서 장고서버 실행되고 있는 것 확인

  • 현재 실행되고 있는 컨테이너리스트 확인하기

    • docker ps
    • 실행되고 있는 컨테이너 리스트가 출력됨

  • 모든 컨테이너 리스트 확인하기(실행여부 관계없이)

    • docker ps -a
  • 컨테이너 중지시키기

    • docker stop [컨테이너 ID or 이름]
  • 컨테이너 삭제시키기(먼저 중지 필요!)

    • docker rm [컨테이너 ID or 이름]
  • 컨테이너 리스트 확인으로 삭제된 것 확인

profile
비전공 오르미부트캠프 2기

0개의 댓글