programing

도커, 그것은 무엇이고 목적은 무엇입니까?

bestprogram 2023. 10. 9. 23:29

도커, 그것은 무엇이고 목적은 무엇입니까?

며칠 전에 도커에 대해 들은 적이 있는데 건너가고 싶었답니다.

하지만 사실 이 "용기"의 목적이 무엇인지는 모르겠습니다.

용기란 무엇입니까?

개발 전용 가상 머신을 대체할 수 있습니까?

간단히 말해서, 회사에서 도커를 사용하는 목적은 무엇입니까?주요 장점?

VM: 예를 들어 가상 머신(VM) 소프트웨어를 사용하면 Windows(윈도우) 내에 Ubuntu를 설치할 수 있습니다.그리고 둘 다 동시에 뛰게 됩니다.이는 CPU, RAM, Disk, 네트워크 카드 등 핵심 구성 요소를 운영 체제 내에 내장하고 실제 PC처럼 작동하도록 조립하는 PC를 구축하는 것과 같습니다.이렇게 하면 가상 PC는 호스트라고 하는 운영 체제를 갖춘 실제 PC 내부의 "게스트"가 됩니다.

컨테이너:위와 같지만 전체 운영체제를 사용하는 대신 가상 OS의 "불필요한" 구성 요소를 줄여 최소한의 버전을 만듭니다.이것이 LXC(Linux Containers)의 탄생으로 이어집니다.따라서 VM보다 더 빠르고 효율적이어야 합니다.

도커(Docker): 도커 컨테이너는 가상 머신 및 컨테이너와 달리 별도의 운영 체제를 필요로 하거나 포함하지 않습니다.대신 리눅스 커널의 기능에 의존하며 리소스 격리를 사용합니다.
도커의 목적:소프트웨어 컨테이너 내부에 애플리케이션을 자동화하고 Linux에서 운영 체제 수준의 가상화를 자동화하는 것이 주된 목표입니다.표준 컨테이너보다 경량이며 몇 초 안에 부팅됩니다.

(도커의 경우 게스트 OS가 필요 없음)

[ 참고로 이 답변은 Linux 컨테이너에 초점을 맞추고 있으며 다른 운영 체제에는 완전히 적용되지 않을 수 있습니다. ]

컨테이너란 무엇입니까?

앱입니다: 컨테이너는 서로 격리된 응용 프로그램을 실행하는 방법입니다.컨테이너는 하드웨어를 가상화하여 여러 운영 체제를 실행하는 것이 아니라 운영 체제를 가상화하여 여러 애플리케이션을 실행하는 것에 의존합니다.즉, 실행 중인 OS 복사본이 하나뿐이고 각 애플리케이션 인스턴스에 대해 메모리와 CPU 코어를 미리 할당할 필요가 없으므로 VM보다 동일한 하드웨어에서 더 많은 컨테이너를 실행할 수 있습니다.다른 앱과 마찬가지로 컨테이너가 CPU나 메모리를 필요로 할 때 할당한 다음 작업이 완료되면 자유롭게 사용할 수 있도록 하여 다른 앱에서 동일한 제한된 리소스를 나중에 사용할 수 있도록 합니다.

커널 네임스페이스를 활용합니다.각 컨테이너는 기본적으로 다음과 같은 이름이 지정된 환경을 받습니다.

  • 파일 : ,/ 안에 m와 것입니다./
  • PID: process ids, 컨테이너의 pid 1은 시작된 응용 프로그램이며, 이 pid는 호스트에서 볼 때 다릅니다.
  • 네트워크: 컨테이너는 기본적으로 자체 루프백 인터페이스(127.0.0.1)와 개인 IP로 실행됩니다.도커는 리눅스 브리지 네트워크와 같은 기술을 사용하여 여러 개의 컨테이너를 자신의 전용 랜에서 함께 연결합니다.
  • IPC: 프로세스간 통신
  • UTS: 호스트 이름 포함
  • 사용자: 모든 사용자 ID를 호스트 ID에서 오프셋하도록 선택적으로 이동할 수 있습니다.

