시스템과 인프라 기초 지식
이 포스트는 Docker 를 알아보기 전 알아야 할 시스템/인프라 기초 지식에 대해 기술한다. (아주 간략히)
시스템 기반이란 애플리케이션을 가동시키기 위해 필요한 하드웨어나 OS, 미들웨어 등과 같은 인프라를 말한다.
1. 시스템 기초 지식
클라우드의 등장으로 온프레미스 환경에서 가동시키던 서버들을 클라우드 상의 가상 인스턴스로 옮겨 실행 환경의 구축 범위가 극도로 줄어들고, 짧은 사이클로 릴리스를 반복할 수 있게 되었다.
온프레미스 (On-Premise)
클라우드 형태가 아닌 자사에서 데이터센터를 보유하여 시스템 구축부터 운용까지 모두 수행하는 형태
초기 시스템 투자에 드는 비용 부담이 크며, 시스템 가동 후 운용에 드는 비용도 시스템 이용량에 상관없이 부담해야 함
클라우드를 구성하는 대부분의 기술은 한 대의 물리 호스트가 아닌 분산 환경에서 이루어지며, 분산 환경에서는 인프라 엔지니어가 수동 운영이 아닌 자동화된 툴을 사용하여 오케스트레이션(orchestration) 한다.
애플리케이션 엔지니어도 시스템 환경에 대한 배포를 직접 할 수 있게 되었기 때문에 OS, 네트워크 등 인프라 기술의 기초 지식을 알아야 한다.
OS
클라이언트 OS : Windows, masOS 등
서버 OS : Windows Server, Unix, Linux 등
Docker 는 시스템 구축이나 시스템 운용에 있어서 사람이 직접 해오던 많은 작업을 자동화하고 애플리케이션을 지속적으로 제공할 수 있는 플랫폼이다.
2. 하드웨어와 네트워크 기초 지식
2.1. 서버
- CPU
- 처리 수행
- 작동 주파수가 클수록 연산 능력이 높아짐
- CPU 의 연산회로를 코어라고 하는데, 코어 수가 많을수록 연산을 동시에 처리할 수 있게 됨
- CPU 는 고속으로 움직이므로 메모리와의 처리 속도 차이 완화를 위해 캐시가 사용됨
- 메모리 (주기억장치)
- CPU 가 직접 액세스할 수 있는 기억장치
- 스토리지 (보조기억장치)
- 데이터를 저장하는 디바이스
- 하드디스크나 SSD
클라우드를 이용하는 경우 가상 머신의 사양 선정 = 하드웨어의 선정 이다.
효율적인 인프라 기반을 구축하려면 클라우드 서비스를 어떻게 조합해야하는지에 대해 깊은 고민이 필요하다.
2.2. 네트워크 주소
서버나 클라이언트, 네트워크 장비 등을 식별하기 위해 네트워크 주소를 사용한다.
- MAC 주소 (물리 주소 / 이더넷 주소)
- 네트워크 인터페이스 카드나 무선 LAN 칩과 같은 네트워크 부품에 물리적으로 할당되는 48 bit 주소
- IP 주소
- 네트워크에 연결된 컴퓨터나 네트워크 장비에 할당되는 식별 번호
- IPv4 의 경우 하나의 네트워크에 약 42억 대까지밖에 연결할 수 없기 때문에
업무 시스템에서 사용하는 사내 네트워크에서는 임의의 주소를 할당할 수 있는 private IP 를 사용하고,
인터넷과의 경계에 private IP 를 public IP 로 변환(NAT) 하는 장비를 설치하여 사용
2.3. 방화벽
- 패킷 필터
- 통과하는 패킷을 포트나 IP 주소를 바탕으로 필터링
- 예를 들어 특정 아이피로부터 온 패킷 외엔 모두 파기하는 등의 룰을 정한 후 그룰에 기초하여 패킷을 필터링
이러한 룰을 ACL (Access Control List) 라고 함
- 애플리케이션 게이트웨이 (=Proxy Server)
- 패킷이 아닌 애플리케이션 프로토콜 레벨에서 외부와의 통신을 제어
3. OS 기초 지식
OS 는 하드웨어나 네트워크를 제어하는 역할을 한다.
보통 Unix, Linux, Windows Server 와 같은 서버 OS 를 사용한다.
Docker 는 Linux 의 기능을 사용한 기술이므로 Docker 를 사용하기 전에 Linux 에 관한 기초 지식을 반드시 알아야 한다.
3.1. 리눅스 커널
OS 의 코어가 되는 부분으로 메모리 관리, 파일 시스템, 프로세스 관리, 디바이스 제어 등 하드웨어나 애플리케이션 소프트웨어를 제어하기 위한 기본적인 기능을 갖고 있는 소프트웨어이다.
커널을 조작하기 위해 shell (쉘) 을 사용하는데 쉘은 사용자가 입력한 명령어를 커맨드로 받아 그것을 커널에 전달한다.
프로세스 관리
OS 를 작동시키거나, 미들웨어/애플리케이션을 실행하면 동시에 여러 개의 프로세스가 실행된 상태가 되는데 커널은 이러한 프로세스에 PID (Process ID) 식별자를 붙여 관리
3.2. 리눅스 배포판
보통 리눅스는 리눅스 배포판이라는 형태로 패키지화되어 배포되는데 리눅스 커널과 함께 각종 커맨드, 라이브러리 등이 포함되어 있다.
커널 외의 부분을 userland (사용자 공간) 이라고 하며, userland 에서는 디바이스에 직접 액세스가 불가하여 커널을 통해 처리가 이루어진다.
- Debian 계열 배포판
- Debian
- KNOPPIX
- Ubuntu
- Red Hat 계열 배포판
- Fedora
- Red Hat Enterprise Linux (=RHEL)
- CentOS : RHEL 과의 완전한 호환을 지향
- Vine Linux
- Slackware 계열 배포판
- openSUSE
- SUSE Linux Enterprise
3.3. 리눅스 파일 시스템
커널이 갖고 있는 기능 중 하나로 파일 시스템이 있는데 파일 시스템은 리눅스에서 하드디스크나 USB, CD 등과 같은 데이터에 액세스 하기 위한 장치이다.
커널은 VFS (Virtual File System, 가상 파일 시스템) 장치를 사용하여 데이터에 대한 액세스를 가능하게 하는데 VFS 는 각 디바이스를 ‘파일’로 취급하여 애플리케이션은 디바이스의 차이나 위치를 신경쓰지 않아도 된다.
3.4. 리눅스 디렉터리 구성
리눅스 디렉터리는 FHS (Filesystem Hierarchy Standard) 라는 규격에 의해 표준화되어 있다.
- 리눅스 주요 디렉터리
- /bin
- 기본 커맨드
- /boot
- OS 시작 시 필요한 파일
- /dev
- 디바이스 파일
- 예를 들어 /dev/had 는 하드디스크, /dev/null 은 약간 특수한 디바이스로 필요없어진 출력을 버릴 때 사용하거나 빈 파일로 사용
- /etc
- 설정 파일
- 예를 들어 /etc/hosts 는 IP 주소와 도메인명을 연결하는 파일
- 웹 서버 시작 시 http 데몬 설정 파일도 해당 디렉터리에 배치
- /home
- 사용자 홈 디렉터리
- /lib
- 공유 라이브러리
- /mnt
- 파일 시스템의 마운트 포인트용 디렉터리
- /media
- CD/DVD-ROM 의 마운트 포인트
- /opt
- 애플리케이션 소프트웨어 패키지
- /proc
- 커널이나 프로세스에 관한 정보
- 숫자 폴더는 PID 를 의미
- /proc/cpuinfo 는 CPU 정보, /proc/partitions 는 디스크의 파티션 정보, /proc/version 은 커널의 버전 정보
- /root
- root 계정 홈 디렉터리
- /sbin
- 시스템 관리용 마운트
- /srv
- 시스템 고유의 데이터
- /tmp
- 임시 디렉터리
- 서버 재시작 시 사라짐
- /usr
- 각종 프로그램이나 커널 소스
- /usr/local 은 시스템 관리자가 애플리케이션을 설치하는 장소로 이용
- /var
- 로그나 메일 등 가변적인 파일
- /var/log 에는 가동 로그, /var/spool 에는 애플리케이션이 임시 파일로 사용하는 스풀이 저장
- 이 외 메일 등 큐나 프로세스의 다중 기동을 막기 위한 로그 파일 등도 위치
- /bin
4. 미들웨어 기초 지식
미들웨어는 OS 와 애플리케이션 사이에 들어가는 소프트웨어를 말한다.
4.1. 웹서버/웹애플리케이션 서버(WAS)
- 웹서버
- 클라이언트 브라우저로부터 HTTP 요청을 받아 정적인 컨텐츠(html, jpg, css 등) 을 응답으로 반환
- 클라이언트에 이미지 파일을 보낼 때 클라이언트는 HTML 문서를 먼저 받은 후 그에 맞는 필요한 이미지 파일들을 다시 서버로 요청하여 받아오는데,
웹서버를 통해 이미지 정적인 파일들은 WAS 까지 가지 않고 앞단에서 빠르게 보내줌으로써
웹서버에서는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄임 - Apache, Nginx, IIS (Windows 전용 웹서버)
- WAS
- DB 조회나 로직 처리를 요구하는 동적인 컨텐츠를 제공, 웹 컨테이너 혹은 서블릿 컨테이너라고도 함
- 주로 DB 서버와 함께 수행
- 동적 컨텐츠 제공 시 웹서버만 사용한다면 사용자가 원하는 결과값을 모두 미리 만들어놓아야 하기 때문에 WAS 가 필요함
- Tomcat, JBoss, Jeus, Web Sphere
- 웹서버와 WAS 를 분리하여 사용하는 이유
- 기능을 분리하여 서버 부하 방지
- WAS 는 DB 조회나 로직 처리, 단순 정적 컨텐츠를 웹서버에서 빠르게 클라이언트에 제공
- 정적 컨텐츠의 요청까지 WAS 가 처리한다면 정적 데이터 처리로 인해 부하가 커지게 되어, 동적 컨텐츠의 처리가 지연되어 수행 속도가 느려짐
- 물리적으로 분리하여 보안 강화
- SSL 에 대한 암복호화 처리에 웹서버 처리
- 여러 대의 WAS 연결
- Load Balancing 을 위해 웹서버 사용
- 무중단 운영
- 앞단의 웹서버에서 오류가 발생한 WAS 로는 라우팅하지 않아 사용자는 오류를 느끼지 못함
- 접근 허용 IP 필터링, 2대 이상의 서버에서의 세션 관리 등도 웹서버에서 처리하면 효율적임
- 기능을 분리하여 서버 부하 방지
즉, 자원 이용의 효율성 및 장애 극복, 배포 편의성을 위해 웹서버와 WAS 를 분리하여 사용한다.
4.2. 데이터베이스 서버
RDBMS 와 NoSQL 이 있는데 대표적인 NoSQL 은 아래와 같다.
- Redis
- 메모리상에 KVS (Key-Value Store) 구축
- 메모리상의 데이터는 정기적으로 백업되지만, 예상치못한 전원 차단 시 데이터 손실 우려 있음
- MongoDB
- 도큐먼트라는 구조적 데이터를 콜렉션으로 관리
- 도큐먼트에는 복잡한 계층 구조를 갖게 할 수 있으며, 온라인 게임이나 로그 분석 등에 이용
- Apache Cassandra
- 하나의 Key 에 여러 개의 칼럼을 가지며 관계형 테이블에 가까운 데이터 구조
NoSQL
병렬분산처리나 유연한 스키마 설정이 특징
4.3. 시스템 감시 툴
시스템 감시란 시스템의 감시 대상인 서버나 장비의 상태를 감시하여 미리 설정한 경계값을 초과한 경우 정해진 액션을 실행하는 것이다.
zabbix, Datadog, Mackerel(매커럴) 등이 있다.
5. 인프라 구성 기초 지식
인프라 구성관리는 인프라를 구성하는 하드웨어, 네트워크, OS, 미들웨어, 애플리케이션의 구성 정보를 관리하고 적절한 상태로 유지하는 작업이다.
클라우드 시스템에서는 한 번 구축한 인프라는 변경하지 않고 파기한 후 새로운 것을 구축하면 되기 때문에 그 동안 부하가 컸던 인프라의 변경 이력을 관리할 필요가 없다.
인프라의 변경 이력을 관리하는 것이 아니라 현재 동작하고 있는 인프라의 상태를 관리하면 되도록 바뀌었다.
구성 관리 시 여러 대의 서버를 모두 수작업으로 설정하여 관리하는 것은 비효율적이므로 코드를 사용하여 구성 관리를 한다.
코드에 기재된 대로 자동으로 설정을 해주도록 하여 누가 실행해도 똑같은 상태의 인프라 환경을 구축할 수 있는 환경이 일반적이다.
코드로 구성 관리를 하게 되면 애플케이션 개발에서의 소스코드 관리와 같이 버전 관리툴을 사용하여 변경 이력을 일원화하여 관리할 수 있다.
이렇게 인프라의 구성을 코드로 관리하는 것을 Infrastructure as Code 라고 한다.
Docker 에서는 Dockerfile 이라는 파일에 인프라의 구성 정보를 기술한다.
Dockerfile 을 작성하면 컨테이너의 바탕이 되는 Docker 이미지를 생성할 수 있다.
- 대표적인 인프라 구성 관리 툴
- OS 시작 자동화 툴
- 서버 OS 를 설치하거나 가상화 툴을 설치/설정하는 작업을 자동화하기 위한 툴
- Rea Hat 계열의 Linux 배포한에서 이용가능한 KickStar, 로컬 PC 에 가상 환경을 만들기 위한 Vagrant
- OS 나 미들웨어 설정 자동화 툴
- 데이터베이스 서버, 웹 서버, 감시 에이전트 등 미들웨어의 설치나 버전 관리, OS 방화벽 기능의 설정 등을 자동화하기 위한 툴
- Chef, Ansible, Puppet, Itamae
- 여러 서버의 관리 자동화 툴(Orchestration)
- 대규모 시스템은 여러 대의 서버로 구축되는데 이러한 분산 환경의 서버들을 관리하기 위한 툴
- 컨테이너 오케스트레이션의 사실상 표준인 Kubernetes 는 컨테이너 가상 환경에 있어서 여러 컨테이너를 통합 관리하는 툴
- Kubernetes 는 Docker 의 여러 컨테이너를 효율적으로 관리
- OS 시작 자동화 툴
본 포스트는 Asa Shiho 저자의 완벽한 IT 인프라 구축을 위한 Docker 2판을 기반으로 스터디하며 정리한 내용들입니다.