[Docker 이해하기] 1. 시스템과 인프라 기초 지식

Titu·2021년 7월 8일
3

Docker

목록 보기
1/6
post-thumbnail
post-custom-banner

개발한 애플리케이션을 최종 사용자가 이용할 수 있도록 하려면 시스템 기반을 구축하고, 그 위에 애플리케이션의 실행 환경을 마련해야 한다. 시스템 기반이란 애플리케이션을 가동시키기 위해 필요한 하드웨어나 OS, 미들웨어 등과 같은 인프라를 말한다. Docker는 애플리케이션 실행 환경을 작성 및 관리하기 위한 플랫폼이다.

이 장에서는 Docker를 설명하기에 앞서 알아두어야 할 시스템 기반의 개요시스템 기반을 다루기 위해 필요한 인프라 기술의 핵심적인 내용에 대해 살펴보기로 한다.

1.1 시스템 기반의 기초 지식

시스템 기반이란 애플리케이션을 가동시키기 위해 필요한 하드웨어나 OS, 미들웨어와 같은 인프라를 말한다.

하드웨어(Hardware)

  • 시스템 기반을 구성하는 물리적인 요소로서 서버 장비 본체나 데이터를 저장하기 위한 스토리지, 전원 장치 등이 들어간다.

네트워크(Network)

  • 시스템 이용자가 원격에서 액세스할 수 있도록 서버들을 연결하기 위한 요구사항. 라우터, 스위치, 방화벽 등과 같은 네트워크 장비나 그것들을 연결하기 위한 케이블 배선 등도 관리한다.

운영체제(OS)

  • 하드웨어나 네트워크 장비를 제어하기 위한 기본 소프트웨어로, 하드웨어의 리소스나 프로세스를 관리한다.
  • 클라이언트 OS는 Windows/macOS등이 있으며, 이용자가 사용하기 쉽도록 GUI 기능이나 멀티미디어 기능이 마련되어 있다.
  • 서버 OS는 Windows Server, Unix, Linux 등이 있으며, 시스템을 빠르고 안정적으로 가동시키기 위해 필요한 기능으로 특화되어 있다.

미들웨어(Middleware)

  • 서버 OS 상에서 서버가 특정 역할을 다하기 위한 기능을 갖고 있는 소프트웨어를 말한다.

1.2 하드웨어와 네트워크 기초 지식

시스템 기반에서 가장 하위 레이어 부분을 구성하는 요소는 하드웨어와 네트워크다. Docker를 사용하여 인프라를 구축하기 위해 알아두어야 할 하드웨어와 네트워크 기술 중 주요 키워드를 알아보기로 한다.

서버 장비

CPU

  • CPU는 프로그램의 설계나 처리 등을 수행하는 전자회로 부품을 말한다.
    • CPU의 작동 주파수가 클수록 연산 능력이 높아지고, 코어(연산회로) 수가 많을수록 연산을 동시에 처리할 수 있는 수가 늘어난다.
    • CPU는 고속으로 움직이기 때문에 메모리와의 처리 속도 차이를 완화할 목적으로 캐시(cache)가 이용되는데, 캐시의 크기가 클수록 성능이 높아진다.

메모리(Memory)

  • CPU가 직접 액세스할 수 있는 기억장치를 메모리(주기억장치)라고 한다.
    • 데이터 용량이 크거나 데이터의 전송 속도가 고속일수록 고성능이지만, 서버용으로는 전력 소모가 적고 오류 처리가 탑재되어 있는 것을 선정한다.

스토리지(Storage)

  • 스토리지는 데이터베이스에 기록하는 데이터 등과 같은 영구적인 데이터를 저장하는 디바이스로, 보조기억장치라고 한다.
    • 스토리지의 용량이나 읽기, 쓰기 속도가 시스템 전체의 응답 시간에 영향을 주는 경우가 많다.
    • 스토리지에는 하드디스크가 SSD 등을 이용한다.

네트워크 주소

네트워크 세계에서는 서버나 클라이언트, 각종 네트워크 장비 등을 식별하기 네트워크 주소를 사용한다.