또한 이러한 각 네임스페이스는 명시적으로 격리를 제거하지 않는 한 호스트의 파일 시스템이나 프로세스 또는 다른 컨테이너의 파일 시스템이나 프로세스와 같은 것을 컨테이너에서 볼 수 없도록 합니다.

기타 리눅스 보안 도구: 컨테이너는 SELinux, AppArmor, Capabilities 및 Seccomp와 같은 다른 보안 기능도 활용하여 루트 사용자를 포함한 컨테이너 내부의 사용자가 컨테이너를 빠져나오거나 호스트에 부정적인 영향을 미치는 것을 제한합니다.

응용 프로그램을 휴대성에 대한 종속성으로 패키지 구성: 응용 프로그램을 컨테이너에 패키지화하려면 응용 프로그램 자체뿐만 아니라 해당 응용 프로그램을 실행하는 데 필요한 모든 종속성을 휴대용 이미지로 조립해야 합니다.이 이미지는 컨테이너를 만드는 데 사용되는 기본 파일 시스템입니다.애플리케이션만 격리하고 있기 때문에 이 파일 시스템에는 전체 운영 체제를 가상화하는 데 필요한 커널 및 기타 OS 유틸리티가 포함되어 있지 않습니다.따라서 컨테이너의 이미지는 동등한 가상 시스템의 이미지보다 상당히 작아야 하므로 네트워크 전체의 노드에 배포하는 속도가 빨라집니다.그 결과 컨테이너는 클라우드 및 원격 데이터 센터에 애플리케이션을 배포하는 데 인기 있는 옵션이 되었습니다.

개발 전용 가상 머신을 대체할 수 있습니까?

상황에 따라 다릅니다.개발 환경에서 Linux를 실행하고 있고 하드웨어 장치에 액세스할 필요가 없거나 물리적 하드웨어에 직접 액세스할 수 있는 경우 Linux 컨테이너로 바로 마이그레이션할 수 있습니다.도커 컨테이너의 최적 대상은 네트워크를 통해 액세스하는 웹 기반 API(예: REST 앱)와 같은 애플리케이션입니다.

간단히 말해서, 회사에서 도커를 사용하는 목적은 무엇입니까?주요 장점은?

Devor Ops: Docker는 일반적으로 두 경로 중 하나의 환경으로 들어갑니다.애플리케이션을 보다 신속하게 개발하고 로컬에서 테스트할 수 있는 방법을 찾고 있는 개발자와 가상 머신에서 가능한 것보다 적은 하드웨어로 더 많은 워크로드를 실행하려는 운영자.

또는 개발자:이상적인 목표 중 하나는 CI/CD 배포 툴에서 도커를 즉시 활용하여 애플리케이션을 컴파일하고 개발, CI, prod 등에 배포되는 이미지를 즉시 구축하는 것입니다.컨테이너는 코드 체크인에서 애플리케이션을 테스트할 수 있을 때까지 이동하는 시간을 줄여 개발자의 효율성을 높입니다.또한 올바르게 설계되면 개발자와 CI 툴이 테스트하고 승인한 것과 동일한 이미지를 프로덕션에 배포할 수 있습니다.해당 이미지에는 애플리케이션 종속성이 모두 포함되어 있으므로 개발 과정에서 작동하던 생산 과정에서 문제가 발생할 위험이 현저히 줄어듭니다.

확장성:마지막으로 언급할 컨테이너의 주요 이점은 수평적 확장성을 염두에 두고 설계되었다는 것입니다.많은 부하를 받는 상태에서 상태 비저장 앱을 사용하는 경우, 이미지 크기가 작고 오버헤드가 줄어들어 크기를 훨씬 더 쉽고 빠르게 확장할 수 있습니다.이러한 이유로 Google 및 Netflix와 같은 대규모 웹 기반 회사에서 컨테이너를 사용하는 것을 볼 수 있습니다.

며칠 전에도 똑같은 질문이 머리를 때렸고, 그 질문에 빠져들어 무엇을 발견했는지, 아주 간단한 말로 이해해봅시다.

