서버란? 물리서버와 논리 서버로 구성 컴퓨터 자체(하드웨어)를 가리크는 물리 서버 컴퓨터에서 동작하고 있는 소프트웨어 논리 서버 (웹서버, DB서버)
분할형 아키텍처는 역할 분담에 따라 구분
수직 분할형 아키텍처
수평 분할형 아키텍처
수직 분할형 아키텍처
역할에 따라 위 또는 아래 계층으로 나뉨
2가지 존재 - 클라이언트-서버형 아키텍처 - 3계층형 아키텍처
클라이언트-서버형 아키텍처
서버 1개에서 모든 클라이언트 처리를 접수한다.
클라이언트 측에 전용 소프트웨어를 설치해야 한다.
서버 처리에 집중되면 확장성에 한계 발생
이런 단점을 극복하고자 3계층형 아키텍처가 나옴
3계층형 아키텍처
클라이언트-서버형을 발전 시킴
프레젠테이션 계층 / 애플리케이션 계층 / 데이터 계층 3층 구조로 분할하여 서버 부하 집중을 개선
스프링의 MVC와 비슷
프레젠테이션 계층 : 사용자의 요청을 받아서 화면에 표시(웹 서버)
애플리케이션 계층 : 무엇을 할지 판단해서 필요한 경우 데이터 계층에 질의 (애플리케이션(AP)서버)
데이터 계층 : 데이터 입출력을 담당한다.(DB서버)
수평 분활형 아키텍처
수직 분활형 아키텍처를 하나 더 늘려 확장성, 안정성을 향상시키는 것
단순 수평 분할형 아키텍처 & 공유형 아키텍처로 나뉨
단순 수평 분할형 아키텍처
샤딩 또는 파티셔닝이라고 불린다.
잘 안쓰임 (본사, 동탄 따로 서버쓰는 꼴) -> 공유형 아키텍처
장점
수평으로 서버를 늘리기 때문에 확장성이 향상된다.
분할한 시스템이 독립적으로 운영되므로 서로 영향을 주지 않는다.
단점
데이터를 일원화해서 볼 수 없다.
애플리케이션 업데이트는 양쪽을 동시에 해 주어야 한다.
처리량이 균등하게 분할돼 있지 않으면 서버별 처리량에 치우침이 생긴다.
공유형 아키텍처
공유형은 단순형과 달리 일부 계층에서 상호 접속이 이루어진다.
장점
수평으로 서버를 늘리기 때문에 확장성이 향상된다.
분할한 시스템이 서로 다른 시스템의 데이터를 참조할 수 있다.
단점
분할한 시스템 간 독립성이 낮아진다.
공유한 계층의 확장성이 낮아진다.
아키텍처 트랜드 오픈화(분산) -> 가상화/클라우드(집중) -> 엣지 컴퓨팅(분산) * 엣지 컴퓨팅 : 최신 키워드, 지리적으로 가까운 위치에 있는 서버로 처리하고, 처리 결과만 중앙으로보내는 아키텍처 엣지 컴퓨팅에서는 관리를 위한 수고를 줄이면서, 서버를 분산하는 것이 중요하다.
지리 분할에 따른 아키텍처
스탠바이형 아키텍처와 재해 대책형 아키텍처
스탠바이형 아키텍처
액티브 - 스탠바이로 구성
액티브 측이 고장나면 스탠바이를 이용
단점은 한 쪽이 계속 놀고 있는 상태가 되기 때문에 양쪽 서버로를 교차이용 하는 경우도 많음
노트북을 하나 사면 간단한 프로젝트로 라도 개발 환경 셋팅을 하루 종일 해야한다. 만약 개발자가 서버를 돌리기 위한 환경을 구축한다면 훨씬 더 많은 리소스가 들 것이다. (언어, 웹서버, 데이터베이스, 자동배포툴 등등..) 서로 잘 동작할 수 있도록 버전관리도 잘 해줘야한다. 서버도 스케일업 할 수도있으며 해당 서버들도 모두 환경 셋팅을 해줘야한다. 도커는 이런 문제를 깔끔하게 해준다.
해결방법
먼저 각 요쇼들이 설치된 모습을 '이미지'란 형태로 박제해서 저장한다. '이미지'는 각 제품 마다 공식적으로 제공되는 이미지도 있고 개인이 설정할 수 있다. git에 저장하는 것 처럼 '이미지'를 도커허브에 업로드돼서 공유되고 다운받아질 수 있다. (어느 컴퓨터에서 동작할 수 있도록 녹화하는 느낌) 도커허브에서 언제든지 다운로드 가능하며 도커 컨테이너라고 불리는 독립된 가상 공간을 만들어내서 복원한다.
VirtualBox 같은 가상컴퓨터 처럼 돌릴 수 있는데 도커는 가상 컴퓨팅과는 또 다른 구조이다. 가상컴퓨팅은 물리적 자원을 서로 분할 해서 쓰기 때문에 성능에 한계가 생기게 된다. 도커는 실행 환경만 독립적으로 돌리는 거라서 컴퓨터에 직접 설치 한 것이랑 별 차이 없는 성능을 낼 수 있고 가상 컴퓨팅보다 훨씬 가볍고 빠르게 각각을 설치, 사용이 가능하다.
위의 코드는 간단한 웹 프로그램이다. 실행 하려면 node와 http-server가 로컬 컴퓨터에 깔려있어야한다. 하지만, 내 컴퓨터에는 아직 셋팅이 안되었다고 가정하자.
docker 사용하기
docker run -it node / sudo docer run -it node
위의 명령어를 사용한다.
위의 명령어를 사용하면 docker에서 뭔가를 다운로드하며 콘솔창처럼 입력이 가능한 모드로 바뀐다. run 명령어는 허브상의 이미지를 내 컴퓨터에서 해동해서 컨테이너로 만든다. 이미지는 컨테이너를 무한대로 재생산 할 수 있다. 즉 이미지는 무한생산이 가능한 컨테이너 조립키드라고 생각해도 된다.
-it 명령어 : 이 컨테이너를 연다음 그 환경안에서 CLI를 사용한다는 것이다. 컨테이너를 만든다음 컨테이너에 난 창문으로 그 안에 있는 근무자랑 대화를 하겠다는 뜻 그래서 자바 스크립트 콘솔을 사용할 수 있다.
docker images
위의 명령어를 사용하면 내 로컬에 도커 이미지들을 확인 가능하다.
docker ps //현재 사용하고 있는 컨테이너 표시
docker ps -a //사용하고 있지는 않은 모든 컨테이너 표시
위의 명령어를 사용하면 docker container 내부의 다양한 정보를 보여준다. 단 지금 사용하고 있는 환경만 보여준다.
docker exec -it agitated_poincare bash
위의 NAMES에 하나를 골라 위의 명령어를 실행하면 내부로 접근가능하다. 가상의 리눅스 환경으로 들어간 것이다.
ls 로 둘러보기
ls 명령어로 둘러 보기도 가능하다. 종료는 ctrl + c
# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .
docker build -t frontend-img .
도커 이미지 다운로드 중...
docker 이미지 생성 완료
# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -v $(pwd):/home/node/app -p 8080:8080 {이미지명}
docker run --name frontend-con -v ${pwd}:/home/node/app -p 8080:8080 frontend-img
docker --name frontend-con : 이전에는 도커에서 임의 컨테이너명을 지어줬지만, 이번에는 생성될 컨테이너의 이름을 내가 정한다.
-v 옵션 : volume의 약자로 도커에서 볼륨이란, 컨테이너와 특정 폴더를 공유하는 것을 말한다. 내가 작성한 코드 (pwd:현재위치)가 home/node/app이라는 사전같은 곳에 부록으로 들어가는 것으로 언제든지 부록에서 꺼내서 컨테이너에서 사용할 수 있게 한다. 따라서 위에 CMD 명령어로 사용가능한 것이다.
-p 옵션 : 포트 옵션이다. 집의 내선번호와 컨테이너를 연결하는 것이다. 집에 8080과 컨테이너 8080을 연결한다. 만약 한개 더 컨테이너를 만든다면 -p8080:8081로 연결한다 (8081:컨티이너 내선번호) 동시에 컨테이너 8080에 접속할 순 없다.
Data Base image 말기
#이미지 만들기
docker build -t database-img .
#이미지 돌리기
docker run --name database-con -p 3306:3306 database-img
기존 front 방식과 동일하며 db인 mysql은 3306포트가 기본이고 집에서도 3306으로 연결한다.
위와 같이 3306 포트가 열린 것을 확인할 수 있다.
위와 같이 3306 포트가 열린 것을 확인할 수 있다.
만약 위 처럼 한다면 해당 터미널을 사용하지 못한다. 따라서 디비는 다음과 같이 사용한다.
docker run --name database-con -d 3306:3306 database-img
-p가 아닌 -d로 사용하면 해당 터미널 사용가능.
한방에 도커를 설정 하는 방법
docker-compose.yml 활용
위는 docker-compose.yml 이며, db, front, backend 모두가 작성되어있다.
#실행(경로는 맨위)
docker-compose up
시간이 꽤 걸린다...
완료...!
docker file
docker file은 나만의 설계도 이다.
docker file은 front, back, db에 각각 하나 씩 무조건 들어가 있다.
FROM 명령어 : 해당 버전을 명시한다.
RUN 명령어 : 이미지 생성 과정에서 실행할 명령어
CMD 명령어는 이미지로 부터 컨테이너가 만들어져 가동될 때 기본적으로 바로 실행하는 명령어 (시작프로그램)
도커 허브 탐방하기
도커 허브 사이트에 방문하여 node를 검색하면 위와 같이 공식 이미지가 올라와 있다. 도커의 이미지라는 것은 리눅스 컴퓨터의 특정 상태를 캡처해서 박제(클라우드에 올려놓은 것) 해놓은 것을 의미한다. (즉, 위의 집에 입주 시켜놓은 상태)