MAC 주소 (물리 주소 / 이더넷 주소)

  • MAC 주소는 네트워크 인터페이스 카드나 무선 LAN 칩과 같은 네트워크 부품에 물리적으로 할당되는 48비트 주소이다.
    • 앞의 24비트는 네트워크 부품의 제조업체를 식별하는 번호이며, 뒤 24비트는 각 제조업체가 중복되지 않도록 할당하고 있다. MAC 주소는 16진수로 표기하며, 앞에서 2바이트씩 구분하여 표시한다.
    • OSI 참조 모델의 2계층인 데이터 링크 계층에서 사용한다.

IP 주소

  • IP 주소는 인터넷이나 인트라넷과 같은 네트워크에 연결된 컴퓨터나 네트워크 장비에 할당되는 식별 번호이다.
    • 현재 폭넓게 보급되어 있는 'IPv4'는 8비트씩 4개로 구분된 32비트 주소로, '192.168.1.1'과 같이 0부터 255까지의 10진수를 4개로 나열하여 나타낸다.
    • IPv4의 경우 주소의 개수가 2의 32승, 약 42억 개로 제한되기 때문에 인터넷에서 이용할 수 있는 IP 주소의 고갈이 우려되고 있다. 따라서 업무 시스템에서 사용하는 사내 네트워크에서는 임의의 주소를 할당할 수 있는 프라이빗 주소를 사용하고, 인터넷과의 경계에 글로벌 주소와 프라이빗 주소를 변환(NAT)하는 장비를 설치하여 운용하고 있다.
    • 새롭게 도입된 IPv6에서는 128비트의 IP 주소를 사용하고 있다.

OSI 참조 모델과 통신 프로토콜

통신 프로토콜

  • 통신을 할 때는 서로가 알아들을 수 있도록 '어떤 말을 사용할지'와 같은 약속이 필요하다. 통신 프로토콜이란 '서로 어떤 약속으로 통신을 할지'를 정한 규약을 뜻한다.
    • 시스템에서 주로 사용하는 통신으로는 웹이나 메일 송수신, 파일 전송이나 SSH(Secure Shell)과 같은 통신이 있는데, 이들에는 각각의 프로토콜이 정해져있다.

OSI 참조 모델

  • OSI 참조 모델이란, 컴퓨터의 통신 기능을 계층 구조로 나눈 개념 모델이다. 통신 프로토콜을 7개의 계층으로 나눠서 정의하고 있으며 1~4계층을 하위 계층, 5~7계층을 상위계층이라고 한다.
    • 통신 프로토콜의 계층화를 통해 다양한 기술들의 상호 연결성을 확보하고 있다.

    1계층: 물리 계층 (Physical layer)

    • 통신 장비의 물리적 및 전기적 특성을 규정한다. 데이터를 어떻게 전압과 전류의 값으로 할당할지나 케이블이나 커넥터의 모양 등을 규정한다.
    • 동일한 네트워크 안에 있는 노드 간의 통신을 규정한다.
    • 데이터 링크 계층에서는 MAC 주소로 데이터를 전송하며, 이 계층에서 작동하는 대표적인 네트워크 장비로는 레이어 2 스위치가 있다. 레이어 2 스위치는 통신하고 싶은 노드가 어떤 포트와 연결되어 있는지를 MAC 주소를 사용하여 판단하고 패킷을 전송한다.

    3계층: 네트워크 계층 (Network layer)

    • 서로 다른 네트워크 간에 통신을 하기 위한 규정이다. 서로 다른 네트워크에 데이터 패킷을 전송하는 것을 라우팅이라고 한다.
    • 네트워크 계층에서는 IP 주소로 데이터를 전송하며, 이 계층에서 작동하는 대표적인 네트워크 장비로는 라우터나 레이어 3 스위치가 있다. 이러한 장비는 '패킷을 어디에서 어디로 전송할지'에 대한 정보(라우팅 테이블)를 관리하고 있다.

    4계층: 전송 계층 (Transport layer)

    • 데이터 전송을 제어하는 계층이다. 데이터를 통신 상대의 노드로 확실히 보내는 역할을 한다.
    • 전송 오류의 검출이나 재전송을 규정하며, 대표적인 프로토콜로는 TCP와 UDP가 있다.

    5계층: 세션 계층 (Session layer)

    • 커넥션 확립 타이밍이나 데이터 전송 타이밍을 규정한다. 세션은 애플리케이션 간에 일어나는 요청(request)와 응답(response)로 구성된다.

    6계층: 표현 계층 (Presentation layer)

    • 데이터의 저장 형식이나 압축, 문자 인코딩과 같은 데이터의 표현 형식을 규정한다.

    7계층: 응용 계층 (Application layer)

    • 웹의 HTTP나 메일 전송을 하는 SMTP 등과 같은 애플리케이션에 특화된 프로토콜을 규정한다.