애플리케이션 아키텍처 및 개발의 현재 프로세스에 문제가 없을 때 도커와 컨테이너를 생각하는 이유!!

nodeJs, MongoDB, Redis, Rabbit를 사용하여 애플리케이션을 개발하는 예를 들어보겠습니다.MQ 등의 서비스 [다른 서비스를 생각할 수 있습니다.

이제 도커나 컨테이너화 애플리케이션의 다른 대안이 존재한다는 사실을 잊어버리게 되면 애플리케이션 개발출하 과정에서 다음과 같은 문제에 직면하게 됩니다.

  1. 서비스 호환성(nodeJs, mongoDB, Redis, Rabbit)OS와 호환되는 버전을 찾은 후에도 버전과 관련하여 예상치 못한 일이 발생하면 호환성을 다시 검토하여 수정해야 합니다.

  2. 두 시스템 구성 요소가 OS의 애플리케이션에서 서로 다른 버전의 라이브러리/의존성을 필요로 하는 경우(라이브러리 및 종속성 버전 문제로 인해 예기치 않은 애플리케이션 동작이 발생할 경우 매번 재검토해야 함).

  3. 가장 중요한 것은, 만약 새로운 사람이 팀에 합류한다면, 우리는 새로운 환경을 설정하는 것이 매우 어렵다는 것을 알게 되고, 사람은 많은 지시사항을 따라야 하고, 최종적으로 환경을 설정하기 위해 수백 개의 명령을 실행해야 합니다. 그리고 시간과 노력이 필요합니다.

    사람들은 자신들이 올바른 버전의 OS를 사용하고 있는지 확인하고 OS와의 서비스 호환성을 확인해야 합니다.그리고 각 개발자는 설정을 할 때마다 이를 따라야 합니다.

  4. 개발, 테스트, 생산 등 환경도 다릅니다.한 개발자가 하나의 OS를 사용하는 것이 편안하고 다른 개발자가 다른 OS를 사용하는 것이 편안하다면, 이 경우 우리의 애플리케이션이 이 두 가지 다른 상황에서 동일하게 동작할 것이라고 보장할 수는 없습니다.

이 모든 것들이 애플리케이션을 개발하고 테스트하고 배송하는 과정에서 우리의 삶을 힘들게 합니다.

따라서 호환성 문제를 해결하고 다른 구성 요소에 영향을 주지 않고 시스템 구성 요소를 변경 및 수정할 수 있는 무언가가 필요합니다.

이제 도커는 애플리케이션을 컨테이너화하고 애플리케이션 배포를 자동화하여 매우 쉽게 제공하는 것이 목적이기 때문에 고민합니다.

enter image description here

도커가 위의 문제를 해결하는 방법

  1. 각 서비스 구성 요소(nodeJs, MongoDB, Redis, Rabbit)를 실행할 수 있습니다.MQ)는 동일한 OS에 있는 자체 종속성과 라이브러리를 가지고 있지만 다른 환경에 있는 서로 다른 컨테이너에 있습니다.

  2. 도커 구성을 한 번만 실행하면 모든 팀 개발자가 간단한 도커 실행 명령으로 시작할 수 있으므로 많은 시간과 노력을 절약할 수 있습니다.

따라서 컨테이너는 모든 종속성과 라이브러리가 자체 프로세스네트워킹 인터페이스마운트와 함께 번들로 제공되는 격리된 환경입니다.

모든 컨테이너는 동일한 OS 리소스를 사용하므로 적은 하드웨어 비용으로 CPU를 부팅하고 효율적으로 사용하는 데 걸리는 시간이 줄어듭니다.

이것이 도움이 되었으면 좋겠습니다.

도커를 사용하는 이유:도커는 설치나 의존성에 대한 걱정 없이 소프트웨어를 설치하고 실행하는 것을 매우 쉽게 해줍니다.Docker는 컴퓨터뿐만 아니라 웹 서버나 클라우드 기반 컴퓨팅 플랫폼에서도 특정 컴퓨터에 소프트웨어를 설치하고 실행할 수 있도록 정말 쉽고 간편하게 만들어 줍니다.예를 들어 컴퓨터에 redis를 설치하러 갔을 때 bellow command wget http://download.redis.io/redis-stable.tar.gz 을 사용했습니다.

