리눅스 컨테이너 | 컨테이너 생성 단계 분석 1편 – 리눅스 Namespace 최근 답변 104개

당신은 주제를 찾고 있습니까 “리눅스 컨테이너 – 컨테이너 생성 단계 분석 1편 – 리눅스 namespace“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 악분 일상 이(가) 작성한 기사에는 조회수 565회 및 96100 Like 개의 좋아요가 있습니다.

리눅스 컨테이너 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 컨테이너 생성 단계 분석 1편 – 리눅스 namespace – 리눅스 컨테이너 주제에 대한 세부정보를 참조하세요

ㅁ vagrant git주소: https://github.com/choisungwook-vagrant/linux-container.git
ㅁ 목차
0:00 인트로
1:24 실습환경 구축
4:32 배경이해 – 네임스페이스란?
6:37 배경이해 – init process 네임스페이스
7:01 배경이해 실습 – 네임스페이스 확인
8:14 배경이해 실습 – init 프로세스 네임스페이스와 비교
9:10 배경이해 실습 – 네임스페이스가 같다는 의미
11:08 배경이해 – 컨테이너는 프로세스다
13:07 배경이해 실습 – 컨테이너 안에서 실행하는 프로세스는 누가 관리할까?
14:30 도커 컨테이너 네임스페이스
16:37 정리
17:00 2개 도커 컨테이너를 생성하고 네임스페이스 비교
18:07 네임스페이스 종류
18:50 네트워크 네임스페이스 확인
#container #linuxnamespace

리눅스 컨테이너 주제에 대한 자세한 내용은 여기를 참조하세요.

리눅스 컨테이너(Linux Container): 개념, 생성, 사용법, 종류

리눅스 컨테이너(Linux Container)란 리눅스 커널을 공유하는 방식을 사용하여 프로세스 격리 기능을 실행하는 가상화 기술이며, 빠른 속도와 성능 …

+ 여기를 클릭

Source: www.redhat.com

Date Published: 10/26/2021

View: 374

컨테이너란? 리눅스의 프로세스 격리 기능 | 44BITS

리눅스 컨테이너는 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술입니다. 하드웨어를 가상화하는 …

+ 여기를 클릭

Source: www.44bits.io

Date Published: 3/21/2022

View: 5709

리눅스 컨테이너에 대해 알아보자 – Tecoble

리눅스 컨테이너란 … 기존 시스템(Host OS)에서 독자적인 시스템 환경(Guest OS)을 분리, 구축하는 기술을 가상화라 합니다. 컨테이너는 기존의 시스템에 …

+ 더 읽기

Source: tecoble.techcourse.co.kr

Date Published: 8/23/2022

View: 5592

Docker 그리고 Linux 컨테이너 기술들 – Opennaru, Inc.

Linux 컨테이너를 살펴보자면 OS의 내부는 물리적 자원을 관리하는 ‘커널 공간 “과 사용자 프로세스 (애플리케이션)을 실행하는”사용자 공간 “으로 나뉩니다. 컨테이너 형 …

+ 여기에 표시

Source: www.opennaru.com

Date Published: 1/24/2022

View: 2520

리눅스 컨테이너란 – 네이버 블로그

리눅스 컨테이너의 줄임말로 OS 수준의 가상화를 구현하는 도구다. 주로 시스템 컨테이너를 관리하기 위해 사용되지만 애플리케이션 컨테이너를 실행 …

+ 여기에 표시

Source: m.blog.naver.com

Date Published: 6/7/2021

View: 881

The future of Linux Containers 리눅스 컨테이너의 미래

리눅스 컨테이너(Linux Container)와 하이퍼바이저(Hypervisor). 이렇게 많은 사람들이 도커에 관심을 보이는 이유는 뭘까. 그 이유를 정확히 이해하기 위해서는 리눅스 …

+ 여기에 자세히 보기

Source: dataonair.or.kr

Date Published: 3/17/2021

View: 5339

리눅스 컨테이너(Linux Containers, LXC)에 대해서 알아보자

단일 리눅스 시스템에 동작하고 있는 프로세스를 격리시켜 각 프로세스마다 독자적인 리눅스 시스템 환경을 구축하는 것을 리눅스 컨테이너라 합니다.

+ 더 읽기

Source: medium.com

Date Published: 11/13/2022

View: 2655

리눅스 컨테이너란? 가상머신과의 차이, Docker Daemon에 …

프로세스나 쓰레드를 그룹화해서 관리하는 기능, 시스템의 CPU, 메모리, 디스크I/O 등 리소스의 사용을 제한하는 기술이다. 리눅스 컨테이너는 호스트의 …

+ 자세한 내용은 여기를 클릭하십시오

Source: simroot.tistory.com

Date Published: 1/11/2021

View: 5176

Linux) Doker와 Container의 탄생과 설명, 차이점

What is Docker? 도커는 리눅스의 컨테이너라는 기술(LXC)를 이용한 소프트웨어로 지금은 자체 라이브러리인 libcontainer를 사용하고 있습니다.

+ 여기에 더 보기

Source: hwan-shell.tistory.com

Date Published: 6/3/2021

View: 2604

주제와 관련된 이미지 리눅스 컨테이너

주제와 관련된 더 많은 사진을 참조하십시오 컨테이너 생성 단계 분석 1편 – 리눅스 namespace. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

컨테이너 생성 단계 분석 1편 - 리눅스 namespace
컨테이너 생성 단계 분석 1편 – 리눅스 namespace

주제에 대한 기사 평가 리눅스 컨테이너

  • Author: 악분 일상
  • Views: 조회수 565회
  • Likes: 96100 Like
  • Date Published: 2021. 7. 10.
  • Video Url link: https://www.youtube.com/watch?v=EV4LyUJrw5E

리눅스 컨테이너(Linux Container): 개념, 생성, 사용법, 종류

애플리케이션을 개발하고 있다고 가정해 봅시다. 귀하는 노트북으로 작업하며 특정하게 설정된 환경을 사용하고 있습니다. 이때 다른 개발자들의 구성은 약간 다를 수 있습니다. 귀하가 현재 개발 중인 애플리케이션은 이 구성을 사용하고 특정 라이브러리, 종속성 및 파일에 의존하고 있으며, 동시에 회사는 자체 설정과 지원 파일 세트에 준하여 표준화된 개발 및 프로덕션 환경을 갖추고 있습니다. 이때, 서버 환경을 재구축하는 부가적인 작업 없이 가능한 한 로컬에서 이러한 환경을 에뮬레이션하려고 합니다. 그렇다면 어떻게 이러한 환경 전체에서 애플리케이션이 작동되게 하고, 품질 검사를 통과하고, 큰 문제나 수정 없이 애플리케이션을 배포할 수 있을까요? 이에 대한 답은 바로 ‘컨테이너’를 사용하는 것입니다.

애플리케이션을 실행하는 컨테이너는 필수 라이브러리, 종속 요소와 파일을 사용하므로 문제없이 원활하게 애플리케이션을 프로덕션으로 진행할 수 있습니다. 사실, 컨테이너 이미지 콘텐츠는 RPM 패키지, 구성 파일 등으로 구성되어 있으므로 Linux 배포 설치로 볼 수도 있습니다. 그러나 컨테이너 이미지 배포가 새로운 운영 체제를 설치하는 것보다 훨씬 간편합니다. 이는 위기가 될 수 있는 문제를 해결하고 모든 사람이 이점을 얻을 수 있게 합니다.

이는 일반적인 예에 불과하며, 이식성, 구성 가능성, 격리가 필요한 경우 Linux 컨테이너를 다양한 문제에 적용할 수 있습니다. Linux 컨테이너의 핵심은 신속하게 개발하고 비즈니스 요구를 민첩하게 충족할 수 있다는 점입니다. Apache Kafka를 통한 실시간 데이터 스트리밍과 같은 일부 경우, 컨테이너는 애플리케이션에 필요한 확장성을 제공하는 유일한 방법이므로 매우 중요합니다. 온프레미스, 클라우드, 하이브리드 중 인프라가 어떤 방식을 취하든, 컨테이너는 사용자의 요구 사항을 충족시킬 수 있습니다. 물론, 적절한 컨테이너 플랫폼을 선택하는 것은 컨테이너 자체만큼 중요합니다.

Red Hat® OpenShift®는 하이브리드 클라우드, 엔터프라이즈급 컨테이너, 쿠버네티스 개발 및 배포에 필요한 모든 사항을 포함하며,

컨테이너란? 리눅스의 프로세스 격리 기능

컨테이너란? 리눅스의 프로세스 격리 기능

리눅스 컨테이너란?

리눅스 컨테이너는 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술입니다. 하드웨어를 가상화하는 가상 머신과 달리 커널을 공유하는 방식이기 때문에 실행 속도가 빠르고, 성능 상의 손실이 거의 없습니다. 컨테이너로 실행된 프로세스는 커널을 공유하지만, 리눅스 네임스페이스Linux namespaces, 컨트롤 그룹cgroup, 루트 디렉터리 격리 등의 커널 기능을 활용해 격리되어 실행됩니다. 이러한 격리 기술 덕분에 호스트 머신에게는 프로세스로 인식되지만, 컨테이너 관점에서는 마치 독립적인 환경을 가진 가상 머신처럼 보입니다.

