Docker

LEE EUI JOO·2022년 11월 14일
0

Docker

목록 보기
1/8
post-thumbnail

1. Docker

  • 컨테이너 기술

도커는 컨테이너를 구축하기 위한 도구일 뿐이다.

  • 컨테이너
    소프트웨어 유닛, 코드가 포함된 패키지 및 코드를 실행하는 종속성을 보관할 수 있으며 도커가 실행되는 모든 곳에서 이를 가져올 수 있다.
    그러면 동일한 환경에서 정확히 동일한 애플리케이션을 실행할 수 있다.
    모든 것이 컨테이너에 있기 때문에 애플리케이션을 실행하려는 위치에 추가 도구를 설치하는 것에 대해 걱정할 필요가 없으며 그것이 컨테이너며, 그것이 도커이다.

  • 장점

  1. 컨테이너 지원이 최신 운영 체제에 내장되어 있거나 최소한 시작하기 쉽다.
  2. 도커를 모든 최신 운영 체제에 설치하여 작업할 수 있다.
  3. 컨테이너의 생성 및 관리 프로세스를 단순화 하는 도구이다.
  4. 컨테이너를 만들 필요는 없지만 컨테이너는 작업을 매우 쉽게 만들어 준다.

2. 소프트웨어 개발에 컨테이너가 왜 필요한가?

왜 우리는 소프트웨어 개발에서 독립적이고 표준화된 애플리케이션 패키지를 원하는 걸까?
도커의 주요 사용 사례 중 하나는 우리는 종종 다른 개발 제품 생산 환경을 가진다.
간단한 예를 들자면 NodeJS 애플리케이션을 생성했다고 가정해 보자
그리고 거기에 NodeJS 버전 14.3에서 성공적으로 실행되는 몇 가지 코드를 작성했다.
그리고 NodeJS의 상위 버전에서 작동하는 await 이라는 기능은 이전 버전에서는 작동하지 않는 다는 것을 안다.
이 기능을 사용하려면 상위 버전의 NodeJS 필요하다. 문제는 그 버전이 로컬환경, 개발 환경, 로컬머신에만 설치 되어 있을 수 있다는 것이다.

하지만 이 응용프로그램을 가져와서 호스트되어야 하는 서버의 일부 원격 시스템에 배포하여 전 세계가 연결할 수 있도록 하는 경우 해당 원격 시스템에 이전 버전의 NodeJS가 있을 수 있습니다.
따라서 동일한 것을 가지고 있다는 것, 즉 우리가 제품 생산에서 가지고 있는 것과 똑같은 개발환경을 갖는 것은 상당한 가치가 있다.
이것이 도커와 컨테이너가 필요한 점이다.
특정 Node 버전을 도커 컨테이너에 고정(lock)할 수 있으므로 코드가 항상 정확한 버전으로 실행되도록 할 수 있다.
애플리케이션이 자체적으로 필요한 NodeJS버전을 제공하는 컨테이너에서 실행되기 때문이다.

개발에서는 이러한 재현성을 원하므로 현재 배포하지 않는 경우에도 컨테이너에 코드가 필요로 하는 모든 것을 포함하는 환경을 보유하는 것은 상당한 가치가 있다.

마지막으로 중요한 것은 혼자 작업하는 경우에도 도커와 컨테이너가 매우 유용하다 작업 중인 프로젝트가 여러개 인경우 충돌하는 버전이 있을 수 있기 때문이다.
어떤 프로젝트에서 Python 버전 2를 사용하고 다른 프로젝트에서는 최신의 Python버전을 사용한다고 가정해보자 NodeJS나 PHP 또는 어떤 종류의 프로젝트에서도 마찬가지이다.
충돌하는 버전이 있을 수 있으며 이는 프로젝트 A에서 B로 전환할 때마다 잘못된 버전을 제거하고 올바른 버전을 설치해야 함을 의미한다.
우리는 각 버전을 컨테이너에 보유하고 각각의 프로젝트에는 그들만의 컨테이너가 존재하도록 한다.
따라서 프로젝트를 전환하면 그대로 작동하는 것이다.
호스트 컴퓨터가 아닌, 컨테이너에 모든 것이 있기 때문에 매번 제거하고, 다시 설치할 필요가 없다.
다른 컨테이너를 시작하는 것으로 쉽게 프로젝트를 전환 할 수 있다.

3. 왜 Virtual Machine으로 안하고?

재현 가능한 환경적인 문제 (version과 같은)는 Virtual Machine으로 해결할 수 있는 것 아닌가?
우리가 보유한 Virtual Operating System 처럼말이다.
호스트 운영체제에 독립적인 자체 셀(shell)을 지닌 캡슐화된 가상 운영체제를 지닌 가상머신, 그게 정답 아닐까? 그럴 수 있다.
가상 머신을 사용한다는 건, 호스트 운영체제 즉, Windows or Mac OS 또는 Linux 가 있고
그 귀에 가상 머신을 설치한다는 것이다.
말하자면 컴퓨터 내부의 컴퓨터이다.
이 가상 머신에는 그 가상 머신 내부에서 실행되는 자체 운영체제인 가상 운영체제가 있다.
예를 들어 리눅스라고 하자
그런 다음 이 가상 머신은 컴퓨터와 같기 때문에 가상머신에서 에뮬레이트를 할 수 있고 가상 머신 내부에 추가 도구를 설치할 수 있다.
이것은 가상으로 존재하지만 다른 머신이기 때문에 거기에 원하는 무엇이든 설치할 수 있다.
필요한 모든 라이브러리, 종속성 및 도구를 설치한 다음 소스코드를 그 위치로 이동할 수도 있다.
따라서 프로그램에 필요한 모든 것과 거기에 설치되는 모든 도구가 포함된 캡슐화된 가상 머신이기 때문에 도커 ,컨테이너와 동일한 결과를 얻을 수 있다.
모든 것이 캡슐화된 환경인것 이다.
그런 다음 서로 다른 프로젝트에 대해 이러한 환경을 여러 개 가질 수 있고 또한, 가상 머신 구성을 동료와 공유하여 동일한 환경에서 작업하고 있는지 확인할 수도 있다.
이런 방식은 작동은 원활하지만, 몇 가지 문제가 있다.

