• 티스토리 홈
  • 프로필사진
    21V
  • 방명록
  • 깃허브
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
21V
  • 프로필사진
    21V
    • ALL (15)
      • Basic (1)
      • Language (0)
        • JAVA (0)
        • Python (0)
        • C (0)
      • Frame Work (0)
        • Spring Boot (0)
        • Node Js (0)
        • Nest Js (0)
      • DBMS (0)
        • MySQL (0)
        • ORACLE (0)
      • Mark Up (0)
        • HTML (0)
        • Mark Down (0)
      • Java Script Extenstions (0)
        • Java Script (0)
        • Type Script (0)
        • Vue Js (0)
        • React (0)
        • jQuery (0)
        • Augular Js (0)
      • Style Sheet (0)
        • CSS (0)
        • SCSS (0)
        • Bootstrap5 (0)
        • Style Tips (0)
      • Docker (3)
      • Git (0)
      • Develop Tools (1)
      • Project (1)
      • Trouble Shooting (9)
        • Spring Boot (2)
        • GIT (4)
        • Python (0)
      • ETC (0)
        • IRL (0)
        • 임시 미분류 (0)
        • 쓰레기통 (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • Docker의 개념 및 핵심설명
    2025년 01월 13일
    • 21V
    • 작성자
    • 2025.01.13. :38

    목차로 돌아가기

    Docker의 개념 및 핵심설명

    Docker란

    Docker란 Go언어로 작성된 리눅스 컨테이너 기반 오픈소스 가상화 플랫폼.
    현재 Docker 0.9버전부터는 직접 개발한 libcontainer 사용중.

    가상화를 사용하는 이유?

    이제는 향상된 컴퓨터의 성능을 더욱 효율적으로 사용하기 위해 가상화 기술이 많이 등장하였습니다.

    서버 관리자 입장에서 CPU사용률이 10%대 밖에 되지 않는 활용도가 낮은 서버들의 리소스 낭비일 수밖에 없습니다. 그렇다고 모든 서비스를 한 서버안에 올린다면 안정성에 문제가 생길수도 있습니다. 그래서 _안정성_을 높이며 리소스도 최대한 활용할 수 있는 방법으로 나타난게 서버 가상화입니다. 모두가 아는 대표적인 가상화 플랫폼으로는 VM이 있습니다. VM은 누구나 아는 OS가상화지요. 그렇다면 컨테이너란 무엇일까요?

    컨테이너란?

    컨테이너는 가상화 기술 중 하나로, 대표적으로 LXC(Linux Container)가 있습니다. 기존 OS를 가상화 시키는 것과는 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식 으로 이루어집니다.
    한 서버의 여러 OS를 가상화 하여 사용하는 것과 컨테이너 방식으로 프로세스를 격리시켜 동작하는 방법은 어떠한 차이점이 있을까요?

    VM 가상화 플랫폼 vs Docker 가상화 플랫폼

    기존의 우리에게 익숙한 VM같은 경우 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용합니다. 이는 가상화 된 하드웨어 위에 OS가 올라가는 형태로, 거의 완벽하게 Host와 분리된다고 봐도 무방합니다. 반면에 컨테이너 기반 가상화는 Docker엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됩니다.
    OS가상화를 보면 Host OS와 완전히 분리되는 장점이 있는 반면, OS위에 OS가 올라가기 때문에 무겁고 느릴수밖에 없습니다. 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker엔진 위에서 바로 동작하며, Host의 커널을 공유합니다. 커널을 공유하게 되면 io처리가 쉽게되어 성능의 효율을 높일 수 있습니다.
    즉 컨테이너를 사용하는 것은 가상 머신을 생성하는것이 아닌, Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는것입니다.

    Docker가 OS가상화랑 비교해 우월한것은 아니며, 각각의 장 단점이 있습니다.
    OS가상화의 경우 컨테이너 기반 가상화보다 더 높은 격리 레벨을 지원하며, 이는 보안적인 측면에서 더욱 유리합니다.
    또한 OS가상화는 커널을 공유하지 않는다는 장점 또한 가지고 있습니다. 커널을 공유하지 않는 만큼 멀티OS가 가능하다는 것 입니다. 커널을 공유하지 않아 멀티OS가 불가능하다는 것은 Linux위에 Window를 올릴 수 없다는 단점이 있다는것입니다. 그럼에도 왜 Docker를 사용하는 이유는 성능 향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성입니다.

    Docker Image

    Docker Image란 컨테이너를 실행할 수 있는 실행파일, 설정 값들을 가지고 있는것 입니다.

    그림과 같이 Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 되는 것이죠.

    그럼 어떻게 이미지가 만드는지 알기 위해선 어떻게 이미지가 만들어지는지 먼저 알아보도록 하겠습니다.

    다음 그림을 보면 ubuntu 이미지를 만들기 위해 Layer A,B,C가 들어갑니다. 그럼 nginx 이미지를 만든다고 생각했을땐 어떻게 될까요? 이미 Layer A,B,C로 만들어진 ubuntu 이미지를 베이스 이미지로 사용하여 베이스 이미지에 nginx만 더하게 됩니다. 그렇다면 실질적으로 Layer A, B, C, nginx 가 더해진 것이지만 과정은 unbuntu + nginx가 더해진 것이죠. 그렇다면 web app 이미지를 만들려고 할 땐 어떻게 될까요? ubuntu 이미지에 nginx를 올리고 web app을 올리는 것이 아닌 이미 만들어진 nginx 베이스 이미지에 web app을 올려 이미지를 만들게 됩니다.

    이제 이미지가 어떻게 만들어지는지 알았다면 실제로 Image를 만들어보는 Docker File에 대해 알아봅시다.

    Docker File

    Docker Image들을 저장하고 배포하는 Docker Hub는 정말 잘 활성화 되어 있습니다. 이미 여러 회사들은 소프트웨어를 Docker Hub를 통해 배포하기 시작했고 우린 Docker hub에서 image를 pull하여 간단하게 컨테이너에 넣어 사용할 수 있습니다. 하지만 이는 무엇인가 부족해 보이죠. 만약 배포판이 없다면? 배포판 보다 더욱 보완하고 싶다면? 그럴때 사용 할 수 있는 것이 Docker Fille입니다.

    Docker File은 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있습니다. 그 뜻은 Docker File을 읽을 수만 있다면 해당 이미지가 어떻게 구성되어 있는지도 알 수 있다는 의미가 됩니다.

    FROM jdk8:latest
    
    WORKDIR /app
    
    
    
    RUN mkdir /app/nexus-2.14.9-01
    
    RUN mkdir /app/sonatype-work
    
    RUN yum -y install httpd
    
    
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_181
    
    ENV PATH=$JAVA_HOME/bin:$PATH
    
    ENV CLASSPATH=.
    
    
    
    EXPOSE 3411 
    
    ADD run.sh /app/
    
    CMD ["/app/run.sh"]

    Docker File은 다음과 같이 작성됩니다.

    Docker Hub & Docker Registry

    Docker Hub에서는 이미지를 저장하고 관리해줍니다. 위에서도 많은 회사들이 Docker로 소프트웨어를 배포하기 시작했고 공개 이미지들을 공유할 수 있습니다. Docker Hub를 이용하면 손쉽게 image를 pull받아 컨테이너에 적용 시킬 수 있습니다. (Github와 유사)
    그렇다면 Docker Registry는 무엇일까요?
    Docker Hub처럼 공개된 방식이 아닌 비공개적으로 격리 된 저장소를 구축할 수 있습니다.

    다음은 Docker Image를 Pull 받기 위한 URL입니다. 그림과 같이 앞에 있는 URL을 적지 않으면 default로 Docker Hub에서 Image를 pull 받게 되고, URL을 적어준다면 사설 저장소에서 이미지를 받을 수 있습니다.

    Docker Archteture

    Docker의 구성과 동작 방식을 설명한 그림입니다.

    현업에서 Docker를 왜 이렇게 많이 쓸까?

    Docker를 쓰는 이유에는 여러가지 장점이 있지만 그 중에서 핵심 장점 딱 1가지만 기억하자.

    이식성 : 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성

    이 핵심 장점을 예시를 통해 이해해보자.

    친구는 컴퓨터에 MySQL을 아무 에러 없이 잘 깔았다. 그런데 내 컴퓨터에 MySQL을 깔려고 하니 이상하게 에러가 뜨는 것이다. 분명 친구가 설치한 방식대로 똑같이 했는데 제대로 안 깔릴 때가 있다. 지우고 다시 깔아봐도 계속해서 똑같은 에러가 뜨기도 한다.

    내 컴퓨터에만 MySQL이 안 깔리는 이유는 다양하다. 버전을 다른 걸 설치했거나, 운영체제(Window, Mac OS 등)가 다르거나, 내 컴퓨터에 깔려있는 다른 프로그램(ex. 보안 프로그램)과 충돌이 일어났거나 와 같은 다양한 이유로 프로그램이 정상적으로 설치되지 않는다. 그리고 설치 과정이 복잡하다면 새 컴퓨터를 사서 MySQL을 설치할 때마다 번거롭고 귀찮다고 느껴진다.

    이걸 깔끔하게 해결하기 위해 나타난 툴이 Docker이다. Docker를 사용하면 명령어 한 줄로 어떤 컴퓨터에든 MySQL을 에러 없이 설치하고 실행할 수 있게 된다.

    뿐만 아니라 Docker를 사용하면 아래와 같은 장점이 있다.

    • 매번 귀찮은 설치 과정을 일일이 거치지 않아도 된다.
    • 항상 일관되게 프로그램을 설치할 수 있다. (버전, 환경 설정, 옵션, 운영 체제 등)
    • 각 프로그램이 독립적인 환경에서 실행되기 때문에 프로그램 간에 서로 충돌이 일어나지 않는다.

    목차로 돌아가기

    'Docker' 카테고리의 다른 글

    [Docker]Docker란? / 컨테이너(Container)란? / 이미지(Image)란?  (0) 2025.01.13
    [Docker]목차  (0) 2025.01.13
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바