Docker는 lxc-tools (사용자 공간 LXC 도구)에 무엇을 추가합니까?


398

Docker의 기능을 살펴보면 LXC에서 대부분 제공합니다.

Docker는 무엇을 추가합니까? 일반 LXC보다 Docker를 사용하는 이유는 무엇입니까?

답변:


550

로부터 부두 노동자 자주 묻는 질문 :

Docker는 lxc를 대체하지 않습니다. "lxc"는 서로 샌드 박싱 프로세스를 허용하고 리소스 할당을 제어 할 수있는 Linux 커널 (특히 네임 스페이스 및 제어 그룹)의 기능을 나타냅니다.

Docker는이 저수준의 커널 기능 기반 외에도 몇 가지 강력한 기능을 갖춘 고급 도구를 제공합니다.

  • 여러 시스템에 이식 가능Docker는 응용 프로그램 및 모든 종속 항목을 단일 객체로 묶는 형식을 정의하여 모든 도커 지원 시스템으로 전송할 수 있으며 응용 프로그램에 노출 된 실행 환경이 동일하다는 것을 보장하면서 실행할 수 있습니다. Lxc는 프로세스 샌드 박스를 구현하는데, 이는 휴대용 배포를위한 중요한 전제 조건이지만 휴대용 배포로는 충분하지 않습니다. 사용자 정의 lxc 구성으로 설치된 응용 프로그램의 사본을 나에게 보내면 네트워킹, 스토리지, 로깅, 배포, 시스템의 특정 구성과 관련되어 있기 때문에 내 시스템에서 실행되지 않을 것입니다. Docker는 이러한 머신 별 설정에 대한 추상화를 정의하므로 동일한 도커 컨테이너가 변경되지 않은 여러 머신에서 실행될 수 있습니다.

  • 응용 프로그램 중심. Docker는 컴퓨터와 달리 응용 프로그램 배포에 최적화 되어 있습니다. 이는 API, 사용자 인터페이스, 디자인 철학 및 문서에 반영되어 있습니다. 반면, lxc 도우미 스크립트는 컨테이너를 경량 시스템으로 초점을 맞 춥니 다. 기본적으로 더 빠르게 부팅하고 램이 더 적은 서버입니다. 컨테이너보다 더 많은 것이 있다고 생각합니다.

  • 자동 빌드 . Docker에는 개발자가 응용 프로그램 종속성, 빌드 도구, 패키징 등을 완벽하게 제어하여 소스 코드에서 컨테이너를 자동으로 조립할 수있는 도구가 포함되어 있습니다. 이들은 make, maven, chef, puppet, salt, debian 패키지, rpms, source 기계의 구성에 관계없이 타르볼 또는 위의 조합 .

  • 버전 관리. Docker에는 컨테이너의 연속 버전 추적, 버전 간 차이 검사, 새 버전 커밋, 롤백 등을위한 git-like 기능이 포함되어 있습니다. 히스토리에는 컨테이너가 어떻게 조립되고 누구에 의해 작성 되었는가 도 포함되어 있으므로 프로덕션 서버에서 완전한 추적 성을 얻을 수 있습니다. 다시 업스트림 개발자에게 돌아갑니다. Docker는 "git pull"과 유사한 증분 업로드 및 다운로드를 구현하므로 diff 만 보내면 새로운 버전의 컨테이너를 전송할 수 있습니다.

  • 구성 요소 재사용. 컨테이너는 더 전문화 된 컴포넌트를 작성하기 위해 "기본 이미지"로 사용될 수 있습니다. 이는 수동으로 또는 자동화 된 빌드의 일부로 수행 할 수 있습니다. 예를 들어 이상적인 파이썬 환경을 준비하고 10 가지 응용 프로그램의 기반으로 사용할 수 있습니다. 미래의 모든 프로젝트에 이상적인 postgresql 설정을 재사용 할 수 있습니다. 등등.

  • 나누는. Docker는 수천 명의 사람들이 유용한 컨테이너를 업로드 한 공개 레지스트리 ( https://registry.hub.docker.com/ )에 액세스 할 수 있습니다 : redis, couchdb, postgres, irc bouncers, rails app server to hadoop to base images에 대한 컨테이너 다양한 배포판. 레지스트리에는 또한 docker 팀이 유지 관리하는 유용한 컨테이너의 공식 "표준 라이브러리"가 포함되어 있습니다. 레지스트리 자체는 오픈 소스이므로 누구나 내부 서버 배포를 위해 개인 컨테이너를 저장 및 전송하기 위해 자신의 레지스트리를 배포 할 수 있습니다.

  • 도구 생태계. Docker는 컨테이너 생성 및 배포를 자동화하고 사용자 지정하기위한 API를 정의합니다. 기능을 확장하기 위해 docker와 통합 된 수많은 도구가 있습니다. PaaS와 유사한 배포 (Dokku, Deis, Flynn), 다중 노드 오케스트레이션 (maestro, salt, mesos, openstack nova), 관리 대시 보드 (docker-ui, openstack horizon, 조선소), 구성 관리 (chef, puppet), 지속적인 통합 Docker는 컨테이너 기반 툴링의 표준으로 빠르게 자리 매김하고 있습니다.

이게 도움이 되길 바란다!


3
"모든 컨테이너를 기본 이미지로 사용할 수 있습니다"라고 말하면 Docker와 독립적으로 만든 LXC 컨테이너가 아닌 Docker 컨테이너를 의미한다고 가정합니다. 내가 알 수있는 한, Docker 컨테이너를 처음부터 만들 수 없으며 항상 다른 Docker 컨테이너에서 상속해야합니다 (관련 질문 : stackoverflow.com/questions/18274088/… ).
Flimm

18
"docker import"를 사용하여 tarball에서 새 컨테이너를 쉽게 만들 수 있습니다. 예 : "debootstrap raring ./rootfs; tar -C ./rootfs -c. | docker import flimm / mybase".
Solomon Hykes 2009 년

3
Docker에 libcontainer가있어 대체가 아닙니다.
Garet Claborn

3
@GaretClaborn 네, libcontainer는 네임 스페이스와 cgroup에 액세스 할 수있는 자체 라이브러리이기 때문에 Solomon이 말한 모든 것이 여전히 적용됩니다.
John Morales

10
Linux 컨테이너는 chroot, cgroup 및 namespace와 같은 일련의 Linux 기능을 사용하여 프로세스를 제한하고 격리 한 결과입니다. LXC는 이러한 기능을 조작하는 사용자 공간 도구입니다. libcontainer는 LXC의 대안으로 동일한 시설을 조작합니다. Docker는 기본적으로 libcontainer를 사용하지만 대신 LXC를 사용할 수 있습니다. 즉, Docker는 libcontainer / LXC의 최상위에있는 호환성 레이어 이상입니다. 다른 답변이 나열한 추가 기능을 추가합니다.
user100464

71

Docker의 기술적 기능 목록을 살펴보고 LXC가 제공하는 기능과 그렇지 않은 기능 을 확인하십시오.

풍모:

1) 파일 시스템 격리 : 각 프로세스 컨테이너는 완전히 별도의 루트 파일 시스템에서 실행됩니다.