가장 큰 문제는 가상 운영 체제를 지닌 여러 가상 머신에서 발생하는 오버헤드이다.
모든 가상 머신은 실제로 우리 머신 위에서 실행되는 Stand Alone 컴퓨터와 같다. 따라서 특히 이러한 머신이 여러 대 있는 경우에는 매번 새로운 컴퓨터를 머신 내부에 설치해야 하고 물론 메모리 CPU 또한 우리 하드 드라이브의 공간을 낭비하게 된다.
결과적으로 시스템에 가상 머신이 점점 더 많아진다면 문제가 될것이다.

모든 가상 머신에서 리눅스를 사용한다고 해도 여전히 모든 머신에 별도로 설치되어 있다.
그리고 이것은 당연히 많은 공간을 낭비한다. 또한 가상 머신에 다른 도구들도 많이 설치 되어있다.
그러한 도구들은 애플리케이션에 직접적으로 필요하지 않지만 여전히 Default 로 설정되어 있다.

요약하자면 가상 머신에는 몇 가지 장단점이 있다.
장점으로는 분리된 환경을 생성할 수 있고 그 안에 환경별로 구성을 설정 할 수 있으며 모든 것을 안정적으로 공유하고 재생산 할 수 있지만 낭비되는 공간이 발생한다.

호스트 시스템 위에 추가 시스템이 실행되고 있기 때문에 성능이 나빠질 수 있으며 특히 이러한 시스템이 여러개 있는 경우 실제로 그 성능은 저하(느리다)된다.

만약 재생산 및 공유가 가능하더라도 정확히 동일한 방식으로 구성해야 하기 때문에 까다롭다.

**"공유할 수 있는 단일한 구성 파일이 없다."

개발에서 제품 생산으로 애플리케이션을 배포하려면 가상 머신과 동일한 방식으로 Production Machine을 구성해야 하고 또한, Production Machine에서 가상 머신을 실행하지만 성능이 낭비되므로 Production Machine에서는 그러고 싶지 않을 수 있기 때문이다.

따라서 문제를 해결할 수는 있지만 완벽한 방법은 아니란것이다.

결과적으로 이것을 도커가 도와주지만 실질적으로 컨테이너가 핵심 개념이긴 하다!

4. 그렇다면, 도커가 어떻게 도와주는 건데?

컨테이너가 가상머신 보다 더 나은 방식으로 문제를 해결하는 방법은 무엇일까?
컨테이너를 사용하면 호스트 운영체제, Windows, Mac OS, Linux 가 존재하지만, 하나의 머신에 몇 대의 머신을 설치하진 않는다.
그 대신에, 우리는 운영체제가 기본적으로 내재하고 있거나 컨테이너 에뮬레이트를 지원하는 내장 컨테이너를 활용하고 도커는 이것이 작동하도록 처리한다.
그리고 그 위에 도커 엔진(Docker Engine)이라는 도구를 실행한다.

뿐만 아니라, 그것을 설치할 때 도커에 의해 모두 설정되고, 그 다음으로 현재 시스템에서 실행되는 도커 엔진을 기반으로 하여 컨테이너를 가동할 수 있다.
도커엔진은 하나의 도구에 불과하며 여기에는 가벼운 소형 도구가 설치되어 있을 뿐이며 여러개의 컨테이너로 분리할 수 있는 것이다.

예를 들어 NodeJS와 같이 코드에 필요한 중요한 도구 및 런타임이 포함되어 있지만 부풀려진 운영 체제, 수많은 추가 도구 또는 이와 유사한 것들을 포함하진 않는다.
컨테이너 내부에 작은 운영 체제 Layer가 있을 순 있지만 가상 머신에 설치하는 것보다 훨씬 작은 운영체제의 매우 가벼운 버전일 뿐이다.

5. 컨테이너의 장점

  • 구성 파일을 사용하여 컨테이너를 구성하고 이를 설명할 수 있다.
  • 구성 파일을 다른 사람들과 공유하여 다른 사람들이 컨테이너를 다시 만들 수 있도록 하거나 컨테이너를 이미지에 빌드할 수도 있고, 그 이미지를 다른 사람과 공유하여 모든 사람이 자신의 시스템에서 공유한 주체에 있는 동일한 컨테이너를 시작할 수 있도록 할 수 있다.
  • 운영 체제와 시스템에 미치는 영향이 적다.
  • 매우 빠르다.
  • 최소한의 디스크 공간을 사용하며 이미지와 구성파일이 있기 때문에 공유, 재구축 및 배포하는 것이 매우 쉽다.
  • 필요한 모든 것(환경)을 캡슐화했기 때문에 쓸데 없이 부가적인 것이 없다
profile
무럭무럭 자라볼까

0개의 댓글