오류가 났네요

이제 저는 분명히 가서 이 프로그램을 문제를 해결하고 redis를 다시 설치할 수 있습니다. 그리고 소프트웨어를 설치하고 실행하는 동안 모든 문제 해결을 시도하는 끝없는 순환에 빠졌습니다.

enter image description here

이제 도커를 사용하는 것처럼 읽기가 얼마나 쉬운지 보여드리겠습니다.docker run - it redis 명령만 실행하면 오류 없이 docker가 설치됩니다.enter image description here 도커란 무엇입니까?도커가 무엇인지 이해하려면 도커 에코시스템에 대해 알아야 합니다.

도커 클라이언트, 서버, 머신, 이미지, 허브, 컴포지트는 모두 프로젝트 도구 소프트웨어이며, 이들은 하나로 합쳐져 컨테이너라는 것을 만들고 실행하는 것을 중심으로 생태계를 형성하는 플랫폼입니다.이제 명령어 Docker run red 는 Docker CLI 라고 불리는 것이 Docker Hub 이라고 불리는 것에 도달했고 그것은 이미지라고 불리는 하나의 파일을 다운로드했습니다.

이미지는 매우 특정한 프로그램을 실행하는 데 필요한 모든 종속성과 모든 구성을 포함하는 단일 파일입니다. 예를 들어, 방금 다운로드한 이미지가 실행되도록 설정된 redis입니다.

이것은 하드 드라이브에 저장되는 단일 파일이며, 이 이미지를 사용하여 컨테이너라는 것을 만들 수 있습니다.

컨테이너는 이미지의 한 예로, 독자적으로 분리된 하드웨어 리소스 세트를 가지고 실행 중인 프로그램과 같다고 생각할 수 있습니다. 따라서 컨테이너는 자체적으로 작은 세트 또는 메모리의 작은 공간에 네트워킹 기술의 작은 공간과 하드 드라이브의 작은 공간을 가지고 있습니다.

이제 bellow 명령을 내릴 때 살펴보도록 하겠습니다: sudo docker run hello-world

위의 명령어는 도커 클라이언트 또는 도커 CLI를 시작합니다. 도커 CLI는 사용자로부터 명령어를 약간의 처리를 수행한 다음 명령어를 도커 서버라고 하는 것으로 전달하는 역할을 담당합니다. 도커는 hello-world, That me 명령어를 실행할 때 헤비 리프팅을 담당합니다.우리가 hello world라는 이름의 이미지를 사용하여 새로운 컨테이너를 시작하려고 했던 개미는 hello world 이미지 안에 아주 작은 프로그램을 가지고 있습니다. 그 프로그램은 당신이 단말기에서 보는 메시지를 출력하는 것이 유일한 목적 혹은 유일한 일입니다.

이 명령을 실행하고 도커 서버에 전달했을 때 일련의 작업이 매우 빠르게 백그라운드에서 수행되었습니다.도커 서버는 우리가 hello world라는 이미지를 사용하여 새로운 컨테이너를 시작하려고 하는 것을 보았습니다.

도커 서버가 가장 먼저 한 일은 hello world 이미지의 개인용 컴퓨터에 있는 복사본이나 hello world 파일과 같은 로컬 복사본이 이미 있는지 확인하는 것이었습니다.그래서 도커 서버는 이미지 캐시라고 불리는 것을 조사했습니다.

당신과 제가 방금 도커를 개인용 컴퓨터에 설치했기 때문에 이미지 캐시가 현재 비어 있기 때문에 이전에 이미 다운로드한 이미지가 없습니다.