방화벽(Firewall)

시스템을 가동시킬 때 가장 주의해야 할 것은 보안이다. 보안을 확보하기 위해서 가장 효과적인 방법 중 하나는 불필요한 통신을 차단하는 것이다. 방화벽은 내부 네트워크와 외부와의 통신을 제어하고, 내부 네트워크의 안전을 유지하기 위한 기술이다. 방화벽의 종류를 알아보기로 한다.

패킷 필터형

  • 통과하는 패킷을 포트 번호나 IP 주소를 바탕으로 필터링하는 방법이다.
    • 예를 들어'포트 번호 80(http)과 443(https)만 통과해도 좋다', '안전한 세그먼트로부터 온 패킷 외에는 모두 파기한다' 등과 같은 룰을 정하고, 그 룰에 기초하여 패킷을 필터링한다.
    • 패킷 필터링의 룰을 'ACL(액세스 제어 리스트)'이라고 한다.

애플리케이션 게이트웨이형

  • 애플리케이션 프로토콜 레벨에서 외부와의 통신을 대체 제어하는 것이다. 일반적으로는 프록시 서버라고 부른다.

라우터/레이어 3 스위치

라우터(Router)

  • 라우터는 2개 이상의 서로 다른 네트워크 간을 중계하기 위한 통신 장비다. OSI 참조 모델의 3계층인 네트워크 계층에서 작동하며, 어떤 루트를 통해 데이터를 전송할지를 판단하기 위한 경로 선택 기능을 가지고 있다.
    • 어떤 루트를 경유할지에 대한 경로는 라우터에 설정된 라우팅 테이블을 바탕으로 정해지는 정적 경로(Static Route)와 라우팅 프로토콜에서 설정된 동적 경로(Dynamic Route)가 있다.

레이어 3 스위치

  • 라우터와 거의 똑같은 기능을 갖고 있는 레이어 3 스위치는 라우팅을 하드웨어로 처리하기 때문에 고속으로 작동한다는 것이 특징이며, 연결할 수 있는 이더넷 포트의 수가 많기 때문에 널리 이용되고 있다.

1.3 OS(Linux) 기초 지식

하드웨어와 네트워크를 제어하는 것이 OS 역할이다. 업무 시스템에서는 Unix, Linux, Windows Server와 같은 서버 OS를 사용한다. 그 중 Linux에 대해 알아보기로 한다.

Linux

  • Linux는 1991년에 핀란드의 Linus Torvalds가 개발한 Unix 호환 서버 OS이다.
    • 보안에 뛰어나며 안정적으로 작동된다는 특징을 갖고 있기 때문에 각종 서버에서 널리 이용되고 있다. Intel x86 계열의 프로세서를 탑재한 컴퓨터 뿐만 아니라 스마트폰이나 임베디드 장비의 OS로서도 작동하는 것이 특징이다.
    • 오픈소스이므로 누구나 자유롭게 수정 및 재배포할 수 있다.
  • 일반적으로 Linux라는 말에는 두가지 뜻이 있다.
    1. Linux 커널(kernel)
      • OS의 코어가 되는 부분을 말한다. 메모리 관리, 파일 시스템, 프로세스 관리, 디바이스 제어 등 OS로서 하드웨어나 애플리케이션 소프트웨어를 제어하기 위한 기본적 기능을 갖고 있는 소프트웨어다.
      • 스마트폰이나 태블릿 단말기용 OS인 안드로이드는 리눅스 커널 상에 구축되어 있다.
    2. Linux 배포판
      • 보통 Linux는 Linux 배포판이라는 형태로 패키지화되어 배포된다. Linux 배포판에는 Linux 커널과 함께 각종 커맨드, 라이브러리, 애플리케이션이 포함되어 있다.
      • 주요 리눅스 배포판은 크게 Debian 계열 배포판, Red Hat 계열 배포판, Slackware 계열 배포판 등으로 나눠지며, 가장 많이 사용되는 것 중 하나는 Debian 계열 배포판 중 하나인 Ubuntu이다.

