Docker
컨테이너 기술과 Docker의 탄생 배경
컨테이너
- 개발자들은 물자의 수송에 획기적인 단축을 가져다준 컨테이너 기술을 "소프트웨어 수송, 즉 배포에 사용할 수는 없을까?" 하는 생각을 하게 되었고, 그 결과로 리눅스 컨테이너(lxc)라는 것을 만들어내기에 이르렀음
- 리눅스 컨테이너 기술은 그 자체로 훌륭하고 완성된 기술이었지만, 애플리케이션을 쉽게 컨테이너 화할 수 있는 생태계 혹은 커뮤니티가 없음
- 2013년에 등장한 도커(Docker)는 바로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고, 그 결과 개발자들은 쉽게 애플리케이션을 포장하고, 컨테이너 방식으로 실행할 수 있게 되었음
왜 Docker 인가?
컨테이너 방식의 장점
의존성 충돌 문제를 해결해줌
- 개발과 배포 환경을 일치시킴
- 수평 확장을 쉽게 해 줌
- 각 서버에 새로운 내용을 배포하기 쉽게 만들어줌
어떤 애플리케이션은, 해당 애플리케이션을 실행하기 위해 반드시 어떤 환경이 구축되어 있어야 하는데, 쉽게는 윈도우용 프로그램을 실행하려면 윈도우 운영체제가 필요한 것을 말함
- 이와 같이 어떤 프로그램(A) 실행에 다른 프로그램(B)이 반드시 필요한 경우, "프로그램 A는 프로그램 B에 의존 관계를 가지고 있다"고 말함
컨테이너 기술은 이 의존성이 충돌하는 문제를 해결함
- 컨테이너 기술은 애플리케이션을 컨테이너 내에 구성함
- 컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함하고 있음
- 이는 각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문에 가능한 것
컨테이너가 무엇을 격리하는가?
- 프로세스
- 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스할 수 있음
- 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없음
- 네트워크
- 기본으로 컨테이너 하나에 하나의 IP 주소가 할당되어 있음
- 파일 시스템
- 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있기 때문에, 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있음
컨테이너는 가상 머신인가?
- 가상 머신은 하나의 호스트(주인) 컴퓨터 위에 여러 개의 독립적인 컴퓨터가 작동할 수 있게 하는 기술로, 이러한 애플리케이션으로는 VMware, VirtualBox, Parallels 등이 있음
- 도커를 비롯한 리눅스 컨테이너 기술은 가상 머신의 접근 방법과는 조금 다르며, 단지 가상 머신과 비슷한 수준의 격리성을 제공함
개발팀의 문제
Java나 Node.js, Python 등을 이용하여 웹 서비스를 개발하는 개발팀은 여러 개발자가 하나의 애플리케이션을 만들기 위해, 보통 비슷한 개발 환경을 구축하기 마련으로, 특정 버전 이상의 JDK, 특정 버전의 MySQL 등을 개발자 각자가 본인의 운영체제에 설치하고, 그 후에 개발을 진행하지만, 보통의 경우 그 과정이 빠르게 진행되지 않음
애플리케이션을 실행시키기 위해 OS나 JDK, Node.js와 같은 런타임 환경의 버전을 얼추 비슷하게 맞춰야 하는 것은 물론이고, 시스템 환경 변수를 애플리케이션에 맞게 구성해야 제대로 작동하는 경우도 종종 볼 수 있음
리눅스만 하더라도, 배포판에 따라 전혀 다른 애플리케이션 설치 과정이 진행됨
다음은 공식 문서에 있는 우분투에 PostgreSQL을 설치하는 과정
sudo sh -c 'echo "deb <http://apt.postgresql.org/pub/repos/apt> $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - <https://www.postgresql.org/media/keys/ACCC4CF8.asc> | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql
- 다음은 CentOS에서 PostgreSQL을 설치하는 과정
sudo dnf install -y <https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm>
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql14-server
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
- 설치 과정 중에 발생하는 사소한 실수나 사전 설치 항목의 부재는 문제 해결에 많은 시간을 소모하게 하며, 특히 새로운 프로젝트에 투입되는 개발자의 경우, 애플리케이션을 실행하기까지 과정이 매우 험난함
- 도커는 이러한 문제를 해결해주며, 커가 실행 중이라면, 어떠한 운영체제든 상관없이 다음 명령어로 즉시 PostgreSQL을 설치하고 실행할 수 있음
docker run --name postgres -e POSTGRES_PASSWORD=mysecret -d postgres
- 지금까지 단일 소프트웨어 패키지 하나의 예시였지만, 애플리케이션 구성 자체가 컨테이너화되면 (이때 보통 Docker Compose라는 툴을 이용함) YAML 파일 하나 + 명령어 하나로 모든 애플리케이션 실행 환경 구성이 완료되는 것을 볼 수 있음
docker-compose up
- 도커는 OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있음
- 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에 개발을 진행할 수 있음
배포 시의 문제
- 실행 및 개발 환경의 일치 이슈는 서비스 배포 환경에서도 동일하게 적용될 수 있음
- 웹 서비스의 배포란 "어떤 애플리케이션이 특정 런타임 환경 위에서 실행되고, 사용자에게 이를 제공한다"라는 것인데, 이는 앞서 말한 실행 환경 구성과 본질적으로 다를 것이 없기 때문
- Amazon Web Service의 EC2 상에 도커를 설치하거나, 또는 좀 더 편리하게 도커 컨테이너를 EC2 서버에서 실행할 수 있게 하는 서비스인 ECS를 이용하여 보다 쉽게 애플리케이션을 배포할 수 있음
수평 확장과 새로운 내용의 배포
서비스 제공자들은 트래픽 분산을 위해 프록시 서버를 운영하며, 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 도움(이러한 서버를 리버스 프록시의 한 종류인 '로드 밸런서'라고 부름)
컨테이너 기술의 가장 큰 장점은 실행 환경의 일치이며, 더 많은 트래픽으로 인한 서버 증설에 컨테이너 기술은 아주 활발하게 이용되고 있음
동일한 애플리케이션 구성을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, 로드 밸런서에 이 서버를 추가하기만 하면 됨(AWS는 서버를 만들고 삭제하는 일을 자동으로 해줌)
이러한 기술을 응용하여, 새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하여 테스트하는 방법도 가능하며, 새 버전의 애플리케이션에서 발생할 수 있는 문제들을 미리 확인하고, 이러한 문제가 사용자 전체에게 영향을 끼치지 않도록 만들 수도 있음
쿠버네티스와 같이 "오케스트레이션 도구"라고 부르는 것들이 이러한 일을 해주는 도구이며, 이는 결국 컨테이너 기술 덕분에 가능한 것
'CS > 데이터베이스' 카테고리의 다른 글
| Cloud - 배포 컨테이너 3 (1) | 2023.06.19 |
|---|---|
| Cloud - 배포 컨테이너 2 (1) | 2023.06.18 |
| Cloud - 운영 환경 구성 5 (0) | 2023.06.18 |
| Cloud - 운영 환경 구성 4 (0) | 2023.06.17 |
| Cloud - 운영 환경 구성 3 (0) | 2023.06.17 |
