우리는 개발을 마친 후 다양한 사용자들이 사용할 수 있게 해야한다.
그게 우리가 이 어플리케이션을 만든 목적이다.
근데 어플리케이션이 어디엔가 공유가 되어야 모두가 사용할 수 있을 것이다.
그건 어떻게 해야하는 걸까?
==> 간단한 흐름은 아래와 같다.
1. 어플리케이션과 그 종속성을 Docker컨테이너로 패키징한다.
( 어플리케이션 : 우리가 작성한 코드, 예를 들면 웹 서버, API, 데이터 처리 로직 등의 구현된 코드
종속성 : 그 구현된 코드 실행에 필요한 외부 라이브러리, 프레임워크, 또는 다른 어플리케이션에 필요한 모듈.(ex) Java로 개발된 웹 어플리케이션의 경우 Spring 프레임워크, JPA 또는 외부 라이브러리 등을 그 종속성에 포함할 수 있다.)
Docker 컨테이너로 패키징 : Dockerfile이라는 스크립트를 사용하여, 우리의 어플리케이션 코드와 그 종속성, 그리고 이를 실행하는 데 필요한 환경( 예:운영체제, 필요한 환경 변수, 파일 경로 설정 등)을 모두 포함하는 '이미지'를 만든다.
이 이미지를 기반으로 컨테이너를 실행하게 되면, 그 내부에서 우리의 어플리케이션은 일관된 환경에서 동작하게 된다. )
2. 해당 컨테이너를 클라우드 서비스의 서버에 배포한다. (ex)AWS의 EC2 또는 ECS 서비스 사용)
3. 사용자들은 인터넷을 통해 우리의 완성된 어플리케이션에 접근하고 사용할 수 있다.
보통 도메인 이름(ex) www.naver.com)을 사용해 웹 브라우저에서 직접 어플리케이션을 찾아갈 수 있다.
아래는 흐름에 대한 걸 조사하면서 정리한 용어.
하드웨어(Hardware)
컴퓨터나 서버의 물리적인 구성 요소를 의미.
ex) CPU, RAM, 하드 드라이브, GPU 등이 있다.
서버(Server)
서비스를 제공하는 역할을 하는 컴퓨터나 프로그램을 의미.
ex) 웹 서버는 웹 페이지를 사용자에게 제공
데이터베이스 서버는 데이터베이스 관련 요청을 처리
운영체제(Operation System, OS)
하드웨어와 소프트웨어 간의 인터페이스 역할을 하는 시스템 소프트웨어.
ex) Windows, macOS, Linux, Ubuntu 등
개발환경(Development Environment)
프로그램을 개발하기 위한 도구 및 설정의 집합을 의미.
IDE(통합 개발 환경)
ex) Intellij, Eclipse, Visual Studio 등
어플리케이션(Application)
사용자가 특정 작업을 수행하기 위해 사용하는 소프트웨어 프로그램을 의미.
ex) 웹 브라우저, 워드 프로세서, 게임 등
Docker
컨테이너 기반의 애플리케이션 배포 도구. 실행 환경을 포장하는 도구.
어플리케이션을 실행하기 위해 필요한 모든 것(코드, 라이브러리, 환경 변수, 파일 등)을 포함하는 컨테이너를 만드는 것.
컨테이너는 애플리케이션과 그에 필요한 모든 의존성을 포함하는 경량의 실행 단위이다.
Docker를 사용하면 개발 환경과 운영 환경 간의 차이점을 최소화하고,
애플리케이션을 빠르고 일관성 있게 배포할 수 있다.
Docker는 우리의 어플리케이션과 그 어플리케이션의 실행 환경을 하나의 '패키지'로 만들어준다.
이 '패키지'는 일관된 방식으로 어디서든 실행될 수 있게 된다.
Docker의 장점
환경 일관성: 개발자의 로컬 환경에서의 동작과 프로덕션 환경에서의 동작이 동일.
종속성 충돌이나 "내 컴퓨터에서는 되는데"와 같은 문제를 최소화.
이식성: Docker 이미지는 어디서든 실행된다. 클라우드, 온프레미스, 다른 개발자의 PC 등 어디서든 동일한 환경으로 어플리케이션을 실행할 수 있다.
버전 관리와 롤백: Docker 이미지는 버전화될 수 있다. 따라서, 이전 버전의 어플리케이션으로 쉽게 롤백할 수 있다.
Docker로 개발된 어플리케이션은 클라우드 환경에서 빠르고 일관되게 배포될 수 있다.
이를 통해 '내 PC에서는 되는데 서버에서는 안돼'와 같은 문제를 피할 수 있다.
이 외의 여러 특징들도 있어서 Docker와 클라우드를 함께 사용하면
빠르고, 효율적이며, 안정적인 서비스 배포를 실현할 수 있는 것이다.
Docker에서는 이미지라는 스냅샷을 만들어
이것을 기반으로 컨테이너를 실행시킨다.
Docker를 이용하여 개발 환경을 포장하면,
이를 클라우드 서비스에 쉽게 배포할 수 있다.
이렇게 하면
사용자들은 인터넷을 통해 언제든지 어플리케이션에 접근할 수 있게 된다.
Docker와 클라우드 서비스는
개발한 어플리케이션을 안정적으로 배포하고 확장하는데
큰 도움을 주는 도구이다.
VMWare나 Ubuntu는 상황에 따라 선택적으로 사용될 수 있다.
클라우드 서비스
둥둥 떠 있는 클라우드(구름)에 파일을 집어넣는다.
하늘에 구름은 다 연결,연동이 되어 있다.
기본적으로 물리적인 서버, 저장소, 네트워크 등의 리소스를 통해 제공하는 서비스.
물리적 서버를 직접 관리하지 않고도 컴퓨팅 리소스를 대여받아 사용할 수 잇게 해준다.
가상화된 서버, 개발환경, 소프트웨어를 수요에 맞춰 즉시 대여해주고 요금을 책정하는 서비스.
서버, 저장소, 데이터베이스, 네트워킹, 소프트웨어 등의 자원을 제공한다.
클라우드의 기본 요건 3가지
요리사 = 개발자
주방 = 네트워크
싱크대 = 서버
주방기구(가스레인지) = 운영체제
요리도구(프라이팬) = 개발환경
완성된 요리 = 카카오톡(완성된 프로그램)
서버, 네트워크를 가상화해야 대여(클라우드)할 수 있다.
클라우드의 기본 요건 3가지(이 3가지는 있어야 클라우드라 할 수 있다.)
SaaS (Software as a Service)
소비자에게 완성된 프로그램을 대여
"나는 완성된 요리를 원해"
Paas (Platform as a Service)
개발자에게 운영, 개발 환경을 제공
"나는 직접 오징어튀김을 만들거야"
IaaS (Infrastructure as a Service)
"나는 가스레인지와 후라이팬이 아닌,
직접 화덕을 설치해서 피자를 구울거야"
가상화(Virtualization)
물리적인 하드웨어 리소스를 가상의 여러 개의 "가상 머신"으로 나누어 활용하는 기술.
VMWare와 같은 가상화 소프트웨어를 사용하면, 하나의 서버에서 여러 운영 체제를 동시에 실행할 수 있ek.
하이퍼바이저(Hypervisor)
가상화를 가능하게 하는 소프트웨어나 하드웨어.
하이퍼바이저는 물리적 리소스를 가상 머신에 할당하며,
각 가상 머신의 작동을 관리
리눅스(Linux)
오픈 소스 운영 체제의 커널이다.
리눅스는 다양한 '배포판'을 통해 사용자들에게 제공되며
우분투는 그 중 하나이다.
리눅스의 경우, '리눅스' 자체는 사실상 커널을 지칭한다.
하지만 일반적으로 사람들이 리눅스라고 할 때 종종 전체 운영체제를 의미하게 되는데
이는 대체로 리눅스 커널을 기반으로 한 여러 배포판 때문이다.
모든 운영체제에는 커널이 있다. 그 커널은 해당 운영체제의 핵심적인 역할을 담당한다.
리눅스의 경우 그 이름이 리눅스 커널인 것이다.
cf)
윈도우: Windows NT 커널을 기반. 이는 Microsoft의 윈도우 NT 계열 운영 체제(예: Windows XP, Windows 7, Windows 10, Windows Server)의 핵심입니다.
맥 (macOS): UNIX 기반의 운영 체제로, 그 핵심은 "XNU"라는 커널을 사용.
리눅스: "리눅스 커널"을 사용. 리눅스 커널은 전세계의 개발자들에 의해 공헌받아 개발되었고, 이 커널 위에 다양한 소프트웨어와 유틸리티가 추가되어 리눅스 배포판이 형성된다.
"리눅스" 자체는 정확히는 운영 체제의 커널이다.
이 리눅스 커널 위에 여러 사용자 공간 유틸리티와 어플리케이션들이 추가되어
"리눅스 배포판"이나 "리눅스 기반 운영 체제"가 만들어진다.
예를 들면
우분투(Ubuntu) : 리눅스 커널 + GNU 유틸리티 + GNOME 데스크톱 환경 + 여러 추가 소프트웨어 등으로 구성되어 있다.
CentOS, Fedora, Debian : 각각 리눅스 커널을 기반으로 다양한 유틸리티와 소프트웨어를 포함한 배포판이다.
일번적으로 사람들이 리눅스라고 말할 때, 대게 리눅스 기반의 운영체제나 리눅스 배포판을 가리키는 경우가 많다.
하지만 엄밀히 말하면
리눅스는 운영체제의 핵심인 커널을 의미한다.
커널(Kernel)
사전적 의미로는 알맹이.
운영체제의 핵심 구성 요소.
하드웨어와 어플리케이션 사이에서 중재자 역할.
운영체제 제일 하층에서 작동되는 소프트웨어.
여러 개의 프로세스들을 관리하기 위해 스케줄링도 한다.
가장 큰 역할은 컴퓨터의 물리적 자원과 추상화 자원을 관리하는 것.
커널은 왜 위와 같은 자원들을 관리해줄까?
사용자가 물리적인 하드웨어에 접근하고 사용할 수 있도록 매개하기 위해서.
컴퓨터만의 언어와 규칙으로 하드웨어에 접근하고 통신해야 하는데
일반 사용자들은 이러한 언어와 규칙을 전혀 모른다.
따라서, 커널은 사용자와 컴퓨터 중간에서 상호작용 할 수 있도록 도와주는 '번역가'같은 역할을 하는 것이다.
VMWare
가상 머신을 생성하고 관리할 수 있는 가상화 소프트웨어.
Docker와는 다르게 전체 OS를 가상화한다.
여러 개의 운영체제를 하나의 물리적인 기계에서 동시에 실행할 수 있게 해준다.
클라우드 환경에서도 VMWare와 같은 가상화 기술은 활용되지만,
대부분의 클라우드 제공 업체들은 자체 가상화 기술을 사용한다.
필요에 따라 사용할 수 있지만, 모든 상황에서 필요한 것은 아니다.
VMWare Workstation
개인용 컴퓨터에서 여러 운영 체제를 동시에 실행할 수 있게 해주는 소프트웨어
ex)윈도우 운영체제인 내 노트북에서
가상의 컴퓨터를 통하여 리눅스 환경에서 작업을 할 수 있다.
우분투(Ubuntu)
리눅스 기반의 운영 체제이다.
많은 서버 환경에서 사용되며,
Docker나 VMWare를 실행하는 호스트 OS로 사용될 수 있다.
'개인 공부 (23.07~' 카테고리의 다른 글
웹 용어 정리 (0) | 2023.08.23 |
---|---|
cmd 명령어 (0) | 2023.08.22 |
MyBatis 파라미터 바인딩 방법 2가지 (1) | 2023.08.18 |
[Spring] 의존성 주입(DI) 개념, 설정, 사용법 (0) | 2023.08.17 |
[HTTP Method] 8가지 개념 (0) | 2023.08.15 |