Linux 커널의 주요 기능

디바이스 관리

  • 리눅스 커널은 하드웨어(CPU/메모리/디스크/입출력 장치 등)를 디바이스 드라이버라는 소프트웨어를 이용하여 제어한다.

프로세스 관리

  • 리눅스에서 명령을 실행할 때는 해당 프로그램 파일에 쓰여 있는 내용을 읽어 들여 메모리 상에 전개한 후 메모리상의 프로그램을 실행한다. 이렇게 실행된 프로그램을 프로세스라고 한다.
  • 프로세스는 여러 개가 동시에 실행 될 수 있는데, 리눅스 커널은 이러한 프로세스에 PID(프로세스 ID)라는 식별자를 붙여 관리한다. 그리고 프로세스의 실행을 위해 필요한 CPU를 효율적으로 할당하는 역할을 하고 있다.

메모리 관리

  • 프로세스가 실행되면 메모리상에 프로그램이 전개됨과 동시에 프로그램 안에서 이용하는 데이터도 메모리상에 전개된다. Linux 커널은 프로그램/데이터를 물리 메모리에 효율적으로 할당하는 역할을 갖고 있다. 또한 실행이 끝난 프로세스가 사용하던 메모리 영역을 해제하는 것도 커널의 역할이다.
  • 메모리에는 용량의 제한이 있으므로 메모리으 물리적인 용량을 초과하는 프로그램/데이터를 전개할 때는 하드디스크와 같은 보조기억장치에 가상 메모리 영역을 만든다. 이러한 가상 메모리 영역을 스왑(swap)이라고 한다. Linux 커널은 메모리상에 전개된 이용 빈도가 낮은 데이터를 스왑으로 보내고(스왑 아웃), 스왑 상의 데이터를 메모리로 되돌리는(스왑인) 일을 한다.

쉘(Shell)

  • Linux 커널을 조작하기 위해서는 쉘(Shell)을 사용한다. 쉘은 사용자가 내린 명령을 커맨드로 받아, 그것을 Linux 커널에 전달한다.
  • 쉘은 다음과 같은 일을 실행할 수 있다.
    • 애플리케이션 실행/정지/재실행
    • 환경변수 관리
    • 명령 이력 관리(명령 히스토리)
    • 명령 실행 결과 표시 및 파일 출력
  • 쉘에서 실행하고자 하는 명령을 모아서 텍스트 파일에 기술한 것을 '쉘 스크립트'라고 한다.
  • 쉘도 여러 종류가 있는데, 쉘의 종류가 다르면 쉘 스크립트의 작성 방법도 달라진다. 종류에는 bash, csh, tcsh, zsh 등이 있다.

Linux 파일 시스템

  • Linux 커널이 갖고 있는 중요한 기능 중 하나는 파일 시스템이다. 파일 시스템은 Linux에서 하드디스크나 USB 메모리, CD, DVD 등과 같은 데이터에 액세스하기 위한 장치다.
  • 보통 컴퓨터가 데이터를 읽어 들일 때는 데이터가 어떤 디스크에 어떻게 저장되어 있는지를 의식할 필요가 있지만, 데이터를 이용하는 애플리케이션 입장에서는 데이터가 어디에 저장 되어 있던지 상관없이 액세스할 수 있다면 편리할 것이다. Linux 커널은 VFS(Virtual File System: 가상 파일 시스템)라는 장치를 사용하여 이를 가능하게 하며, VFS에서는 각 디바이스를 '파일'로 취급하는 것이 특징이다.