도커 컨테이너와 가상 머신의 차이

리눅스 컨테이너의 주요한 특징들은 다음과 같습니다.

운영체제 수준의 가상화 : 컨테이너는 운영체제 수준의 가상화 기술입니다. 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유해 컨테이너를 실행하며, 게스트OS 관리가 필요하지 않습니다.

: 컨테이너는 운영체제 수준의 가상화 기술입니다. 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유해 컨테이너를 실행하며, 게스트OS 관리가 필요하지 않습니다. 빠른 속도와 효율성 : 하드웨어 에뮬레이션이 없기 때문에 컨테이너는 아주 빠르게 실행됩니다. 프로세스 격리를 위해 아주 약간의 오버헤드가 있지만 일반적인 프로세스를 실행하는 것과 거의 차이가 없습니다. 또한 하나의 머신에서 프로세스만큼 많이 실행하는 것이 가능합니다.

: 하드웨어 에뮬레이션이 없기 때문에 컨테이너는 아주 빠르게 실행됩니다. 프로세스 격리를 위해 아주 약간의 오버헤드가 있지만 일반적인 프로세스를 실행하는 것과 거의 차이가 없습니다. 또한 하나의 머신에서 프로세스만큼 많이 실행하는 것이 가능합니다. 높은 이식성 portability : 모든 컨테이너는 호스트의 환경이 아닌 독자적인 실행 환경을 가지고 있습니다. 이 환경은 파일들로 구성되며, 이미지 형식으로 공유될 수 있습니다. 리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용할 경우 컨테이너의 실행 환경을 공유하고 손쉽게 재현할 수 있습니다.

: 모든 컨테이너는 호스트의 환경이 아닌 독자적인 실행 환경을 가지고 있습니다. 이 환경은 파일들로 구성되며, 이미지 형식으로 공유될 수 있습니다. 리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용할 경우 컨테이너의 실행 환경을 공유하고 손쉽게 재현할 수 있습니다. 상태를 가지지 않음stateless: 컨테이너가 실행되는 환경은 독립적이기 때문에, 다른 컨테이너에게 영향을 주지 않습니다. 도커와 같이 이미지 기반으로 컨테이너를 실행하는 경우 특정 실행 환경을 쉽게 재사용할 수 있습니다.

컨테이너의 종류: 시스템 컨테이너와 애플리케이션 컨테이너

컨테이너는 크게 시스템 컨테이너와 애플리케이션 컨테이너로 나뉩니다.

시스템 컨테이너system container 시스템 컨테이너는 컨테이너 기술들을 사용해 운영체제 위에 하드웨어 가상화 없이 운영체제를 실행합니다. 일반적인 리눅스처럼 init 프로세스 등을 사용해서 다수의 프로세스가 같은 환경을 공유하는 것을 목표로 합니다. 시스템 컨테이너를 지향하는 컨테이너 런타임으로는 대표적으로 LXC와 LXD가 있습니다. 애플리케이션 컨테이너applcation container 애플리케이션 컨테이너는 컨테이너 기술을 활용해 하나의 애플리케이션(프로세스)를 실행하는 것을 목표로 합니다. 독립적인 환경을 가진다는 점에서는 시스템 컨테이너와 동일하지만, 단 하나의 프로세스만 실행한다는 점에서 확장이 쉽고 관리 요소가 거의 없습니다. 대표적인 애플리케이션 컨테이너 런타임으로는 도커Docker가 있습니다.

컨테이너를 사용해야하는 이유

2014년 애플리케이션 컨테이너 런타임인 도커Docker가 등장하면서 컨테이너 기술이 많은 관심을 받고 있습니다. 서버 운영 면에서 컨테이너는 서버 애플리케이션의 배포 단위를 새로 정의했고, 인프라스트럭처와 클라우드 변화에 큰 변화를 가져왔습니다. 기존의 서버 운영에서는 애플리케이션을 실행하기 위해 서버 컴퓨터의 상태를 지속적으로 관리하야했지만, 컨테이너를 사용하면 애플리케이션 별로 독자적인 환경을 준비하고 관리하는 것이 가능하기 때문에 서버 컴퓨터를 관리할 필요가 적어진다는 장점이 있습니다. 이러한 장점으로 이해 컨테이너 기술의 활용은 2020년 현재 급속하게 확산되고 있는 추세입니다.

프로덕션 운영 관점에서 컨테이너가 어떤 장점이 있는지 궁금하다면 다음 글을 참고해주세요.

왜 굳이 도커(컨테이너)를 써야 하나요? – 컨테이너를 사용해야 하는 이유 컨테이너는 서버 애플리케이션을 배포하고 서버를 운영하는 표준적인 기술이 되어가고 있습니다. 하지만 처음 사용해본다면 그 장점이 잘 와닿지 않을 수도 있습니다. 왜 굳이 도커 컨테이너를 사용해야할까요? 이 글에서는 눈송이 서버를 넘어 컨테이너가 애플리케이션 배포와 운영에 있어 어떤 장점이 있는지 알아봅니다.

컨테이너 기반 서비스 운영 사례

컨테이너를 프로덕션 레벨에서 사용한 가장 유명한 사례는 구글입니다. 쿠버네티스Kubernetes를 조 베다Joe Beda의 발표 대규모 컨테이너 운영Containers At Scale에 따르면, 구글에서는 2014년에 이미 모든 서비스를 컨테이너에서 운영하고 있었으며 매주 20억 개 이상의 컨테이너를 실행했습니다. 이에 대해서는 구글의 컨테이너 페이지에도 설명되어 있습니다.

Gmail에서 YouTube, Google 검색에 이르기까지 Google의 모든 제품은 컨테이너에서 실행됩니다. 개발팀은 컨테이너화를 통해 더욱 신속하게 움직이고, 효율적으로 소프트웨어를 배포하며 전례 없는 수준의 확장성을 확보할 수 있습니다. Google은 매주 20억 개가 넘는 컨테이너를 생성합니다.

리눅스 컨테이너를 구현하는 기능들은 10년 이상 이전에도 존재했습니다만, 파편화되어있었습니다. 이러한 기능을 모아놓은 LXC 등이 있었지만 시스템 컨테이너를 지향해왔습니다. 따라서 컨테이너는 마치 운영체제처럼 동작하기 때문에 실행 환경을 온전하게 이식하는 것이 쉽지 않았습니다. 도커의 등장과 함께 애플리케이션 컨테이너 기술이 각광 받기 시작했고, 빠르게 퍼져나갔습니다. 현재는 구글을 비롯해 넷플릭스Netflix, 에어비앤비Airbnb, 핀터레스트Pinterest, 레딧Reddit, 포켓몬 고Pocketmon Go, 스포티파이Spotify, 틴더Tinder, 라이엇 게임즈Riot Games 등이 컨테이너로 서비스를 운영하고 있는 것으로 알려져있습니다.

국내 기업으로는 삼성전자, 삼성SDS, 당근마켓, VCNC, 우아한형제들, 엔씨소프트, 토스 등의 사례가 있습니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

컨테이너 런타임

컨테이너 런타임은 컨테이너를 실행하고 관리하는 도구입니다.

도커(Docker)

도커Docker는 닷클라우드dotCloud의 솔로몬 하이크가 파이콘 2013 USPyCon 2013 US에서 처음 발표한 컨테이너 런타임입니다. 애플리케이션 컨테이너 런타임을 지향했으며, 처음 등장한 이후 빠르게 데 팍토 스탠다드(사실상 표준)로 자리 잡았습니다. 초기의 도커는 LXC를 기반으로 컨테이너를 생성하고 관리했지만, 현재는 containerd와 runc를 기반으로 동작합니다. 유니온 마운트 기반으로 효율적으로 실행 환경을 이미지로 만들고 공유할 수 있다는 장점이 있습니다. 도커는 기본적으로 서버, 클라이언트 아키텍처를 가지고 있으며 REST API로 조작할 수 있습니다. 또한 CLI 명령어는 깃Git과 비슷해서 개발자들이 쉽게 접근할 수 있습니다.

도커의 기본적인 사용법에 대해서는 다음 글에서 소개하고 있습니다.

도커(Docker) 입문편: 컨테이너 기초부터 서버 배포까지 도커(Docker)는 2013년 등장한 컨테이너 기반 가상화 도구입니다. 도커를 사용하면 컨테이너를 쉽게 관리할 수 있으며, 이미지를 만들어 외부 서버에 배포하는 것도 가능합니다. 이 글은 도커를 시작하는 하는 사람들을 대상으로 도커의 기본 기능에 대해서 소개하고, 도커 허브와 디지털 오션을 사용해 직접 만든 이미지로 서버 애플리케이션을 배포하는 방법을 소개합니다.

도커 허브(Docker Hub)

