Docker 입문

아따맘마·2020년 12월 5일
0

Server

목록 보기
2/2

이번에 Seoul 42 과제중에 ft_server을 하기 위해 Docker에 입문하게 됬다. 백엔드랑 네트워크에 관련된 과제로 웹 서버를 설치해야 하는것 같다.
Docker에 관해서는 자주 들어봤지만 비전공자에다 노베이스라 기초 개념부터 배우려고 한다.

Docker란?


Docker은 오픈 소스 컨테이너 프로젝트라고 한다. 여기서 오픈 소스는 어떤 의미인지 알겠지만 컨테이너는 무엇을 뜻할까?

본래 서버를 구축하려면, 특히 물리적인 서버를 구축하려면 서버 구입과 설치에 돈과 시간이 소모가 된다. 하지만 클라우드 환경이 발전하면서 가상 서버를 쉽게 만들 수 있게 되었다. 하지만 이런 클라우드 가상 서버도 한계가 있다. 생성된 가상 서버에 각종 소프트웨어를 설치 및 설정을 해야하는데, 서버 개수가 많아질수록 관리하기가 어려워진다. 리눅스/유닉스 환경에서 쉘 스크립트로 설치 및 설정 자동화를 구현해도 한계가 명확히 존재한다.
그러다가 Immutable Infrastructure가 나오게 됬다. 이는 호스트 OS와 서비스 운영 환경(서버 프로그램, 소스 코드, 컴파일된 바이너리)을 분리하고, 한 번 설정한 운영 환경은 변경하지 않는다라는 개념이다. 즉 서비스 운영 환경을 이미지로 생성한 뒤 서버에 배포하여 실행. 서비스가 업데이트 되면 운영 환경 자체를 변경하지 않고, 이미지를 새로 생성하여 배포하는 것이다.
이에 대한 장점

  • 서비스 운영 환경을 이미지로 생성하여 이미지 자체만 관리하면 된다. 이미지를 중앙 관리하여 체계적인 배포와 관리를 할 수 있다. 또한 이미지 생성 설정도 파일로 되어 있어 버전 관리 시스템을 활용할 수 있다.
  • 이미지 하나로 서버를 계속 찍어낼 수 있다. 따라서 클라우드 플랫폼의 자동 확장 기능과 연동하면 손쉽게 서비스를 확장할 수 있다.
  • 운영체제와 서비스 운영 환경을 분리하여 가볍고 어디서든 시행가능한 환경을 제공

Docker은 이러한 Immutable Infrastructure을 구현한 프로젝트이다. 도커의 귀여운 고래 이미지를 보면 위에 컨테이너같이 생긴게 올라가 있다. 이 컨테이너를 이미지라고 생각하면 된다. 서버에서 여러 개의 컨테이너(이미지)를 실행하고, 이미지 저장과 배포도 의미한다.

컨테이너

컨테이너는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술이다.

컨테이너와 VM을 비교하면 위 그림과 같다.
VM을 보면 Hypervisor 위레 Guest OS가 올라간다. 그에 비해 Docker은 OS 위레 Docker engine가 올라가고 그 위에 Software 실행에 필요한 바이너리나 라이브러리만 올라간다. 그 외 커널 부분은 호스트의 커널을 공유.
Docker은 LXC(LinuxX Container)를 이용하여 가상화 환경을 제공. LXC에는 OS가 설치되어 있지 않아 컨테이너라는 명칭을 사용한다. LXC는 기존의 전가상화, 반가상화보다 좀 더 빠른 속도로 Host의 하드웨어를 이용 가능하다.

커널


커널은 운영체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제. 운영 체제의 다른 부분 및 응용 프로그램에 수행에 필요한 여러 가지 서비스를 제공

  • 보안
    컴퓨터 하드웨어와 프로세스의 보안을 책임진다.
  • 자원 관리
    한정된 시스템 자원을 효율적으로 관리하여 프로그램의 실행을 원할하게 한다. 프로세스에 처리기를 할당하는 것을 스케쥴링이라고 한다.
  • 추상화
    같은 종류의 부품에 대해 다양한 하드웨어를 설계할 수 있기 때문에 하드웨어에 직접 접근하는 것은 문제를 복잡하게 만든다. 커널은 운영체제의 복잡한 내부를 감추고 깔끔하고 일관성 있는 인터페이스를 하드웨어에 제공하기 위해 몇 가지 하드웨어 추상화 (같은 종류의 장비에 대한 공통 명령어의 집합)들로 구현. 이 하드웨어 추상화는 프로그래머가 여러 장비에서 작동하는 프로그램을 개발하는 것을 돕는다.

Hypervisor

Hypervisor은 물리 서버(Host)의 CPU와 디스크에 직접적인 상호작용을 하며, 가상 서버를 위한 플랫폼 역할을한다. 각각의 가상 서버들이 독립적인 운용이 가능하게 한다. Guest OS는 Hypervisor 자원관리 하에 각각의 독립된 영역을 가지고 운용.

이미지

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다.(Immutable)
컨테이너는 이미지를 실행한 상태라고 볼 수 잇고 추가되거나 변하는 값은 컨테이너에 저장. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
도커 이미지는 컨테이너 실행하기 위한 모든 정보를 가지고 있어 용량이 좀 있다. 그래서 기존 이미지에 파일 하나 추가하면 수백메가를 다시 다운받아야 되므로 비효율적이다. 그래서 레이어 저장방식을 사용한다.

Layer 저장방식


Docker은 레이어 저장방식을 통해 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 한다. 이미지는 여러개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.
Ubuntu는 A,B,C라는 레이어의 집합이면 그 위에 Nginx를 ubuntu 베이스로 만들었다면 Nginx의 레이어가 추가되고 마지막으로 Web app가 Nginx 기반으로 만들었다면 source 레이어가 추가된다. Web app 소스를 수정할 시 ubuntu, Nginx 제외한 Source 레이어만 다운받으면 되서 효율적으로 이미지 관리가 된다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.

profile
늦게 출발했지만 꾸준히 달려서 도착지점에 무사히 도달하자

0개의 댓글