Linux 디렉토리 구성

  • Linux 커널을 비롯하여 각종 커맨드나 설정 파일은 디렉토리에 배치된다. Linux 디렉토리 목록은 FHS(Filesystem Hierarchy Standard)라는 규격에 의해 표준화되어 있다.
  • Linux 전체 디렉토리 구성
    • /bin : 기본 커맨드
    • /boot : OS 시작에 필요한 파일
    • /dev : 디바이스 파일
      • /dev/had : 하드디스크
      • /dev/hda : IDE 타입 하드디스크
      • /dev/sda : SCSI 타입 하드디스크
      • /dev/tty : 표준입출력이 되는 단말 디바이스
      • /dev/null : 필요가 없어진 출력을 버릴 때 사용하거나 빈 파일로 사용
    • /etc : 설정 파일
      • /etc/hosts : IP 주소와 도메인명을 연결하는 파일
      • /etc/passwd : 사용자의 비밀전호가 저장
    • /home : 사용자 홈 디렉토리
    • /lib : 공유 라이브러리
    • /mnt : 파일 시스템의 마운트 포인트용 디렉토리
    • /media : CD/DVD-ROM의 마운트 포인트
    • /opt : 애플리케이션 소프트웨어 패키지
    • /proc : 커널이나 프로세스에 관한 정보
      • /proc 아래에 있는 숫자 폴더 : 프로세스 ID
      • /proc/cpuinfo : CPU 정보
      • /proc/partitions : 디스크의 파티션 정보
      • /proc/version : Linux 커널의 버전 정보 저장
    • /root : 특권 사용자(root)용 홈 디렉토리
    • /sbin : 시스템 관리용 마운트
    • /srv : 시스템 고유의 데이터
    • /tmp : 임시 디렉토리
      • 하드디스크에 저장되어 있는 보통의 파일처럼 보이지만 /tmp는 보통 tmpfs 파일 시스템을 사용하여 메모리상에 전개되기 때문에 서버를 재시작하면 사라져버린다
    • /usr : 각종 프로그램이나 커널 소스를 놓아두는 디렉토리
      • /usr/local은 시스템 관리자가 애플리케이션을 설치하는 장소로 이용
    • /var : 로그나 메일 등 가변적인 파일을 놓아두는 디렉토리
      • /var/log : 가동 로그 저장
      • /var/spool : 애플리케이션이 임시 파일로 사용하는 스풀 저장

1.4 미들웨어 기초 지식

웹 서버 (Web Server) / 웹 애플리케이션 서버 (WAS)

  • 웹 서버란 클라이언트의 브라우저가 보내온 HTTP 요청을 받아, 웹 콘텐츠(HTML, CSS 등)를 응답으로 반환하거나, 다른 서버사이드 프로그램을 호출하는 기능을 갖고 있는 서버이다.
  • 대표적인 웹 서버
    • Apache HTTP Server (아파치)
    • Nginx (엔진엑스)
    • Internet Information Services

데이터베이스 서버

  • 데이터베이스 서버는 시스템이 생성하는 다양한 데이터를 관리하기 위한 미들웨어다.
  • 데이터의 검색, 등록, 변경, 삭제와 같은 기본 기능 외에, 트랜잭션 처리 등도 포함한다는 점에서 데이터베이스 관리 시스템 DBMS(Database Management System)라고 부르는 경우도 있다.
  • 대표적인 데이터베이스 서버
    • RDBMS : 관계형 데이터베이스. 데이터를 2차원 표 형식으로 관리하며, 데이터에 대한 조회 언어로 SQL을 채택.
      • MySQL
      • PostgreSQL
      • Oracle Database
    • NoSQL : 병렬분산처리나 유연한 스키마 설정이 특징. 대량의 데이터 축적이나 병렬처리에 뛰어나기 때문에 다수의 사용자 액세스를 처리할 필요가 있는 온라인 시스템 등에서 널리 이용됨.
      • Redis
      • MongoDB
      • Apache Cassandra

1.5 인프라 구성 관리 기초 지식

인프라 구성 관리