도커 허브Docker Hub는 도커에서 제공하는 공식 원격 이미지 저장소입니다. 도커가 처음에 자리잡는 데 가장 중요한 역할을 했던 게 바로 도커 레지스트지(도커 허브의 초기 이름)이빈다. 기존의 컨테이너 기술들의 접근성이 떨어졌던 이유 중 하나로 실행 환경을 공유하는 것이 쉽지 않다는 점을 꼽을 수 있습니다. 시스템 컨테이너의 경우 실행 환경이 무거울 뿐만 아니라, 변경 사항을 적절하게 저장하고 공유하는 것이 어려웠습니다. 이와 달리 도커에서는 유니온 마운트 기반의 이미지 개념을 도입해 실행 환경을 효율적으로 관리하고 적절한 단위로 공유할 수 있습니다. 도커 허브를 통해 이미지를 쉽게 전달하거나 공유할 수 있도록 함으로써 접근성을 높였습니다.

원격 이미지 저장소를 직접 설치해서 사용하는 것도 가능합니다.

도커 레지스트리(Docker Registry): 프라이빗 도커 이미지 저장소 – 설치부터 S3 연동까지 도커(Docker)의 이미지는 도커 레지스트리(Docker Registry) 서버로 공유하는 게 가능합니다. 이 글에서는 프라이빗 도커 이미지 저장소 서버 직접 설치하는 방법과 AWS S3와 연동해서 사용하는 방법을 소개합니다.

클라우드 서비스들에서는 프라이빗 이미지 저장소를 서비스로 제공합니다. 대표적으로 아마존 웹 서비스Amazon Web Service의 아마존 엘라스틱 컨테이너 레지스트리ECR, Amazon Elastic Container Registry, 마이크로서비스 애저Microsoft Azure의 컨테이너 레지스트리Container Registry 등이 있습니다. CNCF에서 관리하고 있는 오픈소스 도커 레지스트리 프로젝트 하버Harbor도 있습니다.

도커 컴포즈(Docker Compose)

도커 컴포즈Docker Compose는 다수의 컨테이너를 쉽게 관리할 수 있도록 도와주는 도구입니다. 원래는 피그Fig라는 도커와 무관한 프로젝트였습니다만, 2014년 7월 도커 사가 인수했습니다. 도커 명령어가 주로 하나의 컨테이너를 조작하는 데 사용되는 반면, 도커 컴포즈를 사용하면 YAML 형식으로 컨테이너들의 명세를 작성한 후에 컨테이너를 한꺼번에 실행하거나 종료할 수 있습니다. 도커 컴포즈는 로컬 개발 환경을 구성하는 데 사용하거나, 컨테이너 오케스트레이션 구성 이전에 초기 단계의 배포 작업에 사용되곤 합니다.

도커(Docker) 컴포즈를 활용하여 완벽한 개발 환경 구성하기 개발 환경을 구축하기란 그리 쉬운 일이 아닙니다. 문서화를 해두어도 누군가 계속 신경쓰지 않으면 내용이 낡기 마련이고, 계속 신경 쓰자니 이 또한 쉽지 않죠. 어떻게 하면 손쉽게 개발 환경을 구성하고, 곧바로 개발 과정에 들어갈 수 있을까요? 이 글에서는 도커를 사용하여 개발 환경 구성을 손쉽게 해결하는 방법을 알아보겠습니다.

LXC

LXC는 리눅스 컨테이너Linux Containers의 줄임말로, OS 수준의 가상화를 구현하는 도구입니다. 주로 시스템 컨테이너를 관리하기 위해 사용되지만, 애플리케이션 컨테이너를 실행하거나 관리하는 것도 가능합니다. 도커가 처음 공개되었을 때는 내부적으로 컨테이너를 실행하는 데 사용되기도 하였습니다.

LXD

LXD는 새로운 시스템 컨테이너를 지향하는 컨테이너 도구입니다. LXC와 마찬가지로 컨테이너를 실행하고 관리하는 도구입니다. LXC에 비해서 기능이 강화되었으며, 편리한 인터페이스를 제공하고, REST API로 조작하는 것이 가능합니다. LXD는 단순히 LXC를 개선한 도구는 아니며, 내부적으로 컨테이너를 실행할 때는 LXC를 사용합니다.

CRI-O

크리-오cri-o는 쿠버네티스를 위한 경량 컨테이너 런타임 프로젝트로 현재 CNCFCloud Native Computing Foundation에서 인큐베이팅 단계로 관리하고 있습니다. 크리-오는 OCIOpen Container Initiative 표준을 따르는 런타임으로 쿠버네티스 CRIKubernetes Container Runtime Interface를 구현하고 있습니다. 도커보다 가벼운 컨테이너 런타임으로 쿠버네티스 지원을 지향하고 있습니다.

CRI-O의 아키텍처 구성도. 공식 사이트에서 발췌

카타 컨테이너(Kata Container)

카타 컨테이너Kata Container는 오픈스택 재단OpenStack Foundation에서 개발중인 경량 VM 기반으로 컨테이너를 실행하는 런타임입니다. 컨테이너와 가상머신의 가장 중요한 차이는 호스트 머신과 커널을 공유하는지로 나눌 수 있습니다만, 카타 컨테이너는 컨테이너 전용 가상 머신을 준비한다는 점에서 제 3의 접근이라고 할 수 있습니다. 경량 VM을 사용하기 때문에 일반적인 가상 머신보다 훨씬 빠르며, 가상 머신이기 때문에 커널을 공유하는 일반적인 컨테이너보다 훨씬 안전한 샌드박스를 구현하는 것이 가능합니다.

일반적인 컨테이너 런타임과 카타 컨테이너의 비교. Leveraging Containers and Openstack에서 발췌

카타 컨테이너에 대한 더 자세한 소개는 다음 글을 참고해주세요.

하코니와(Haconiwa)

하코니와는 DSL로 리눅스 컨테이너들에서 사용되는 프로세스 격리 기능들을 조합해 자신만의 컨테이너를 만들어볼 수 있는 프로젝트입니다. 리눅스 컨테이너를 구현하는 데 사용되는 기술로는 리눅스 네임스페이스Linux namespace, 컨트롤 그룹cgroup, 리눅스 캐퍼빌리티Linux Capabilities, 바잉드 마운트, chroot 등 다양한 기능들이 있습니다. 도커를 비롯한 컨테이너 런타임에서는 이러한 기능들을 하나의 세트로 제공하고, 세부적인 설정을 지원하지 않습니다. 하코니와를 사용하면 이러한 기능들을 조합해 커스텀한 컨테이너를 만들어볼 수 있습니다. 컨테이너 기술의 이해를 도와주는 프로젝트입니다.

컨테이너 오케스트레이션

컨테이너 오케스트레이션은 다수의 컨테이너를 적절하게 분산하고 스케줄링하는 방법과 도구입니다. 대표적으로 구글이 처음에 주도하고 현재는 CNCF에서 관리하고 있는 쿠버네티스가 있습니다.

쿠버네티스(Kubernetes)

쿠버네티스Kubernetes는 구글의 엔지니어 조 베다Joe Beda, 브렌던 번스Brendan Burns, 크레이그 맥룩키Craig McLuckie 등이 주도적으로 시작한 컨테이너 오케스트레이션 도구로 2014년 중반 오픈소스로 공개되었습니다. 쿠버네티스는 컨테이너 오케스트레이션 분야에서 데 팍토 스탠다드로 자리 잡았으며, 현재는 온프레미스, 클라우드 환경 가릴 것 없이 많은 서비스들이 쿠버네티스 위에서 동작하고 있습니다.

아마존 ECS(Amazon ECS)

아마존 ECSAmazon Elastic Container Service는 아마존 웹 서비스Amazon Web Service에서 완전 관리형으로 제공되는 컨테이너 오케스트레이션 서비스입니다. 비교적 개념이 단순하고, 다른 AWS 서비스와의 상성이 좋다는 단점이 있지만 커뮤니티가 작고 오픈소스가 아니라는 단점이 있습니다. AWS에서는 쿠버네티스 마스터 노드를 관리형으로 제공하는 EKSElastic Kubernetes Service를 제공하는 한편, ECS도 지속적으로 개선해나가고 있습니다.

AWS ECS로 시작하는 컨테이너 오케스트레이션 컨테이너는 격리된 환경에서 애플리케이션을 실행할 수 있도록 도와줍니다. 컨테이너를 프로덕션 환경에서 사용하기 위해서는 적절한 스케줄링과 관리를 위한 도구가 필요합니다. 이 글에서는 AWS에서 제공하는 매니지드 컨테이너 오케스트레이션 서비스인 ECS를 소개합니다.

랜처(Rancher)

랜처는 쿠버네티스 기반의 컨테이너 오케스트레이션 도구입니다. 기존의 랜처 1.0에서는 도커 기반의 컨테이너 오케스트레이션을 구현했습니다만, 2.0 버전은 쿠버네티스를 기반으로 동작합니다.

노마드(Nomad)

노마드Nomad는 오픈소스로 인프라스트럭처 관련 도구를 만드는 하시코프HashiCorp에서 내놓은 컨테이너 오케스트레이션 도구입니다. 노마드는 태스크 관리와 스케줄링에 집중하고 있는 도구로 반드시 컨테이너를 사용하지 않더라고 사용할 수 있습니다. 또한 다른 도구들에 비해서 비교적 단순하다는 장점이 있습니다.