일반 LXC와 함께 제공됩니다.

2) 리소스 격리 : CPU 및 메모리와 같은 시스템 리소스는 cgroup을 사용하여 각 프로세스 컨테이너에 다르게 할당 될 수 있습니다.

일반 LXC와 함께 제공됩니다.

3) 네트워크 격리 : 각 프로세스 컨테이너는 가상 인터페이스와 자체 IP 주소로 자체 네트워크 네임 스페이스에서 실행됩니다.

일반 LXC와 함께 제공됩니다.

4) 기록 중 복사 : 루트 파일 시스템은 기록 중 복사를 사용하여 생성되므로 배포 속도가 매우 빠르며 메모리 절약 및 디스크 절약이 가능합니다.

이것은 Docker가 의존하는 통합 파일 시스템 인 AUFS에서 제공합니다. LXC를 사용하여 AUFS를 직접 설정할 수 있지만 Docker는 표준으로 사용합니다.

5) 로깅 : 각 프로세스 컨테이너의 표준 스트림 (stdout / stderr / stdin)이 실시간 또는 배치 검색을 위해 수집 및 로깅됩니다.

Docker가 제공합니다.

6) 변경 관리 : 컨테이너의 파일 시스템에 대한 변경 사항을 새로운 이미지로 커밋하고 재사용하여 더 많은 컨테이너를 만들 수 있습니다. 템플릿이나 수동 구성이 필요하지 않습니다.

"템플릿 또는 수동 구성"은 LXC에 대한 참조이며,이 두 가지에 대해 알아야합니다. Docker를 사용하면 LXC 구성에 대한 학습없이 가상 머신을 처리하는 데 사용되는 방식으로 컨테이너를 처리 할 수 ​​있습니다.