인프라 구성 관리는 인프라를 구성하는 하드웨어, 네트워크, OS, 미들웨어, 애플리케이션의 구성 정보를 관리하고 적절한 상태로 유지하는 작업을 말한다.

대표적인 인프라 구성 관리 툴

OS의 시작을 자동화하는 툴 (Bootstrapping)

  • 서버 OS를 설치하거나 가상화 툴을 설치 및 설정하는 작업을 자동화하기 위한 툴
    • OS 설치
    • 가상 환경 설정
    • 네트워크 구성 설정
  • Ex. KickStart, Vagrant

OS나 미들웨어의 설정을 자동화하는 툴 (Configuration)

  • 데이터베이스 서버, 웹 서버, 감시 에이전트 등과 같은 미들웨어의 설치나 버전 관리, OS나 미들웨어의 설정 파일이나 방화벽 기능의 설정 등을 자동화하기 위한 툴
    • OS 설정(보안/서비스 시작 등)
    • 미들웨어(각종 서버)의 설치 및 설정
  • Ex. Chef, Ansible, Puppet, Itamae

여러 서버의 관리를 자동화하는 툴 (Orchestration)

  • 대규모 시스템은 여러 대의 서버로 구축되는데, 이러한 분산 환경의 서버들을 관리하기 위한 툴이 있다. 그 중에서도 컨테이너 오케스트레이션의 사실상 표준인 'Kubernetes'는 컨테이너 가상 환경에 있어서 여러 컨테이너를 통합 관리하는 툴이다.
    • 애플리케이션 배포
    • 서버군의 오케스트레이션
  • Ex. Kubernetes

CI / CD

CI(Continuous Integeration)

  • CI: 애플리케이션의 코드를 추가 및 수정할 때마다 테스트를 실행하고 확실하게 작동하는 코드를 유지하는 방법
    • 테스트를 자동으로 반복함으로써 품질을 확보한다.
  • 단위테스트(Unit Test): 특정 부품에 대해 사양서에 정해진 대로 작동하는지를 확인하는 테스트를 단위테스트라고 한다.
    • 소프트웨어의 개발이 진행됨에 따라 단위 테스트의 수가 늘어나므로, 이러한 테스트를 자동화하기 위해 Jenkins와 같은 인터크레이션 툴을 사용한다.
    • 하지만 단위 레벨에서 테스트가 끝난 모듈이 다른 환경에서도 똑같이 작동한다는 보장은 없다. 애플리케이션을 실행하려면 OS의 설정이나 네트워크 주소, 영구 데이터의 저장 장소, 애플리케이션을 실행할 계정의 권한 등 인프라 환경에 의존하는 부분이 많다.
    • 따라서, 인프라 구성에 관한 부분을 코드로 관리하여 개발 멤버가 항상 동일한 환경에서 개발할 수 있도록 한다.

CD(Continuous Delivery)

  • 애자일형(Agile) 개발: 모든 기능을 한 번에 다 만드는 것이 아니라, 기능을 추가할 때마다 애플리케이션을 제품 환경에 배포하고, 시스템 이용자의 피드백에 기초하여 그 다음에 개발할 기능을 결정
  • Agile 방법론의 등장으로 짧은 사이클의 개발과 릴리즈가 실현되었다. 그런데 제품 환경에서 애플리케이션의 버전업 작업은 항상 예기치 못한 에러들을 발생시키곤 한다.
  • 이러한 문제의 원인 중 하나는 애플리케이션을 테스트 환경에 도입하는 절차와 제품 환경에 도입하는 절차가 분리되어 있기 때문인데, 이러한 절차를 코드로 관리하여 테스트가 끝난 애플리케이션 실행 환경을 그대로 제품 환경에 전개해, 안전하게 애플리케이션의 버전업을 실시하도록 한다.

본문은 'Asa Shijo, <완벽한 IT 인프라 구축을 위한 Docker>, 정보문화사(2020)' 를 참고하여 정리한 글입니다.

[참고: 완벽한 IT 인프라 구축을 위한 Docker]

profile
This is titu
post-custom-banner

0개의 댓글