컨테이너에서 사용하는 프로세스 격리 기능

컨테이너 구현에는 리눅스 네임스페이스, 루트 디렉터리 격리, 컨트롤 그룹, 캐퍼빌리티, 유니온 마운트 외에 다양한 리눅스 커널의 기능들이 사용됩니다.

리눅스 네임스페이스(Linux namespace)

리눅스 네임스페이스Linux namespace는 특정 프로세스의 리눅스 리소스 접근을 제어하기 위해 사용되는 기능입니다. 네임스페이스는 리소스 별로 IPC 네임스페이스, 마운트 네임스페이스, 네트워크 네임스페이스, PID 네임스페이스, 사용자 네임스페이스, UTS 네임스페이스, 컨트롤 그룹 네임스페이스 등으로 나뉩니다. 시스템 상에서 실행되는 프로세스들은 기본적으로 init 프로세스의 네임스페이스를 공유하지만 시스템콜이나 unshare 명령어를 사용해 리소스 별로 네임스페이스를 분리하는 것이 가능합니다.

PID 네임스페이스는 프로세스의 ID를 격리할 수 있는 네임스페이스입니다. 프로세스 ID를 격리해서 마치 컨테이너가 init 프로세스(pid)인 것처럼 실행해줍니다. PID 네임스페이스에 대한 좀 더 자세한 내용은 다음 글에서 다루고 있습니다.

도커(Docker) 컨테이너는 가상 머신인가요? 프로세스인가요? 도커 컨테이너는 가상 머신과 비슷한 특징을 가지고 있습니다. 독립적인 파일 시스템 환경을 가지고 있고, 프로세스 아이디도 호스트와 다르고, 네트워크도 격리되어 있습니다. 하지만 분명 가상 머신은 아닙니다. 이 글에서는 도커 컨테이너가 가상머신과 어떻게 다르고, 호스트 입장에서는 단순히 프로세스라는 것을 직접 확인해봅니다.

네트워크 네임스페이스는 프로세스 별로 고유한 네트워크 환경을 구축할 수 있도록 도와줍니다. 프로세스에 전용 IP를 할당하거나 네트워크 인터페이스를 추가하고 설정할 수 있습니다. 네트워크 네임스페이스는 ip 명령어로 조작할 수 있으며, 다음 글에서 기본적인 사용법을 소개하고 있으니 참고해주세요.

ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크 – 컨테이너 네트워크 기초 2편 네트워크 네임스페이스는 프로세스 간의 네트워크를 격리해주는 매우 강력한 도구입니다. 리눅스에서는 ip를 사용해 네트워크를 조회하는 것 뿐만 아니라 네트워크 네임스페이스를 제어하는 용도로도 사용됩니다. 이 글에서는 네트워크 네임스페이스 사용법과 함께 veth(가상 인터페이스)와 가상 브리지로 직접 컨테이너 네트워크 환경을 구축해봅니다.

UTS 네임스페이스는 호스트 네임과 NIS 도메인 이름을 격리하는 네임스페이스입니다. 네트워크 네임스페이스와 함께 사용되는 경우가 많습니다.

UTS 네임스페이스를 사용한 호스트네임 격리 – 컨테이너 네트워크 기초 1편 컨테이너는 하드웨어 가상화 없이 프로세스를 격리하는 기술로 루트 디렉터리 격리와 유니온 마운트를 비롯해 리눅스 네임스페이스와 같은 리눅스의 기능들을 활용합니다. 이 시리즈에서는 컨테이너의 네트워크 격리와 관련된 기술을 소개합니다. 첫 번째 글에서는 호스트네임을 격리하는 UTS 네임스페이스에 대해서 소개합니다.

루트 디렉터리 격리와 chroot

컨테이너는 호스트의 파일 시스템이 아닌 별도의 실행 환경을 가지고 있습니다. 이 때 사용되는 기술이 바로 루트 디렉터리 격리 기술로 chroot , pivot_root 와 같은 시스템 콜이 이용됩니다. 이를 통해 프로세스가 바라보는 루트 디렉터리를 파일 시스템 상의 특정한 디렉터리로 변경하는 것이 가능합니다. chroot 는 명령어로도 사용할 수 있기 때문에 컨테이너 런타임 없이도 비교적 쉽게 기능을 사용해볼 수 있습니다.

컨테이너 기초 – chroot를 사용한 프로세스의 루트 디렉터리 격리 chroot는 프로세스의 루트 디렉터리를 변경하는 리눅스 시스템콜/명령어입니다. 루트를 변경함으로써 아주 기초적인 단계의 컨테이너를 구현해볼 수 있습니다. chroot는 아주 단순한 프로그램입니다만, 루트가 달라지면 프로세스의 동작 방식 달라져 실제로는 사용하기가 까다로운 편입니다. 이 글에서는 chroot의 기본적인 원리와 사용법에 대해서 소개합니다.

scratch 도커 이미지를 활용한 초경량 이미지 만들기 C 프로그램을 작성하고 이를 동적 링크 컴파일한 경우와 정적 링크 컴파일한 경우로 나눠서 chroot로 실행해봅니다. 그리고 도커(Docker)의 scratch 이미지를 기반으로 같은 방식을 적용하는 법을 소개합니다.

컨트롤 그룹(cgroups)

컨트롤 그룹cgroups은 프로세스에서 사용 가능한 CPU, 메모리, 네트워크 대역폭, 디스크 I/O 등을 그룹 단위로 제어하는 리눅스 커널의 기능입니다. 원래는 프로세스 컨테이너 이름으로 제안되었지만, 나중에 컨트롤 그룹이 되었습니다. 컨트롤 그룹은 컨테이너에서만 사용되는 기능은 아니고, 리눅스 시스템에서 프로세스 관리를 위해 일반적으로 사용되고 있습니다.

리눅스 캐퍼빌리티(Linux capabilities)

리눅스 캐퍼빌리티Linux capabilities는 프로세스의 권한을 제어하는 기능입니다. 리눅스의 프로세스는 크게 루트 권한(사용자 ID 0)으로 실행되는 특권 프로세스와 일반 사용자(사용자 ID 0 이외)가 실행하는 비특권 프로세스로 나뉩니다. 루트의 권한을 세분화해서 프로세스 적용할 수 있도록 만든 기능이 바로 리눅스 캐퍼빌리티입니다. 컨테이너 런타임에서도 일부 루트 권한이 필요한 경우 리눅스 캐퍼빌리티를 사용해 필요한 권한을 지정하는 방식을 지원하고 있습니다.

유니온 마운트(Union Mount)

유니온 마운트는 계층화된 파일 시스템을 구현합니다. 컨테이너에 필수적인 기능은 아니지만, 도커에서 이미지 구현에 사용하면서 필수적인 기능으로 자리잡았습니다. 유니온 마운트를 사용해 효율적인 이미지 구현이 가능할 뿐만 아니라, 이미지 빌드 과정에서 캐시를 사용하거나, 이미지를 관리하는 데도 이점이 있습니다. 유니온 마운트에 대한 더 자세한 내용은 다음 글을 참고해주세요.

도커 이미지 빌드와 Dockerfile 기초 도커(Docker)에서 이미지 빌드는 컨테이너와 함께 가장 중요한 개념입니다. 이미지는 컨테이너의 기반이 되는 파일들의 집합입니다. 사용자는 리눅스 배포판 이미지를 기반으로 자유롭게 프로비저닝을 하고 커스텀 이미지를 만들 수 있습니다. 이 글에서는 도커 이미지의 기본적이 빌드 원리와 Dockerfile의 사용 방법에 대해서 소개합니다.

만들면서 이해하는 도커(Docker) 이미지: 도커 이미지 빌드 원리와 OverlayFS 도커 이미지는 유니온 마운트 기술을 활용해 계층화된 레이어들로 구성되며, 도커 레지스트리를 사용해 쉽고 효율적인 공유를 가능하게 해줍니다. 이 글에서는 도커 이미지가 저장되는 방식과 도커 이미지 빌드의 원리, 그리고 그 바탕이 되는 유니온 마운트 구현체의 하나인 OverlayFS에 대해서 알아봅니다.

Docker 그리고 Linux 컨테이너 기술들

LXC와 비슷한 기술로 “chroot”라는 것이 있습니다.

chroot는 프로세스의 루트 디렉토리를 변경하는 것으로, 이를 통해 프로세스가 액세스 할 수있는 디렉토리를 제한하거나 시스템 라이브러리와 관련 라이브러리를 로드 할 수있다.

그러나 chroot에서 제어 할 수있는 파일이나 디렉토리에 대한 액세스만으로, 네트워크 및 프로세스 등을 컨트롤 할 수는 없습니다.

또한 FreeBSD 에는 chroot를 발전시킨 툴로서 “jail”라는 기능이 탑재되어있습니다. jail는 파일 시스템에 대한 액세스뿐만 아니라 프로세스 및 장치 등의 자원에 대해서도 제어가 가능합니다.