7) 대화 형 쉘 : 도커는 의사 tty를 할당하고 컨테이너의 표준 입력에 연결할 수 있습니다 (예 : 버리기 대화 형 쉘 실행).

LXC는 이미 이것을 제공합니다.


방금 LXC와 Docker에 대해 배우기 시작했기 때문에 수정이나 더 나은 답변을 환영합니다.


35
IMHO,이 답변은 요점을 놓칩니다. Docker는 이러한 기능을 "제공"하지 않습니다. 단순히 사용하기가 쉽습니다. 간단한 선택을 원한다면 LXC는 격리를 제공하지 않는다고 말할 수 있습니다. 네임 스페이스 는이를 제공하며 LXC는 기본 unshare도구 (또는 직접 clone()syscall) 보다 쉽게 ​​사용할 수 있도록하는 상용 사용자 도구 입니다. 마찬가지로 Docker는 이러한 것들을 더 쉽게 사용할 수있게합니다 (그리고 이미지를 밀거나 당기는 기능과 같이 테이블에 더 많은 기능을 제공합니다). 내 2c.
jpetazzo

6
@ jpetazzo : LXC는 실제로 매우 쉽습니다 .Docker는 이미지를 밀고 당기는 것과 같은 다른 기능을 추가하는 것 외에 어떻게 더 쉽게 만들 수 있습니까?
Flimm

31
@Flimm : Admin Magazine , 16 페이지의 비교가 좋습니다. 34 : Docker는 다른 지원 기술과 함께 LXC를 번들로 제공하고 사용하기 쉬운 명령 줄 인터페이스로 래핑합니다. 컨테이너를 사용 하는 것은 ,, 등의 익숙한 도구없이 update-indexand 같은 명령만으로 Git을 사용하는 것과 비슷 합니다. Docker는 LXC의 "배관"위에 "도자기"계층을 제공하여 더 높은 수준의 개념으로 작업하고 낮은 수준의 세부 사항에 대해 걱정할 필요가 없습니다. read-treeaddcommitmerge
0xC0000022L

4
Docker 컨테이너와 LXC 컨테이너 내에서 UnixBench 벤치 마크를 실행하여 동일한 OS를 실행했으며 LXC는 점수가 우수했습니다. LXC를 기반으로 한 도커이기 때문에 결과에 매우 당황합니다.
gextra

7
Docker의 성능 저하는 디스크 I / O와 관련이 있으므로 AUFS 채택으로 인한 것일 수 있습니다.
gextra

16

LXD 의 개발이 LXC를 지속적으로 향상 함에 따라 위의 게시물 및 답변은 ​​빠르게 구식이되었습니다 . 예, Docker도 여전히 서 있지 않습니다.

LXD는 이제 사용자가 푸시 / 풀에서 기여하거나 재사용 할 수있는 LXC 컨테이너 이미지를위한 저장소를 구현합니다.

LXD의 LXC에 대한 REST API는 이제 매우 간단한 명령 구문을 사용하여 LXC 컨테이너의 로컬 및 원격 작성 / 배포 / 관리를 모두 가능하게 합니다.

LXD의 주요 기능은 다음과 같습니다.

  • 설계에 따른 보안 (권한없는 컨테이너, 리소스 제한 등)
  • 확장 가능 (노트북의 컨테이너에서 수천 개의 컴퓨팅 노드까지)
  • 직관적 (단순하고 명확한 API 및 선명한 명령 줄 경험)
  • 이미지 기반 (더 이상 배포 템플릿이없고 신뢰할 수있는 좋은 이미지 만) 라이브 마이그레이션

OpenStack은이 수 OpenStack은 지금 플러그인 NCLXD 배포에 LXD를 활용하는이 / 대신, VM웨어 등 KVM을 사용하는 OpenStack은에서 가상 머신으로 LXC 컨테이너를 관리

그러나 NCLXD는 기존 HW VM과 LXC VM이 혼합 된 하이브리드 클라우드도 지원합니다.

지원되는 기능 목록은 OpenStack nclxd 플러그인입니다.

stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support

2016 년 4 월 Ubuntu 16.04가 출시 될 때까지 블록 장치 지원, 라이브 마이그레이션 지원과 같은 멋진 기능추가 되었습니다 .


4