그래서 이미지 캐시가 비어 있었기 때문에 도커 서버는 도커 허브라는 무료 서비스에 손을 뻗기로 결정했습니다.도커 허브는 개인용 컴퓨터에서 자유롭게 다운로드하여 실행할 수 있는 무료 공공 이미지의 저장소입니다.그래서 도커 서버는 도커 허브에 손을 뻗어서 헬로 월드 파일을 다운로드하여 이미지 캐시에 컴퓨터에 저장했습니다. 이제 도커 허브에서 다시 다운로드하지 않고도 미래의 어느 시점에서 매우 빠르게 다시 실행할 수 있습니다.

이후 도커 서버는 컨테이너 인스턴스를 생성하기 위해 컨테이너를 사용하고 컨테이너는 이미지의 인스턴스라는 것을 알게 되며, 컨테이너의 유일한 목적은 하나의 매우 특정한 프로그램을 실행하는 것입니다.그래서 도커 서버는 기본적으로 이미지 캐시에서 이미지 파일을 가져와서 메모리에 로드하여 컨테이너를 만든 다음 그 안에서 단일 프로그램을 실행했습니다.그리고 단일 프로그램의 목적은 보이는 메시지를 출력하는 것이었습니다.

컨테이너란 무엇인가요? 컨테이너란 특정한 자원 그룹이 할당된 프로세스 또는 프로세스의 집합입니다. 아래 그림은 컨테이너에 대해 생각할 때마다 커널에 시스템 호출을 보내는 실행 프로세스가 있다는 것입니다. 커널은 수신되는 시스템 호출을 보고 서버로 전송합니다.y개의 하드 드라이브, RAM, CPU 또는 기타 필요한 모든 것의 특정 부분과 이러한 각 리소스의 일부를 해당 단일 프로세스에서 사용할 수 있게 됩니다.

가능한 한 간단한 답변을 드리겠습니다.

하지만 사실 이 "용기"의 목적이 무엇인지는 모르겠습니다.

용기란 무엇입니까?

간단히 말하면 소프트웨어가 들어 있는 패키지입니다.보다 구체적으로, 애플리케이션과 그 모든 종속성이 함께 번들로 제공됩니다.도커 컨테이너는 OS 추상화 계층인 반면, 도커화되지 않은 일반 애플리케이션 환경은 OS에 직접 연결됩니다.

컨테이너는 이미지의 런타임 인스턴스라는 점에서 이미지와 다릅니다. OOP에 익숙한 경우 개체가 클래스의 런타임 인스턴스인 경우와 유사합니다.

개발 전용 가상 머신을 대체할 수 있습니까?

VM과 도커 컨테이너 모두 시스템 인프라 위에 추상화 기능을 제공한다는 점에서 가상화 기술입니다.

VM은 하이퍼바이저를 통해 호스트 리소스에 가상으로 액세스할 수 있는 완전한 "게스트" 운영 체제를 실행합니다.이는 VM이 실제 필요한 것보다 더 많은 리소스를 환경에 제공하는 경우가 많다는 것을 의미합니다. 일반적으로 VM은 대부분의 애플리케이션이 필요로 하는 것보다 더 많은 리소스를 환경에 제공합니다.따라서 컨테이너는 보다 가벼운 기술입니다.그 둘은 서로 다른 문제를 해결합니다.

간단히 말해서, 회사에서 도커를 사용하는 목적은 무엇입니까?주요 장점?

컨테이너화는 마이크로 서비스와 함께 진행됩니다.더 큰 애플리케이션을 구성하는 더 작은 서비스들은 종종 도커 컨테이너에서 테스트되고 실행됩니다.이를 통해 지속적인 테스트가 쉬워집니다.

또한 Docker 컨테이너는 읽기 전용이기 때문에 주요 DevOps 원칙이 적용됩니다. 프로덕션 서비스는 변경되지 않은 상태로 유지되어야 합니다.

이를 사용할 때 얻을 수 있는 일반적인 이점은 다음과 같습니다.

  • 서비스의 탁월한 격리
  • 애플리케이션이 필요로 하는 모든 것을 담을 수 있는 뛰어난 관리 기능
  • 구현 기술의 캡슐화(용기 내)
  • VM 대비 효율적인 리소스 활용(경량 OS 가상화로 인한)
  • 빠른 구축