LXC가 jail과 유사한 개념으로 구현 되었습니다.

cgroups은 OS가 관리하는 다양한 리소스를 중앙에서 제어하기 위한 도구입니다. 리소스를 그룹화하고 각 그룹에 대해 우선 순위 및 사용 가능한 리소스를 제한하거나 그룹을 분리하고 다른 그룹에서는 보이지하는 등 기능을 제공합니다.

cgroups에서 관리하는 대상은 파일 시스템이나 프로세스뿐만 아니라 CPU 리소스와 메모리, 각종 디바이스, 네트워크 패킷, 네트워크 인터페이스 등 입니다.

cgroups의 이용 예로는 특정 프로세스에서 사용 가능한 메모리와 CPU 시간 등을 제한하는 것이 있으며, LXC는 프로세스에 대해 chroot 같이 특정 디렉토리를 루트 디렉토리로 인식하도록하며 cgroups의 네임 스페이스 기능을 사용하여 다양한 자원을 격리함으로써 가상 환경을 구현합니다.

컨테이너마다 분할되는 자원에는 다음과 같은 것이 있습니다.

리눅스 컨테이너란

장점

– 운영체제 수준의 가상화

별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유해 컨테이너를 실행하며 게스트 OS 관리가 필요 없다.

– 빠른 속도와 효율성

하드웨어 에뮬레이션이 없기 때문에 아주 빠르게 실행된다. 프로세스 격리를 위해 약간의 오버헤드가 있지만 크지 않다. 또한 하나의 머신에서 프로세스만큼 많이 실행하는 것이 가능하다.

– 높은 이식성(portability)

모든 컨테이너는 호스트의 환경이 아닌 독자적인 실행환경을 가지고 있다. 이 환경은 파일들로 구성되며 이미지 형식으로 공유될 수 있다. 리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용할 경우 컨테이너의 실행 환경을 공유하고 손쉽게 재현할 수 있다.

– 상태를 가지지 않음(stateless)

컨테이너가 실행되는 환경에 독립적이기 때문에 다른 컨테이너에게 영향을 주지 않는다. 도커와 같이 이미지 기반으로 컨테이너를 실행하는 경우 특정 실행 환경을 쉽게 재사용할 수 있다.

The future of Linux Containers 리눅스 컨테이너의 미래

The future of Linux Containers

리눅스 컨테이너의 미래

‘The future of Linux Containers(리눅스 컨테이너의 미래)’는 솔로몬 하익스(Solomon Hykes)가 Pycon2013에서 진행했던 발표 제목이다. 당시 닷클라우드(dotCloud) 직원이던 그는 5분 남짓 짧은 발표를 통해 그동안 개발해온 도커(Docker)를 처음 세상에 공개했다. 발표내용은 정말 간단했다. 프로그래밍 언어를 처음 배울 때 누구나 작성하는 ‘헬로우 월드(Hello World)’를 도커로 찍는 것을 보여줬다. 이 발표는 지금도 유튜브에서 볼 수 있다(맘이 급했는지 ‘Hello Wowlrd’라고 오타를 냈다). blog.docker.com/2013/03/the-future-of-linux-containers/

도커로 ‘Hello World’를 찍는 명령어는 간단하다.

<리스트 1> 도커로 ‘Hello World’ 찍기$docker run busybox echo ‘Hello World’

하지만 다른 ‘Hello World’ 프로그램처럼 이 데모도 도커의 많은것을 보여준다.

– if(busybox 도커 이미지가 없으면) 서버로부터 busybox 이미지를 다운로드

– busybox 컨테이너를 만들고

– 컨테이너에서 stdout으로 ‘Hello World’가 출력되면

– 출력결과가 (컨테이너에서 호스트로 전송되어) 사용자 터미널에 보인다.

언뜻보기에는 화면에 ’Hello World’를 출력하는것처럼 보이지만 실은 가상서버와 유사한 컨테이너를 만들고 그 안에서 echo 명령을 실행하고 컨테이너가 결과를 서버로 전송한다. 도커를 하는 엔지니어로 이 발표를 볼때마다 짜릿함을 느낀다. 지난 2015년 6월23일 도커콘(DockerCon)2015가 샌프란시스코에서 열렸다. 도커 최고경영자(CEO) 벤갈럽(Ben Golub)과 최고기술책임자(CTO) 솔로몬 하익스가 키노트를 했다. 키노트를 통해서 지난 한해동안 도커가 얼마나 성장했는지 숫자로 보여줬다. 2014년과 비교했을때 깃허브(github) 프로젝트 갯수는 515%, 도커 관련 구인은 1,720%, 컨테이너 다운로드수는 18,082% 성장했다. 현재 직업을 찾고 있다면 도커를 배워야 하지 않을.까^^;도커가 빠르게 성장하고 있는 기술이라는 사실은 더이상 설명할 필요가 없다.

리눅스 컨테이너(Linux Container)와 하이퍼바이저(Hypervisor)

이렇게 많은 사람들이 도커에 관심을 보이는 이유는 뭘까. 그 이유를 정확히 이해하기 위해서는 리눅스 컨테이너를 설명하지 않을수 없다.

리눅스컨테이너(LXC)는 단일 리눅스 호스트에 격리된(isolated) 리눅스 시스템을 여러개 실행하는 운영체제(OS) 수준의 가상화 기술이다.리눅스 커널은 가상머신 없이 CPU, 메모리, 블록I/O, 네트워크 같은 리소스를 제한하고 우선순위를 정하기 위해 cgroups기능을 제공하고 애플리케이션 관점에서 운영환경을 완전히 제약하기 위해 namespace 기능을 제공한다. – 위키피디아

리눅스 컨테이너는 최신 기술이 아니다. 이미 나온지 10년이 넘은 구식() 기술이다. 도커가 등장하기 전부터 LXC, OpenVZ, Imctfy, Warden 같은 오픈소스가 이미 존재했다. 그럼 왜 지금까지 널리 쓰이지 못한걸까. 그 이유는 사용성에서 찾을수 있다. LXC는 사용하기 복잡하고 어려워서 일반 사용자가 쉽게 접근할수 없었다. 이런 리눅스 컨테이너의 벽을 도커가 깨뜨린 것이다.

시기도 적절했다고 본다. Xen, KVM, vSphere, Hyper-V 등 많은 하이퍼바이저(Hypervisor) 기술이 경쟁하면서 가상서버의 안정성이 높아졌다. 가상화 기술이 널리 보급되면서 사람들은 가상서버를 사용하는 것에 익숙해졌다. 과거 베어메탈을 쓰던것에 비해 가상서버는 다양한 편의성을 제공했고 서버 효율도 높여주었지만 서면 앉고 싶고, 앉으면 눕고 싶은게 사람 마음다. 하이퍼바이저보다 더 가볍고 빠른 기술을 찾기 시작하면서 리눅스 컨테이너 기술인 도커로 눈을 돌리게 된 것이다. <그림 3>은 도커 컨테이너가 왜 가상머신(VM)에 비해 가벼운지를 나타내는 대표적인 그림이다. 게스트 OS가 필요없는 도커는 더 적은 디스크, 더 적은 메모리에서도 마치 VM처럼 동작한다.

현재 컨테이너를 사용하는 기업들

이쯤되면 슬슬 궁금해져야 한다. 도커와 같은 컨테이너 기술을 사용해서 서비스를 제공하는 회사는 어떤 곳이 있을까 첫번째는 당연히 구글이다. 구글은 이미 10여 년 전부터 컨테이너 기술을 사용해왔다고 발표했다. 앞에서 리눅스 컨테이너 기술을 소개하면서 언급했던 콘트롤그룹(cgroups)도 구글 엔지니어가 2006년부터 시작한 기술이다.

구글이 발표한 논문 ‘Large-scale cluster management at Google with Borg’에 따르면 구글은 보그(Borg)라는 클러스터 매니저를 개발했다. C++로 개발된 보그는 수만대 서버로 구성된 클러스터에 수십만개의 잡(Job)을 실행한다. 보그를 개발하던 엔지니어들은 현재는 쿠버네티스(kubernetes)를 개발한다고 들었다. 쿠버네티스는 고(Go)로 개발됐으며 현재 기준으로 가장 완성도 높은 컨테이너 오케스트레이션 시스템으로 볼 수 있다. 구글 클라우드 플랫폼에서도 사용하고 있다. 지난 5월 ‘오스콘(OSCON)2015’에서 v1을 정식발표했다. 구글은 지메일(gmail)같은 자사 대표 서비스를 모두 컨테이너 기반으로 제공한다.

중국의 구글이라고 부르는 바이두(Baidu) 역시 2013년 말부터 도커를 이용한 플랫폼으로써의 서비스(PasS) ‘바이두 앱 엔진(Baidu App Engine)’을 제공한다. 바이두의 BAE 기술리더 Yifel Chen은 이렇게 발표했다.