도커는 레이어로 구성된 이미지를 사용합니다. 이것은 이식성, 공유, 버전 관리 및 기타 기능 측면에서 많은 것을 추가합니다. 이러한 이미지는 이식 또는 전송이 매우 쉽고 레이어에 있기 때문에 후속 버전의 변경 사항은 이전 레이어에 레이어 형태로 추가됩니다. 따라서 여러 번 포팅하는 동안 기본 계층을 포팅 할 필요가 없습니다. 도커에는 실행 환경이 포함 된 상태로 이러한 이미지를 실행하는 컨테이너가 있으며, 버전을 쉽게 제어 할 수있는 새로운 레이어로 변경 사항을 추가합니다.

그 외에도 Docker Hub는 수천 개의 공개 이미지가있는 좋은 레지스트리이며 OS 및 기타 소프트웨어가 설치된 이미지를 찾을 수 있습니다. 따라서 응용 프로그램에 대한 좋은 출발점을 얻을 수 있습니다.


"내장 레이어"라고 할 때-그 의미는-(A) "신규"레이어에 적용되고 커밋 된 기본 레이어의 사본입니다. 그러면 기본 레이어와 다음 레이어의 연결이 끊어 졌습니까? (B)베이스 층 (들)은 "신규"층에 포함되고 또한 링크되어있다. 따라서 기본 레이어에 대한 변경 사항은 "신규"레이어에 자동으로 반영됩니다. 찾는 설명이 너무 순진한 경우 죄송합니다. :( Kapil
Kapil

도커 이미지는 레이어로 구성됩니다. 세분화 된 용어로 표현하기 위해 레이어가 커밋 될 때까지의 모든 변경 사항은 해당 시점까지 만들어진 이미지 레이어에 존재합니다. 그 이후의 모든 변경 사항은 다음 및 위의 레이어에 추가됩니다. 따라서 새 레이어는 기본 레이어에 연결됩니다. 추가 변경 사항으로 동일한 새 레이어를 다른 기본 레이어에 추가 할 수 있다고 생각하지 않습니다. 그러나 여러 엔터티가 일관성을 유지하고 동일한 기본 계층을 가지려면 동일한 엔터티에 새 엔터티 만 제공하면됩니다.
div

그러나 도커의 현재 개발에 대해서는 업데이트되지 않았으며 위의 설명에서 다루지 않은 도커 이미지 구현에 변경 사항이있을 수 있습니다.
div

더 구체적으로 말하면, 레이어는 서명 (SHA-something, 믿습니다)으로 식별됩니다. 즉, 레이어를 변경 하면 다른 레이어 임을 의미합니다 . @Kapil : 즉, 해당 동작이 옵션 (B)에 다소 가깝지만 실제로 기본 레이어를 변경할 수는 없습니다. (또는 그 문제에 대한 모든 레이어) 이미지는 각 레이어가 순서대로 적용된 레이어 목록으로 구성됩니다. 더 이상 필요하지 않을 때 레이어를 정리할 수 있습니다 (그리고 도커 자체에 의해 자동으로 정리된다고 생각합니다). 즉, 모든 참조 이미지가 삭제 된 경우.
codermonkeyfuel

@Kapil : 솔직히 말해서, 당신의 질문은 아마도 이것에 대한 의견이 아닌 새로운 질문으로 가장 잘 작동 할 것입니다. 왜냐하면 사람들이 스스로 조회 할 수있는 유용한 질문이기 때문입니다. 새로운 질문으로 질문하고 싶은 경우에도 답변 해 드리겠습니다.
codermonkeyfuel

0

이 pithier를 유지하기 위해, 이것은 이미 위의 질문과 대답 입니다 .

그러나 뒤로 물러서서 약간 다르게 대답하면, 도커 엔진 자체는 오케스트레이션을 추가 요소 중 하나로 추가하며 이는 파괴적인 부분입니다. 여러 컨테이너 엔진에서 '어딘가'를 실행하는 컨테이너 조합으로 앱을 실행하기 시작하면 정말 흥미로워집니다. 견고성, 수평 스케일링, 기본 하드웨어에서 완벽한 추상화, 계속 갈 수 있습니다 ...

실제로 당신에게 이것을 제공하는 Docker뿐만 아니라 실제로 Container Orchestration 표준은 Kubernetes입니다.

그런 다음 K8S 아래에 대체 컨테이너 엔진이 있습니다. 흥미로운 것은 Docker와 CRIO입니다. 최근에 빌드되고 데몬이 없으며 Kubernetes 전용 컨테이너 엔진으로 개발되었지만 미성숙합니다. 컨테이너 엔진의 진정한 장기 선택이 될 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.