도커에 대한 이전 경험이 없는 경우, 이 답변은 개발자로서 필요한 기본 사항을 다룹니다.

도커는 운영 효율성을 향상시키는 효과적인 애플리케이션이기 때문에 DevOps의 표준 도구가 되었습니다.도커가 탄생한 이유와 인기가 높은 이유를 살펴보면 대부분 애플리케이션이 실행되고 개발되는 환경을 설정하는 데 걸리는 시간을 줄이는 기능 때문입니다.

React를 프론트엔드로 하는 환경과 백엔드를 위한 node 및 express API를 설정하는 데 걸리는 시간을 살펴보세요. 이 환경 역시 몽고가 필요합니다.그리고 그건 그냥 시작하는 겁니다.그런 다음 팀이 성장하고 여러 개발자가 동일한 프론트 엔드 및 백엔드에서 작업을 수행하고 있으므로 테스트 목적으로 로컬 환경에서 동일한 리소스를 설정해야 하는데 모든 개발자가 동일한 버전은 고사하고 동일한 환경 리소스를 실행할 것을 어떻게 보장할 수 있습니까?이 모든 시나리오는 특정 설정, 환경, 심지어 리소스 버전까지 포함한 컨테이너를 설정함으로써 얻을 수 있는 가치라는 점에서 도커의 장점에 잘 부합합니다.몇 가지 명령만 입력하면 도커가 리소스를 자동으로 설정, 설치 및 실행할 수 있습니다.

주요 구성 요소에 대해 간단히 살펴보도록 하겠습니다.컨테이너는 기본적으로 응용프로그램 또는 특정 리소스가 있는 곳입니다.예를 들어, 한 컨테이너에 몽고 데이터베이스를, 그 다음에 프론트엔드 리액트 애플리케이션을, 마지막으로 세 번째 컨테이너에 노드 익스프레스 서버를 둘 수 있습니다.

그러면 컨테이너가 제작된 이미지가 나타납니다.이미지에는 모든 시스템에서 동일한 방식으로 컨테이너를 구축하는 데 필요한 모든 정보가 들어 있습니다.레시피 같아요.

그러면 용기의 데이터를 보관하는 볼륨이 생깁니다.따라서 애플리케이션이 정적이고 변하지 않는 컨테이너에 있는 경우 변경되는 데이터는 볼륨에 있습니다.

그리고 마지막으로, 이 모든 아이템들이 말을 할 수 있게 해주는 것은 네트워킹입니다.네, 간단할 것 같지만, 도커의 각 컨테이너는 각 컨테이너의 존재에 대해 전혀 알지 못합니다.그들은 완전히 고립되어 있습니다.도커에서 네트워크를 구축하지 않는 한, 그들은 서로 연결하는 방법을 전혀 알지 못할 것입니다.

위에 정말 좋은 답변들이 있어서 정말 도움이 되었습니다.

아래에서 나는 좀 더 간단한 대답을 초안을 작성했습니다.

웹 응용프로그램을 도커링해야 하는 이유?

a. One OS for multiple applications ( Resources are shared )

b. Resource manangement ( CPU / RAM) is efficient.

c. Serverless Implementation made easier -Yes, AWS ECS with Fargate, But serverless can be achieved with Lamdba

d. Infra As Code - Agree, but IaC can be achieved via Terraforms

e. "It works in my machine" Issue 

그래도 도커라이제이션을 선택할 때 아래 질문이 열려 있습니다.

간단한 스프링 부츠 어플리케이션

 a. Jar file with size ~50MB 

 b. creates a Docker Image ~500MB 

 c. Cant I simply choose a small ec2 instance for my microservices.

재정적 이점(개별 인스턴스 비용 절감)?

a. No need to pay for individual OS subscription

b. Is there any monetary benefit like the below implementation? 

c. let say select t3.2xlarge ( 8 core / 32 GB) and start 4-5 docker images ?

언급URL : https://stackoverflow.com/questions/28089344/docker-what-is-it-and-what-is-the-purpose