우리는 도커에 빠졌다. 컨테이너기술은 앞으로 샌드박스를 대체하게 될 것이다.도커는 우리 개발자들이 필요로 하는 많은 프레임워크와 애플리케이션을 사용할수 있도록 다양한 언어,애자일, 비용효율적인 대안을 제공한다. 도커가 제공하는 위협적인 에코 시스템에 참여하게 되어 기쁘게 생각한다. – 출처 blog.docker.com/2013/12/baidu-using-docker-for-its-paas/

페이스북은 ‘도커콘(DockerCon)2014’에서 ‘Tupperware: Containerized Deployment at FB’ 발표를 통해 LXC기반 컨테이너 관리 시스템 타파웨어(Tupperware)를 소개했다. 15,000개 이상의 서비스를 30만개 이상의 프로세스로 운영하고 있으며 이를 위해 개발한 것이 타파웨어다. 페이스북은 도커가 나오기 전부터 리눅스 컨테이너를 사용했기 때문에 LXC를 사용한다. 바이너리 패키지 저장소를 비트토렌토(BitTorrent) 기반으로 구축한 것도 흥미롭다. 도커 이미지 저장소 성능이슈를 생각한다면 이런 접근이 나온 이유가 성능 때문이라는 걸 짐작할 수 있다. VM 대신 컨테이너를 선택한 이유는 성능상의 불이익을 피하고 하이퍼바이저가 디버깅을 더 어렵게 하기 때문이라고 말한다.

여기서 소개한 구글,바이두,페이스북 사례 외에도 컨테이너 기반으로 서비스를 운영하는 회사는 많다. 대규모 서비스를 제공하면서 VM의 한계를 느끼게 되었고, 이를 넘어 인프라를 효율적으로 운영하기 위해서 컨테이너를 선택한다. 그렇다면 컨테이너가 VM과 비교했을때 좋은점만 있는걸까.

컨테이너 관련 이슈

리눅스 컨테이너 기술에 대한 이슈는 계속 제기되어 왔다. 첫번째 화살은 컨테이너가 IP를 갖지 못한다는 점이었다. 도커고 도커 컨테이너를 실행하면 컨테이너는 ‘docker0’ 네트워크 드라이버를 기준으로 사설 IP를 할당받는다. 이 IP는 해당 서버내에서만 고유하다.

이 말은 서버 외부에서 IP를 통해 컨테이너에 직접 접근할수 없다는 뜻이다. 외부에서 컨테이너에 접근할수 있게 하려면 호스트에 컨테이너를 바인딩 시켜야한다. 이 때문에 포트(Port) 부족현상이 나타난다. 내가 실행한 엔진엑스(nginx) 서버에서 80포트를 쓰고 싶은데 이미 누가 80포트를 사용중이라면 사용할 수 없는 거다. 멀티 호스트간에 컨테이너 네트워킹 이슈에 대한 첫번째 해결책은 앰버서더 패턴이었다.

각 도커 호스트에 컨테이너를 연결하는 앰버서더 컨테이너를 두고 이를 이용해 통신하는 형태였다. 이 형태는 너무 많은 컨테이너를 만들어야 하는 불편이 있었다. 최근에는 오버레이 네트워크 기술을 이용해 이 이슈를 해결하고 있다. 오버레이 네트워크는 네트워크를 가상화하는 기술로서 멀티 호스트들을 연결하는 네트워크 레이어를 가상으로 만들어준다. 이를 위한 오픈소스로는 flannel, Open vSWitch, Weave가 대표적이다. 최근 도커도 이를 위한 기능을 추가하겠다고 발표했다(원래는 1.7에 들어간다고 했으나 1.9에 들어갈것으로 예상된다). 두번째 이슈는 보안이다. 컨테이너는 사실 호스트 서버에서 실행되는 프로세스다. 그렇다보니 VM에 비해 격리수준이 떨어진다. 자신만의 게스트 OS를 가진 가상머신은 해당 서버가 악의적인 사용자의 공격에 의해 위험에 노출된다 해도 그 서버 내로 위험범위를 제한할 수 있다. 그렇지만 격리수준이 떨어지는 컨테이너는 호스트 전체에 영향을 미칠 수 있다.

예를 한 번 들어보겠다. 물리서버에 도커를 설치하고 엔진엑스 컨테이너를 1개 만든다. 도커는 컨테이너를 만들때 CPU 사용률을 지정할수 있다. 예를 들어 사용률을 1로 준 후 이 컨테이너에 부하를 주면 이 컨테이너는 물리서버의 CPU를 거의 사용한다. 다른 프로세스들도 CPU를 쓰기 때문에 100%를 사용하지는 않는다. 이번에는 CPU 사용률을 1로 준 엔진엑스 컨테이너를 2개 만들어 보겠다다. 부하를 주게되면 이번에는 두 개 컨테이너 각각이 대략 50%를 사용한다. 사용률은 고정값이 아니라 비율이다. VM은 이렇게 동작하지 않는다. 처음에 10%를 사용하도록 지정하면 서버에 여유가 있어도 10%만 사용한다. 이 부분은 컨테이너의 장점이기도 하지만 단점으로 보는 사람도 있다.

이런 특징이 위험하다고 생각되면 컨테이너에 CPU 코어를 지정하면 된다. 예를 들어 CPU가 32개 있는 서버에서 6번째 CPU를 지정하겠다면 아래와 같이 컨테이너를 실행한다.

<리스트 2> 컨테이너에 CPU 코어 지정하기$ docker run -d -cpuset=6 nginx

물리머신에 VM을 설치하고 VM내에서 컨테이너를 실행할 수도 있다. 요즘 유행하는 오픈스택 KVM을 만들고 그 안에서 컨테이너를 실행하는 형태다. 이 경우 격리수준은 좋아지지만 VM이 차지하는 만큼의 성능 페널티가 발생한다. VM을 사용하기 싫다면 메소스(Mesos)를 사용할 수도 있다. 메소스 슬레이브(Mesos Slave)에 도커 컨테이너를 실행하게 되면 슬레이브에 의해 제한된 리소스 범위내에서만 컨테이너가 자원을 사용하게 된다(이 경우도 CPU는 완전히 격리되지 않는다). 이 두가지 외에도 다양한 이슈가 있지만 컨테이너를 사용하려는 사람들이 늘면서 다양한 오픈소스가 이를 해결하고 있다.

그래서 미래는

결론이다. 리눅스 컨테이너가 VM에 비해 가볍고 빠르지만 다양한 이슈를 아직 가지고 있다. 그럼에도 많은 기업들은 앞다투어 도커를 도입하고 있다. 구글, 페이스북 같은 글로벌 기업은 물론이고 국내에서도 도커를 이용한 사례가 하나씩 등장하고 있다. 지난 9월 14~15일에 열린 ‘데뷰(DEVIEW)2015’에서 네이버는 도커 기반 빌드배포시스템 십독(ShipDock)을 개발 중이라고 소개했다. 쿠버네티스 기반 빌드서버 풀로 사내에 지속적인 통합(Continuous Delivery) 플랫폼을 구축하기 위한 시도로 보인다. SK플래닛에서도 2014년말부터 도커 기반 클라우드 플랫폼 구축을 위해 프로젝트를 진행하고 있다. 이 프로젝트에 대한 내용은 10월 7일 열리는 ‘테크플래닛(TechPlanet)2015’에서 자세히 소개할 예정이다.

출처 : 마이크로소프트웨어 10월호

리눅스 컨테이너란? 가상머신과의 차이, Docker Daemon에 대하여

반응형

앞서 컨테이너 가상화에 대해 언급을 했다. 리눅스 컨테이너는 컨테이너 가상화 기술을 사용한다.

이 리눅스 컨테이너에는 애플리케이션이나 그에 따라 필요한 라이브러리나 설정파일 등이 포함되어 있다. 가상머신과는 다르게 가상화 계층이 없고 커널이 별도로 존재하지 않기 때문에 가상머신에 비해서 가볍고 실행속도도 빠르다.

리눅스 컨테이너는 예전부터 사용되어졌지만 도커가 개발된 후로부터 최근 활발하게 사용되고 있다. 도커는 리눅스 컨테이너를 다루는 도구중의 하나이며 도커와 같은 다른 도구들도 있으나 대부분 도커를 사용한다. 컨테이너 런타임이라고도 한다.

가상머신과 컨테이너 비교

리눅스 컨테이너의 핵심 기술은 2가지가 있는데 cgroup과 namespace이다.

1. cgroup (control group의 약자)

프로세스나 쓰레드를 그룹화해서 관리하는 기능, 시스템의 CPU, 메모리, 디스크I/O 등 리소스의 사용을 제한하는 기술이다. 리눅스 컨테이너는 호스트의 리소스를 공유하여 사용하는데, 이 때 cgroup을 사용하여 컨테이너가 사용하는 리소스의 양을 제한할 수 있다. 또한 같은 호스트에서 동작하는 서로 다른 컨테이너에 영향을 주지 않도록 막아주는 역할도 한다.

2. namespace

space 공간 안에 다수의 오브젝트를 격리(isolation)할 수 있다. 예를 들어서 동일한 호스트에서 동일한 PID(Process ID)를 가질 수 없지만 서로 다른 namespace에서는 동일한 PID 를 가질 수 있다. 격리되어 있다는 것이 포인트다.

추가로 윈도우 운영체제는 도커 컨테이너를 올릴 수 없으니 하이퍼바이저를 이용해서 도커를 사용한다.

Docker Daemon과 Podman

Docker 의 구성요소 중 하나로 Docker Daemon이 있다.

Docker 동작방식

위의 이미지와 같이 도커는 데몬 위에서 동작한다. 또한 프로그램이 동작하려면 방식이 3가지가 있다.

* 데몬 : 부팅시 올라오는 프로그램들

* 프로그램 동작방식 3가지

1) 부팅시 동작

runlevel 같이 부팅할 때 동작하는 개념이다.

2) 런레벨에 의존하지 않고 항시 동작시키는 방식

예를 들어서 systemctl enable 설정처럼 부팅시 실행되도록 동작시킬 수 있다.

3) /etc/rc.local에 올려서 동작시키는 방식

이 방식은 부팅시 부팅 스크립트의 끝자락에 읽어진다. 스크립트가 읽어지게 되면 항시 프로그램을 동작시킬 수 있다. 스크립트를 많이 추가하다보면 복잡해지기도 하고, 여기 올려서 동작시키려면 신뢰할 수 있고 믿을 수 있는 프로그램만 동작시킨다.

docker를 사용하다보면 docker daemon이 죽을 가능성이 높다보니 데몬 없이 image, container, kernel에 그냥 던져주기 위해서 나온 것이 바로 podman이다. RHCSA시험이 8버전으로 바뀌면서 podman에 대한 내용이 추가되기도 했다.

docker의 또 한가지 문제는 클러스터링(쉽게 말해서 컨테이너들을 묶어주는 것)을 해주는 쿠버네티스(kubernetes)와는 연동이 잘 안된다. 이미지를 한 개만 올리는 것은 docker나 kubernetes나 어느것을 사용해도 상관이 없지만 보통 일반 회사에서는 컨테이너 이미지를 하나씩 올리는 경우는 거의 없다. docker는 가상화해서 올리는 것도 아니다.

podman은 데몬이 아니라 일종의 커맨드처럼 쓰인다. docker는 가상머신에 올리는 것처럼 사용하는 것이 아니지만 podman은 가상머신처럼 사용한다. 운영체제가 올라가고 ssh로 접근해서 제어할 수도 있다. 서비스를 이용하기 위해서는 포트를 열어줘야 한다. 밖에있는 자원을 이용하기 위해서는 마운트도 시켜주는 등 동일하게 사용한다.

Virtualbox같은 가상머신은 HDD를 장치 디바이스에 인식할 수 있도록 계속 추가했었는데, podman은 외부 리소스를 컨테이너에서 사용하고 있는 tcp, port 관련 영역과 맵핑(연결) 시켜준다. 외부의 디스크를 사용하고 싶다면 관련 명령어도 사용할 수 있다.

다시 컨테이너로 돌아와서..

isolation(격리)적인 부분에서도 우수한 것은 가상머신이지만, 지금 컨테이너같은 경우에는 구조상 동작하는 프로세스가 직접 노출된다. 자원들도 isolation 되어있는 것이 아니라 밖에있는 외부 자원을 그대로 가져다 쓴다. 대표적으로 도커허브(docker hub) 같은 곳에서 image를 가져다가 쓴다. official하게 도커허브 자체에서 제공해주는 이미지들도 있지만 사용자가 수정 보완해서 만들어놓은 이미지 또한 pull 명령어를 이용해 다운받아서 사용할 수 있다.

자원을 공유해 사용한다는 것이 편리하고 장점이 있지만 그에 따른 보안 이슈가 존재한다. 외부 자원을 그대로 가져다 쓰는것에 대한 접근 통제가 그만큼 중요시 되고 있다. 실제로 일부 사용자가 만들어놓은 이미지 안에 비트코인 채굴을 위해 다운받아 사용하는 사용자의 CPU를 사용하게 한다거나 랜섬웨어를 깔아놓는 등의 범죄에도 노출되어 있으며 실제 사례이다. 또한 잘못하면 불필요한 정보에 쉽게 노출된다는 단점이 있다.

그럼에도 불구하고 컨테이너기술과 도커, 쿠버네티스는 여전히 핫한 기술이다.

또한 쿠버네티스는 AWS, GCP를 지원해준다. 쿠버네티스를 접할 기회가 있었는데, 요즘에는 거의 컨테이너 오케스트레이션으로 쿠버네티스가 독보적이라고 한다.

위에서 언급한 Podman은 Pod Manager tool 의 약자로 OCI 표준 container와 런타임을 개발, 관리, 실행할 수 있게 해주는 container engine 이다. 레드햇에서 쿠버네티스에 올릴 수 있도록 만들어 놓은 것이다. 도커와 명령어가 완전히 똑같기 때문에 docker라는 이름 대신 podman으로 변경해서 사용하면 쉽게 익숙해질 수 있다. 요즘엔 또 podman으로 컨테이너를 관리해서 쿠버네티스와 연동한다는데 실제로 쓰는 사람은 아직 본 적이 없다.

글을 쓰면서 주제가 조금씩 바뀌기도 해서 내용이 들쑥날쑥이지만, 앞으로는 개념적인 부분도 쉽게 설명할 예정이다.

* 추천 책

가장 빨리만나는 도커(Docker)

* 출처 및 참고자료

https://www.weave.works/blog/a-practical-guide-to-choosing-between-docker-containers-and-vms

https://www.lesstif.com/container/podman-98926748.html

반응형

Linux) Doker와 Container의 탄생과 설명, 차이점

728×90

반응형

※이 글은 제가 인터넷으로 공부한걸 바탕으로 작성된 글입니다. 잘못된 내용이나 보충해야할 내용이 있으면 댓글이나 E-mail로 피드백 해주시면 감사하겠습니다.

What is Docker?

도커는 리눅스의 컨테이너라는 기술(LXC)를 이용한 소프트웨어로 지금은 자체 라이브러리인 libcontainer를 사용하고 있습니다.

위 말만 들으면 도커가 뭐하는건지, LXC는 뭐고 libcontainer는 뭔지… 감이 안잡힙니다.

흔히 웹 검색으로 알 수 있는 지식은 다음과 같습니다.

1. 도커를 이용하면 개발환경에 구에받지 않고 손쉽게 내가 사용하던 개발환경을 구축할 수 있다.

2. 도커를 이용하면 여러개의 독립된 프로세스를 띄워 마이크로서비스가 가능해진다.

3. 도커를 이용하면 배포가 쉽고 수정도 쉽다.

4. 도커는 일반적인 Hypervisor가상화 방식과는 다르게 경량 가상화로 실행이 빠르다. 그로 인해 한개의 서버만 있으면

여러개의 서비스(위에서 말한 마이크로서비스)가 가능해지므로 불필요한 서버 확장이 필요없다.(금전적으로 이득)

5. 도커를 이용하면 여러개의 프로세스(컨테이너)관리가 쉬워진다.

대충 이렇게 정리할 수 있겠습니다.

저는 이 정보를 찾고 다음과 같은 의문이 들었습니다.

1. 리눅스 컨테이너가 왜 탄생했고 이제와서 이렇게 핫한가?

2. 독립된 프로세스? 여러개의 서버환경? 도대체 어떤 원리로 가능하고 이게 무슨 말인가?

3. 도커가 뭔지는 대충 머리속에 잡히긴 하는데 두루뭉실하게 잡힌다. 사용하면 사용하겠지만 뭔가 찝찝한 기분이 든다….

4. 도커도 가상화라고 하는데 Hypervisor(VMware, KVM, etc…)가상화 방식과는 뭐가 다른가??

이러한 이유 때문에 이 글을 작성하게 되었으며 긴 글이 예상됩니다.

저와 같은 궁금증과 고민으로 여기를 찾아오셨다면 도움받고 가셨으면 좋겠습니다.

목차에 대해 설명해보자면 다음과 같습니다.

1. 컨테이너의 탄생 배경.

2. 컨테이너란? (LXC), namespace와 cgroup의 설명.

3. 컨테이너와 도커의 차이점.

4. 도커를 통해 가져갈 수 있는 이점.

그럼 시작하겠습니다.

1. 컨테이너의 탄생 배경

컨테이너가 나오기 전에 비슷한 기술을 FreeBSD에서 사용하고 있었습니다.

그것은 바로 FreeBSD jail입니다. 감옥이라는 뜻인데, 게스트 유저를 가둬둔다는 의미입니다.

이 개념을 알기 위해선 리눅스의 chroot라는 기능을 알아야 합니다.

chroot는 루트 디랙토리를 바꿔주는 기능을 수행하는데, 무슨말이냐? 하면 다음과 같습니다.

일반적으로 리눅스 콘솔창에서 ‘ls /’ 명령어를 입력하면 루트 디렉토리에 대한 목록이 나오게 됩니다.

그럼 Guest 유저가 리눅스 서버에 접속해서 ‘ls /’ 명령어를 입력했을 때 어떻게 될까요??

이건 관리자가 Guest에게 권한을 어떻게 주느냐에 따라 달라지게 됩니다. 접근이 안될수도 있고 될 수도 있고…..

만약 안되게 퍼미션을 걸어버린다면 많은 제약이 따릅니다. 이러한 재약을 좀 더 유연하면서 보안도 유지되는걸 고민해서 탄생한것이

chroot 입니다. chroot를 사용하게 되면 기본 root디렉토리가 변경됩니다.(Guest 유저 한에서…)

만약 Guest유저에 대해 chroot로 루트 디렉토리를 /home 디렉토리로 변경하게되면 다음과 같이 표시되게 됩니다.

‘Guest@ : ls /’

/home

이렇게 말이죠. 즉 Guest 입장에서의 root 디렉토리는 /home 디렉토리가 되는 것입니다.

그럼 루트디렉토리만 바뀌게 되는 것이냐?? 그건 아닙니다.

사용자가 chroot를 설정하면서 설정한 루트 디렉토리(/home) 아래에 Guest가 필요로 하는 참조하는 파일들을 제공함으로 써

Guest는 서버의 불필요한 접근을 할 필요 없이 자신의 일을 수행하면 됩니다.

때문에 보안을 유지하면서 Guest에게 유연성을 제공하는 것이 가능해 졌습니다.

chroot는 대부분의 리눅스에서 설정이 가능하지만 설정 또한 까다롭습니다.

이 개념을 기반으로 2001년 VServer Project 를 통해 Linux에 격리된 공간이 구축되었으며 이것이 발전해 컨테이너란 녀석으로 탄생하게 됩니다.

2. 컨테이너란? (LXC), namespace와 cgroup의 설명

위와 같은 배경으로 탄생한 컨테이너는 리눅스의 시스템 기능 2가지를 기반으로 만들어 집니다.

바로 namespace와 cgroup입니다.

namespace는 프로세스를 독립시켜주는 가상화 기술입니다. 즉 프로세스 ID(PID)가 같아도 서로 다른 프로세스입니다.

vlan 개념과 비슷한데 같은 커널 위에서 돌긴 하지만 namespace로 만들어진 프로세스는 현재 커널에서 작동중인 프로세스와의 충돌이 없습니다.

계속 비슷한 말만 하는데….. 쉽게 말해서 같은공간에 존재하지만 서로 볼 수 없는 그런 녀석으로 생각하면 될 것 같습니다.

이렇게 독립이된 프로세스는 다음과 같은 특징을 같는데, PID, IPC, Network, UID, Mount, UTS가 독립적으로 존재할 수 있습니다.

즉, 프로세스간의 통신을 IP로 해야한다는 뜻입니다.

내부에서 간섭을 받지 않는 격리된 공간(프로세스)를 만들고 나면 cgroup을 사용해 줘야 합니다.

cgroup은 control group의 약자로 하드웨어 자원을 배분하는 기능을 수행합니다.

한마디로 놀고 있는 녀석들(CPU, RAM 등….)의 자원을 사용자가 원하는만큼 격리된 프로세스에 할당해 주게 되는 것입니다.

이렇게 할당하게되면 컴퓨터 성능을 좀 더 효율적으로 사용할 수 있으며,

추 후 컨테이너에 올라가는 응용프로그램마다 필요에 따라 자원을 더 줄 수 있다는 뜻이 됩니다.

namespace와 cgroup으로 만들어진 컨테이너를 LXC(LinuX Container)라고 부르며,

독립된 공간의 프로세스 위에 사용자가 원하는 기능을 올릴 수 있게 됩니다.

OS를 올리고, 해당 OS위에 JAVA서버, nodejs, FTP, DB, etc…. 여러가지를 말이죠….

마치 Hypervisor의 VMware나 KVM과 비슷해보이지만 엄연히 다릅니다.

출처 : https://cloud.google.com/containers/?hl=ko

위 그림을 보면 알겠지만 VM은 Hypervisor위에 Guest OS 가 올라갑니다. 즉, 하드웨어를 논리적으로 가상화를 하고 그 위에 OS를 통째로 올리게 됩니다.

OS는 상당히 무겁습니다. 설치가 완료되면 20GB정도는 우습게 먹고 들어갑니다. 사용자가 사용하지 않은 불필요한 기능들도 많이 있습니다.

치명적인 단점은 너무 느립니다. OS자체가 무겁기 때문에 잡아먹는 자원도 많고 부팅과 종료가 상당히 느립니다.

하지만 컨테이너를 보시면 Container Runtime 위에 Guest OS없이 응용프로그램이 올라와 있는걸 확인할 수 있습니다.

저것이 무엇을 의미하냐면 컨테이너에서 OS가 실행되긴 하지만 사용자가 사용할 응용프로그램만 작동되도록 정말 최소단위만 올라가게 됩니다.

따라서 컨테이너에서 실행되는 OS의 커널 크기를 보면 보통 수십~메가 에서 수백~메가 밖에 되질 않고 부팅과 종료 또한 빠릅니다.

덕분에 서버 한대에서 여러 기능을 하는 응용프로그램들, 소위 마이크로서비스식 서버를 구축할 수 있으며, 기존 서버 커널 하나로 모든 컨테이너들의 관리가 가능하므로 관리도 손쉬워 짐니다.

여기까지가 리눅스 컨테이너에 대한 전반적인 설명입니다. 쉽게 설명하기 위해서 생략한것도 있으니 유의하시고 보시면 되겠습니다.

3. 컨테이너와 도커의 차이점

Docker는 처음엔 LXC 기반으로 만들어 졌습니다. 즉, 도커는 LXC를 좀 더 효율적으로 생성, 관리, 배포 등….

컨테이너 관련 작업을 효율적으로 하기위해 만들어졌습니다.

그렇다고 Docker == LXC는 아닙니다.

출처 : redhat.com/ko/topics/containers/what-is-docker

위 사진을 보면 LXC와 Docker는 차이점이 존재합니다.

1. LXC는 하나의 컨테이너에 여러개의 응용프로그램들을 띄울 수 있습니다.

하지만 도커는 컨테이너당 하나의 응용프로그램을 사용하길 권장하고 있고 이에 대한 수 많은 기능들을 제공합니다.

컨테이너당 응용프로그램을 하나씩 띄워 놓으면 다음과 같은 장점이 있습니다.

다른 프로젝트에서 쉽게 재 사용 가능

보안 및 격리 관점에서 더 많은 유연성을 가져올 수 있음.

업데이트시 서로간의 간섭을 받지 않음

마이크로서비스 아키텍처를 구성하는것에 대해 효율적이다.

이러한 이유 때문에 Docker에선 1컨테이너 1응용프로그램을 권장하고 있습니다.

2. LXC는 캡쳐기능이 없지만 Docker는 캡쳐기능이 있습니다.

VM의 스냅샷과 동일한 것인데, 구축된 환경을 이미지 파일로 저장 후 언제든지 사용 가능합니다.

만약 초기 셋팅을 이미지 파일로 만든 후 새로운 패키지나 업데이트를 했는데 알 수 없는 이유로 프로그램이 작동이 안된다면

초기에 만들어 놓은 이미지 파일로 쉽게 되돌아 갈 수 있습니다.

3. Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 훨씬 더 빨라집니다.

중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다.

4. Docker는 컨테이너를 이미지화 시켜 배포를 쉽고 빠르게 할 수 있습니다. 컨테이너의 시작과 종료가 불과 수 초에 해당되기 때문입니다.

5. 현재 Docker는 LXC 기반이 아닌 자체 라이브러리인 libcontainer를 사용함을로써 좀 더 Docker Engine에 맞게 실행되게 됩니다.

출처 : https://zetawiki.com/wiki/Libcontainer

4. 도커를 통해 가져갈 수 있는 이점

이점은 위에서 설명한 대로 입니다.

서버 하나에서 컨테이너를 이용해 여러 서버(응용프로그램)를 구축할 수 있으며, Docker를 사용해 쉽고 빠르게 배포, 관리가 가능합니다.

또한 개발환경에 구에받지 않아도 되며 불필요하게 돈을 주고 서버를 증설할 필요도 없습니다.

개발환경에 구에받지 않아도 된다는 뜻은 개발자 OS가 CentOS, Ubuntu, fedora, etc…. 상관 없이

컨테이너를 이용해 OS를 띄워주기만 하면 되기 때문입니다.

마지막으로 쿠버네티스라는 녀석이 있습니다.

이녀석에 대해선 다음장에 설명하겠습니다.~~~

긴 글 읽어주셔서 감사하고 잘못된 정보가 있다면 꼭 알려주세요.!!!

반응형

키워드에 대한 정보 리눅스 컨테이너

다음은 Bing에서 리눅스 컨테이너 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 컨테이너 생성 단계 분석 1편 – 리눅스 namespace

  • 리눅스 네임스페이스
  • linux namespace
  • docker namespace
  • 컨테이너 원리

컨테이너 #생성 #단계 #분석 #1편 #- #리눅스 #namespace


YouTube에서 리눅스 컨테이너 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 컨테이너 생성 단계 분석 1편 – 리눅스 namespace | 리눅스 컨테이너, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment