일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- isuppercase()
- 스프링
- 최대공약수
- islowercase()
- toLowerCase()
- stringbuilder의 reverse()
- 최소공배수
- replaceAll()
- addDoc
- string과 stringbuilder
- 프로그래머스 레벨1
- sql 데이터형 변환
- ineer join
- 스프링환경설정
- 자바 유클리드
- Git사용법
- 자바 최대공약수
- git 컨벤션
- 동일성과 동등성
- while과 two-pointer
- 베주계수
- 모던자바
- 스프링뼈대
- 자바 최소공배수
- 최대공약수와 최소공배수
- string
- 래퍼타입
- 자바 스트링
- StringBuilder
- 유클리드호제법
- Today
- Total
주노 님의 블로그
20241001 본캠프 54일차 TIL 본문
본캠프 53일차 내용 간단요약
- 09:00 ~ 10:00 : 코드카타
- 10:00 ~ 12:00 : AWS 강의
- 12:00 ~ 13:00 : 점심시간
- 13:00 ~ 14:00 : 면접준비
- 14:00 ~ 18:00 : AWS 강의
- 18:00 ~ 19:00 : 저녁시간
- 19:00 ~ 21:00 : 스탠다드 이론 강의
오늘 해야할 일 ✔️ 🔺 ❌
✔️AWS 완강
✔️DOCKER 복습강의
이건 기억해놓자
내가 알기쉽게 요약해보자
도커 이미지는 해당 프로젝트를 실행하기위한 모든 설정값, 라이브러리, 애플리케이션 코드가 들어있다.
예를들어 스프링 이미지를 하나 만들어놓고, 트래픽이 많아져서 스프링 애플리케이션 인스턴스를 더 추가해야할 상황이있을때, 이미 만들어진 이미지로 여러개의 컨테이너를 얹을수 있으므로 확장성이 뛰어나고,
여러개의 도커 컨테이너 (스프링, mysql등등..)을 관리하려면 docker compose를통해 하나의 파일에 각 컨테이너를 관리할 설정값을 적용할 수 있는것이다..
도커 파일에 있는 설정값을 기준으로(베이스 이미지 - 이 프로젝트가 어떤 프로그램으로 실행될건지, 어떤파일로 실행하는지), 한 프로젝트를 구동할수 있는 전체 프로젝트를 도커가 돌려준다는 뜻이다.
즉, 내가 이제 인텔리제이를 켜서 실행시킬 이유가 없다는뜻.
물론 내 메모리를 사용해서, 하지만 독립적인 환경(리눅스) 에서 실행되기때문에 윈도우나, 맥의 제한이없다. 또 트래픽이 몰린다면 ec2 같은 클라우드 서버에 올리는것이다.
도커를 통한 ci(지속적 통합) / cd(지속적 배포) 의 무중단 배포가 가능한 이유는
docker컨테이너는 독립된 환경에서 실행되기때문에, 기존 컨테이너에 영향을 미치지 않고,
수정 후 배포를 하여도, 중단없이 배포가 되며,
ci/cd 파이프라인에서 코드가 푸시될때마다 자동으로 docker 이미지가 빌드되고 컨테이너가 생성되며, 테스트가 통과할 경우, 자동으로 배포하기때문에
인간의 개입이 최소화되어 빠르고, 안정적인 배포가 가능한것이다.
또 컨테이너가 막대하게 증가한다면 개발자가 일일히 관리할 범주가 넘어서기때문에, 자동으로 관리해주는것이 쿠버네티스 같은것이다.
AWS강의
AWS
- 아마존이 제공하는 클라우드 컴퓨팅 플랫폼이다
- 주요 서비스
컴퓨팅 : EC2
데이터베이스 : RDS
스토리지 : S3
네트워킹 : VPC
보안 : IAM - ON-Premise vs 클라우드
ON-Premise : 조직 내부에서 서버를 직접 설치하고 유지보수하는 방식
클라우드 서비스 : 서버와 인프라를 외부 데이터센터에서 관리하고, 인터넷을 통해 접근하는 방식으로 it 인프라를 보유하지 않아도 된다 - Region and Availability Zone
전세계 여러 위치에 있는 aws데이터 센터의 물리적 위치로 재해시에도 고가용성을 위해 사용을 보장할 수 있다.
가까이 있을수록 빠르긴함, 지역별로 지원을 해주지 않는 서비스도 있어서 어쩔수없이 변환해야할 경우도 있다.
IAM(Identity and Access Management)
- AWS 리소스에 대한 엑세스를 안전하게 제어 할 수 있는 서비스
IAM을 통해 사용자, 그룹, 역할을 생성 및 관리하고, 리소스에 접근할 수 있는 권한을 제어 할 수 있다. - 주요기능
인증, 권한부여, 권한검증 - USER : AWS 리소스에 개별적으로 접근하는 인물로 각 사용자에게 보안 자격을 할당함
GROUP : 공통된 권한을 가진 사용자들을 그룹화하여 효율적으로 관리
Policy : JSON형식으로 작성된 정책으로, 리소스에 대한 허용 또는 거부할 작업 명시.
최소한의 권한 원칙(최소한의 권한만 유저에게 권한을 부여해야한다!)
{ "Version": "policy-version", "Statement": [ { "Effect": "allow-or-deny", "Action": ["action-name"], "Resource": ["resource-arn"], "Condition": { "condition-operator": { "condition-key": "condition-value" } } } ] }
- Policy Structure
Version: 정책의 버전(현재 고정된 버전은 "2012-10-17").
Statement: 정책의 규칙을 나타내며 배열로 여러 규칙을 설정할 수 있음.
Effect: 허용(allow) 또는 거부(deny).
Action: 허용 또는 거부할 AWS 작업을 명시.
Resource: 규칙이 적용될 리소스의 ARN(Amazon Resource Name)을 명시.
Condition: 선택적 조건으로, 특정 조건이 만족될 때만 규칙을 적용. - MFA
다중인증방식으로 누가 해킹을해서 며칠만에 N백만원을 쓰는것을 보기 원치않는다면 하는게 좋을수도... - IAM 설정방법
AWS 검색 > IAM > 사용자 > 사용자 등록
사용자 계정을 만들어준다
그룹 생성을
이제 만들어진 사용자의 계정으로 로그인해보자
대시보드 우측에 aws계정 > 이 계정의 iam 사용자를 위한 로그인 url을 클릭하면
이런창이 뜨게 되고, 등록했던 iam username과 password를 선택하면 로그인하게 된다.
EC2
- 클라우드 서비스 유형
Iaas : 인프라 제공 (예 : AWS EC2)
PaaS : 플랫폼 제공 (예 : AWS Elastic Beanstalk)
SaaS : 소프트웨어 제공 (예 : 구글 드라이브) - EC2 : 가상 서버 인스턴스를 제공하며, 운영 체제와 인스턴스 유형을 선택해 사용 가능.
- 주요 사용 사례 : 웹 애플리케이션 호스팅, 데이터베이스, 머신러닝, 개발 및 테스트
- 인스턴스 타입이름
t2.nano
t2.mciro
여기서 t2는 클래스이름
nano micro는 보시다시피 크기 라고 생각하면된다. -
- 보안 규칙을 만들면 다른 인스턴스에도 할당이 가능하다
하나의 인스턴스에도 여러 인스턴스에도 할당 가능하다
time out 이면 거의 보안규칙 이슈
connection refuse > ec2 내부 이슈
모든 inbound는 디폴트로 막혀있으며
모든 outbound는 디폴트로 열려있다 - 포트번호
21 = ftp 파일전송 프로토콜
22 = ssh로 인스턴스에 원격 접속
80 = http 웹 접속
443 = https
- 보안 규칙을 만들면 다른 인스턴스에도 할당이 가능하다
- SSH연결
chmod 기억하기 각 숫자마다 소유자 그룹 기타사용자
각자 rwx가 있음 1은 --x 2는 -w- 4는 r-- 5는 r-x 6은 rw- 7 은 rwx
r : read
w : write
x : execute - EBS(Elastic Block Store)
EC2 인스턴스에 연결되는 usb같은 저장장치.
인스턴스 종료 후에도 데이터 지속
EBS 볼륨을 다른 인스턴스에 연결 가능. - EBS 스냅샷
EBS 볼륨의 백업 기능
복원을 하는데 시간이 오래걸리지만, 비용이 저렴해진다
EBS와 다르게 다른 REGION으로 보낼 수 있다. - AMI(Amazon Machine Image)
EC2 인스턴스를 시작할 때 사용하는 이미지로, 운영 체제와 애플리케이션이 포함됨
AMI는 EBS 스냅샷을 통해 생성할 수 있으며, 이를 사용해 인스턴스를 복제, 시작, 중지, 복원가능
직접 제작도 가능하다.
- EBS와 AMI의 차이
EBS : 인스턴스에 연결된 스토리지 볼륨
AMI : EC2 인스턴스 시작에 필요한 이미지로, EBS 스냅샷을 사용해 생성 가능
AMI는 인스턴스의 운영 체제와 애플리케이션을 포함 - 사용법
1. 콘솔창에 EC2 검색
2. 인스턴스 시작
3. 설정
4. 인스턴스에 접속하기 위한 키페어를 만든다
실행중인것을 볼 수 있다.(왜자꾸 나 시드니에 만들지)
퍼블릭 IPv4 주소 : 인스턴스에 접근하기 위한 ip
프라이빗 IPv4 주소 : AWS 내부에서 접근하기 위한 주소
IPv4 DNS : 도메인 이름
도메인에 들어갔는데 로딩만뜬다면?
방화벽을 등록해줘야한다.
하단 보안 탭에서
인바운드 룰과 아웃바운드 룰이있는데
아웃바운드룰은 모두에게 열려있고, 인바운드룰 (외부에서 들어오는것)은 막혀있다
따라서 보안 그룹을 누르고
규칙을 추가해주자
http와 https 두개의 접근을 허가해준다는 뜻이다.
참고 : nginx은 https는 안된다...
이제 써봤으니 꺼보자
실행중인 상태는 무려 과금이 청구될수있다
한달 꼬박 와서 무려 10월 1일 임시공휴일에도 와서
열심히 와서! 돈을벌어도 31만원
그러니 공부용으로 열어놨던 인스턴스는 닫아줘야한다.
인스턴스 중지 후 다시 열어준다면 ipv4 주소가 달라져있기때문에
접속 주소를 달리해야한다. - ssh를 통해 접속하기
ubuntu로 접속을 한다
chmod를 통해 400으로 pem파일의 권한을 변경해준다
그다음 ssh -i ~.pem [이름]@[퍼블릭 ipv4] 명령어를 입력한다면
ubuntu@[프라이빗ip4 주소]:~$ 로 바뀐것을 확인할 수 있다
현재 아마존 서버에 연결된것이다.
* 이름은 인스턴스 > 연결 > 사용자이름 이다 - EBS 만들기
인스턴스 > 스토리지에 보면 블록 디바이스가 있다
이것이 볼륨이며 볼륨 id를 클릭해본다
볼륨 id를 클릭하면 우측
볼륨 생성이 있으며 볼륨생성을 하게되면
볼륨이 추가된다.
새로 생성된 볼륨을 체크한뒤
작업 > 볼륨 연결
기존에 만들어둔 인스턴스와 연결하면 된다.
두개의 블록 디바이스가 생성된것을 볼 수 있으며
종료시 삭제는 아니오로 되어있는데
인스턴스가 삭제된다면, 새로만든 볼륨은 삭제되지 않는다는 뜻이다 - 스냅샷 만들기
스냅샷 생성 > 생성버튼을 누른다.
만든 스냅샷은 볼륨 아래 카테고리의
스냅샷에서 볼수있으며
- ami 만들기
Elastic Load Balancer
- Scalability(확장성) vs Avalilability(가용성)
확장성 : 시스템이 사용자수, 데이터 양, 처리량 등이 증가할때 성능을 유지하거나 향상시키는 능력.
수평적 확장 : 인스턴스가 여러개로 늘리는것
수직적 확장 : 인스턴스 성능을 높여서 확장시키는것 (micro > large)
가용성 : 시스템이 항상 정상적으로 작동하고 사용 가능한 상태를 유지하는 능력, 장애 대응과 시스템 안정성이 중요 - 로드 밸런서를 쓰는 이유
요청 분산(EC2와 연동)
단일 액세스 포인트 공개 (Route53과 연동)
인스턴스에 대한 헬스 체크
HTTPS 제공 (ACM과 연동)
고가용성 제공
공개 트래픽과 내부 트래픽분리 - ELB(Elastic Load Balancer)
AWS에서 제공하는 로드 밸런싱 서비스로 트래픽을 여러 EC2 인스턴스에 분산시킴
종류
1. Application Load Balancer : 7계층에서 동작, HTTP/HTTPS 트래픽 처리.
2. Network Load Balancer : 4계층에서 동작, TCP/UDP 트래픽 처리.
3. Classic Load Balancer : 4~7계층에서 동작, 오래된 방식.
로드밸런서는 고가용성과 확장성을 제공하며, 장애와 부하 분산 대응에 용이함. - Application Loadbalancer 예시
#!/bin/bash apt-get update apt-get install -y nginx cat <<EOF > /var/www/html/index.html <!DOCTYPE html> <html> <head> <title>Welcome to Nginx</title> </head> <body> <h1>Hello World!</h1> <p>AWS deployed by Me!</p> <p>private ip is $(hostname -f)</p> </body> </html> EOF sudo systemctl start nginx
- SSL과 HTTPS
SSL (Secure Sokets Layer) : 인터넷 상에서 데이터를 안전하게 전송받기 위한 프로토콜, 클라이언트와 서버간의 데이터를 암호화하여 보안을 제공함
TLS (Transport Layer Security) : SSL을 보완한 최신 기술. 현재 SSL이라고 부르는 대부분의 기술은 실제로. - SSH VS SSL의 차이점
SSH : 주로 원격 서버에 안전하게 접속하기 위한 프로토콜
SSL : 웹 브라우저와 서버 간의 안전한 데이터 전송을 위한 프로토콜
RDS (Relational Database Service)
- 관리형 데이터 베이스로, EC2 인스턴스 내에서 데이터베이스를 직접 설치하지 않고도 관계형 데이터베이스를 생성하고 관리할 수 있는 AWS 서비스
지원하는 데이터베이스 엔진 : PostgreSQL, MySQL, MariaDB, Oracle, Microsoft SQL Server 등. - RDS의 장점
자동 인프라 프로비저닝 : DB 인프라의 자동 구축 및 업데이트
백업 및 복구 : 지속적인 백업과 복구 기능 제공
모니터링: 대시보드를 통한 성능 및 상태 모니터링.
Read Replicas: 성능 향상을 위한 읽기 복제본 지원.
Multi-AZ: 고가용성을 위한 다중 가용 영역 지원.
확장성: 수평 및 수직 확장 지원, EBS 백업 제공.
Storage Auto Scaling: DB 용량이 한계에 도달하면 자동으로 용량을 늘려줌. - EC2 대신 RDS 사용의 장점
인프라 자동화 및 관리 기능 제공.
복구 및 백업 자동화.
SSH 접속은 불가능하지만 관리 부담이 적음. - Read Replicas
성능을 향상시키기 위해 읽기 작업만 가능한 복제본을 만든다
SELECT 쿼리만 가능하다. - Multi-AZ
다중 가용 영역 : 고가용성을 제공하며, 재해ㅐ 복구를 위해 데이터베이스를 여러 영역에 복제
가용성 향상 : 장애가 발생해도 서비스가 계속 작동
확장성은 제공하지 않음
수동 설정 필요 없음
Read Replica도 Multi-AZ로 사용가능
Route 53
- DNS란?
사용자가 쉽게 이해할 수 있는 도메인 이름을 컴퓨터가 이해할 수 있는 IP주소 로 변환해주는 시스템이다
ㅌ1.Root DNS Server : 최상위에 위치하며 TLD DNS Server의 주소를 반환
2. TLD DNS Sever : .com, .net, .org와 같은 최상위 도메인을 관리
3. SLD DNS Server 도메인의 중간 레벨(SLD)을 관리하며, 최종적으로 IP 주소를 반환 - 왜 53인가?
53은 통신에 사용되는 프로토콜 중 하나인 DNS에서 사용하는 기본 포트 번호다
이는 DNS 프로토콜이 TCP와 UDP에서 사용되는 포트 번호다 - IPv4 VS IPv6, 레코드 타입, TTL
IPv4: 32비트 주소 체계, 약 43억 개의 IP 주소 제공.
예시 192.168.0.1
주소가 부족해지자 IPv6가 등장하게 되었다
IPv6: 128비트 주소 체계, 약 340경 개의 IP 주소 제공. 주소 고갈 문제 해결 및 보안성 향상.
예시 2001:0db8:85a3:0000:0000:8a2e:0370:7334 - DNS 레코드 타입
A 레코드: 도메인 이름을 IPv4 주소에 연결.
AAAA 레코드: 도메인 이름을 IPv6 주소에 연결.
CNAME 레코드: 호스트 이름을 다른 호스트 이름으로 매핑.
NS 레코드: 네임서버를 지정. - CNAME vs Alias
CNAME: 도메인 이름을 다른 도메인 이름으로 매핑, 루트 도메인에는 사용 불가.
Alias: AWS 리소스(S3, CloudFront 등)를 도메인 이름으로 매핑, Amazon Route 53에서 지원. - TTL(Time to Live): DNS 레코드가 캐싱되는 시간을 나타내며, 효율성을 높이기 위해 사용.
VPC(Virtual Private Cloud)
- VCP란?
AWS에서 제공하는 가상의 사설 네트워크로, 클라우드 내에서 사용자 정의 네트워크 환경을 설정 가능
사용자 정의 : IP 주소범위 ,라우팅 테이블, 서브넷 보안 그룹 등을 설정가능함
VPC 내에선느 가상서버, 스토리지, 데이터베이스와 같은 AWS 리소스를 관리 할 수 있음 - 서브넷 게이트웨이 NAT
서브넷 : VPC 내에서 IP 주소 범위를 지정하는 가상의 네트워크.
1. 퍼블릭 서브넷 : 인터넷 게이트웨이와 연결되어 있어 인터넷과 직접 통신할 수 있는 네트워크, 공인 IP 주소를 사용하는 인스턴스가 포함된다.
2. 프라이빗 서브넷 : 인터넷에 직접 연결되지 않으며, 인터넷 게이트웨이가 없어서 외부에서 직접 접근불가, 인터넷으로 나가는 트래픽은 NAT 게이트웨이를 통해 가능하게 함 - 라우팅 테이블
트래픽이 서브넷 간 외부 네트워크로 어떻게 전달될지 정의하는 규칙 - IGW(Internet Gateway)
인터넷과 VPC간의 통신을 가능하게 하는 게이트웨이. 퍼블릭 서브넷에 있는 인스턴스가 인터넷과 통신 할 수 있도록 트래픽을 라우팅함 - NAT(Network Address Translation) Gateway
프라이빗 서브넷 인스턴스가 인터넷으로 나가는 아웃바운드 인터넷 트래픽을 가능하게 하는 서비스
프라이빗 서브넷에서 인터넷으로 나가는 트래픽을 공인 IP로 변환하여 외부와 통신할수 있게하고 외부에서 들어오는 트래픽은 프라이빗 서브넷으로 라우팅함
S3(Simple Storage Service)
- s3란?
인터넷 스토리지 서비스로, 웹 규모 컴퓨팅 작업을 위한 데이터 저장 공간을 제공함 - 사용 예시
웹 사이트 호스팅
멀티미디어 파일 저장 및 스트리밍
애플리케이션 데이터 저장
백업 및 복원
아카이브 - 장점
높은 내구성, 가용성 및 안정성
손쉬운 사용 및 관리
보안성
높은 확장성 - 버킷
데이터를 저장하는 최상위 폴더, 객체에 대한 접근 권한과 이벤트 알림을 설정 할 수 있음
s3에 저장되는 파일을 객체라고 부르고 모든 객체는 키(디렉토리)로 식별됨
목적
데이터를 저장하는 컨테이너 역할
접근권한 설정
이벤트 알림 설정
비용 추적 및 모니터링
버킷 네이밍 컨벤션
3자 이상, 63자 이하.
대문자와 언더스코어 사용 불가.
소문자, 숫자, 점(.), 하이픈(-)만 사용 가능.
버킷 이름은 IP 주소 형식을 사용할 수 없음. - 버킷 폴리시
JSON형태로 작성된 문서로 S3 버킷 내 객체에 대한 액세스를 제어, IP주소 또는 범위를 지정, 보안
폴리시 예시
Effect: Allow 또는 Deny로 액세스 권한을 정의.
Principal: 액세스가 허용되거나 거부되는 주체(유저 또는 서비스).
Action: 허용된 작업 (예: s3:GetBucketLocation).
Resource: 액세스가 허용된 AWS 리소스(버킷 또는 객체). - ARN(Amazon Resource Name)
AWS 리소스를 고유하게 식별하는 식별자
arn: AWS 리소스 이름을 가리키는 고정 문자열
aws: 리소스가 AWS에서 호스팅되는 것을 나타내는 고정 문자열
service: AWS 서비스 이름을 나타내는 문자열 (예: s3, lambda, ec2 등)
region: AWS 리전 이름을 나타내는 문자열 (예: us-east-1, ap-northeast-2 등)
account-id: AWS 계정 ID를 나타내는 숫자
resource-id: 해당 리소스의 고유 식별자 (예: S3 버킷 이름, Lambda 함수 이름 등)
Cloudfront
- 사용자에게 컨텐츠를 빠르고 안전하게 제공하기 위한 서비스
- 장점
향상된 속도 : 지리적으로 가까운 서버에 캐싱된 데이터를 가져오기때문에 빠르다
안전 : CDN 서비스를 해주는 업체에서 방화벽 제공 뿐만아니라, DDos방어 기능을 통해 서버 보호, 캐시를 통해 오리진 서버 트래픽이 감소 - 단점
비용, 최신 동적 컨텐츠를 제공해야하는경우 적합하지 않음
EBS(Elastic Beanstalk)
- EBS등장 배경 3-tier 아키텍처
Public Subnet: 로드 밸런서를 위치시켜 트래픽 분산.
Private Subnet: 웹 애플리케이션 서버, 비즈니스 로직을 처리.
Data Subnet: 데이터베이스 서버, 파일 서버 등이 위치하여 데이터를 관리.
3-tier 아키텍처는 확장성과 유연성, 고가용성 및 성능을 제공하며, 각 레이어를 독립적으로 확장 할 수 있음 - EBS의 역할
개발자 친화적 : 인프라 설정을 자동화하며 개발자는 코드에만 집중 할 수 있음
자동 스케일링 지원 : 트래픽 변화에 딸하 인스턴스의 크기와 수를 자동으로 조절
맞춤형 설정 가능 : 자동화된 설정 외에도 세부적인 설정 조정 가능 - EBS의 주요 개념
Application : 애플리케이션 코드, 구성 파일등을 포함
Envvironment : EC2 인스턴스, 데이터베이스 인스턴스, 로드밸런서 등이 포함된 실행 환경
JPA 보강
propagation
- 트랜잭션이 다른 트랜잭션과 어떻게 상호작용할지 결정하는 방식
- propagation 옵션들
REQUIRED : 디폴트값, 이미 진행중인 트랜잭션이 있으면 그 트랜잭션을 사용하고 없으면 새 트랜잭션을 시작.
>>
REQUIRES_NEW : 항상 새 트랜잭션을 시작하며, 진행중인 트랜잭션은 잠시중단
>> 이미 어떤 트랜잭션이 있더라도 기존 트랜잭션은 중단.
만약 savetodo에 로그를 찍는 메서드가 있는데, 로그를 찍는 메서드는 requires_new전략이 되어있다면,
savetodo에 exception을 띄우면 로그를찍는 메서드는 문제없이 로그를찍게된다 왜냐면 로그 트랜잭션은 todo 트랜잭션을 중단시키고, log메서드의 트랜잭션을 시작한후, 종료뒤 todo메서드가 이어지기 때문이다.
스탠다드 이론 - DOCKER
docker
- docker의 탄생배경
하나의 서비스에 사람이 엄청나게 몰릴수있다 > 하나의 트래픽을 여러개로 분리하자 > 새로운 서비스를 만들자
서비스를 늘리고, 줄일때마다 직접 구현하나?
위를 해결하기위해 컨테이너 개념이 등장하게 되었고
자주쓰는게 도커이다.
>> 도커는 자동으로 환경설정을 해주는 서비스이다.
왜 필요한가??
현대 아키텍쳐가 필요로하는 확장성과 유연성을 쉽고, 빠르게 제공하기위해서
내가 알기쉽게 요약해보자
도커 이미지는 해당 프로젝트를 실행하기위한 모든 설정값, 라이브러리, 애플리케이션 코드가 들어있다.
예를들어 스프링 이미지를 하나 만들어놓고, 트래픽이 많아져서 스프링 애플리케이션 인스턴스를 더 추가해야할 상황이있을때, 이미 만들어진 이미지로 여러개의 컨테이너를 얹을수 있으므로 확장성이 뛰어나고,
여러개의 도커 컨테이너 (스프링, mysql등등..)을 관리하려면 docker compose를통해 하나의 파일에 각 컨테이너를 관리할 설정값을 적용할 수 있는것이다..
도커 파일에 있는 설정값을 기준으로(베이스 이미지 - 이 프로젝트가 어떤 프로그램으로 실행될건지, 어떤파일로 실행하는지), 한 프로젝트를 구동할수 있는 전체 프로젝트를 도커가 돌려준다는 뜻이다.
즉, 내가 이제 인텔리제이를 켜서 실행시킬 이유가 없다는뜻.
물론 내 메모리를 사용해서, 하지만 독립적인 환경(리눅스) 에서 실행되기때문에 윈도우나, 맥의 제한이없다. 또 트래픽이 몰린다면 ec2 같은 클라우드 서버에 올리는것이다. - 컨테이너란?
어플리케이션에 필요한 설정을모아서, 패키징하고, 다른컨테이너가 생길때 독립된 환경에서 실행할수있는 기술이다. - docker는 리눅스 기반이다
윈도우든 맥북이든 사용할수있는이유는 리눅스 커널이라는 서비스를 가상화시켜서 시키기때문에 (jvm개념이라고 생각하면 편함) os에 구애받지않는다. - docker 이미지
환경설정등을 미리 저장해놓은 파일이다.
docker는 docker 이미지를 실행한다. - docker file
docker file은 docker 이미지를 생성하기위한 스크립트이다
예를들어 베이스 이미지 설정 등을 수행한다 - docker compose
1개 이상의 도커 이미지를 하나의 어플리케이션으로 관리 할 수 있는도구이다
스프링, 레디스, mysql을 하나로 설정해서 관리할 수 있다. - docker hub
도커 이미지를 저장 공유하는 사이트라고 보면된다.. 깃허브개념으로.. - 컨테이너 오케스트레이션
많은 컨테이너를 관리하기는 힘들다, 많은 컨테이너를 관리하기 위한 기술이 도커 오케스트레이션이며, 그것을 관리하는 시스템이 쿠버네티스 등이 있다. - 도커 볼륨
도커는 휘발성 데이터이다.
컨테이너를 영구적으로 저장하기위해 도커 볼륨이 있다고 생각하면 된다! - 도커를 실습해보자
docker pull redis : 레디스 이미지 받기
docker images : 현재 내 디렉토리의 이미지 목록 출력
docker run -it -d --rm -p 6379:6379 redis:6.2
>> docekr run 새로운 컨테이너 시작
>> -it : 컨테이너 내에서 명령어를 입력할 수 있는 환경을 만듬
>> -d : 백그라운드로 실행하게, 실행후 터미널이 컨테이너에 묶이지 않게 해줌
>> --rm : 컨테이너가 중지되면 자동으로 컨테이너를 삭제함
>> -p 6379:6379 : 호스트의 포트에 컨테이너 포트를 연결함 컨테이너 6379포트를 호스트 6379포트랑 할당하라.
docker exec -it {컨테이너 id} redis-cli
>> docekr exec : 실행중인 컨테이너 내에서 명령을 실행할때 쓰는 명령어이다
docker 이미지를 만들어보자.
- 도커 이미지는 도커에서 돌릴 환경설정파일이나, 코드등을 올린것이라고 하였다.
spring 프로젝트를 한번 docker 이미지로 만들어보자.
아무 스프링 프로젝트나 build를 해보자
build > classes > libs에 jar 파일이 생긴다.
도커파일을 추가한다
#docker 컨테이너 베이스 이미지로 gradle:8.6-jdk21(그레이들 8.6과 jdk21버전) 이미지를 사용한다. FROM gradle:8.6-jdk21 #방금 컴파일시킨후 생성된 jar파일을 JAR_FILE 변수를 정의한다 ARG JAR_FILE=/build/libs/*-SNAPSHOT.jar #JAR_FILE을 DOCKER컨테이너 내부에 복사한다. COPY ${JAR_FILE} /testdocker.jar # 컨테이너가 시작될때의 기본 명령어를 정의한다. #"JAVA" : 자바 명령어 실행 #"JAR" : JAR 파일을 실행하는 옵션 #"-Dspring.profiles.active=default" : 스프링이 실행될 때 활성화할 프로파일을 설정한다. 여기서는 디폴트. #"/testdocker.jar" 파일을 실행한다. ENTRYPOINT ["java","-jar","-Dspring.profiles.active=default", "/testdocker.jar"]
위 도커파일을 기준으로 위 프로젝트의 도커이미지를 생성해보자.
현재 프로젝트의 터미널에
docekr build -t testdocker .
>> docker builde : 도커 이미지를 빌드한다
>> -t testdocker : 도커 이미지에 testdocker이라는 태그를 부착한다.
>> . : 빌드를 수행할때 컨텍스트를 지정한다 (도커 파일을 찾는다)
요약 : 현재 디렉터리에 있는 docker file을 기준으로 docker 이미지를 생성하겠따.!
주의 : 도커가 실행중인 상태여야한다. (The system cannot find the file specified.)
도커파일이 잘 저장되었는지 확인해보자
user@localhost:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testdocker latest dbb90c63cb6d About a minute ago 762MB
도커이미지를 이제 실행해보자 (컨테이너로 만들어보자)
docker run -d -p 8080:8080 {도커이미지 이름}
>> docker run : 도커 컨테이너를 생성하는 명령어
>> -d : 백그라운드에서 실행한다
>> -p 8080:8080 : 호스트의 8080포트에, 컨테이너 내부의 8080포트랑 할당해준다
스탠다드 이론 - 캐시 및 레디스
redis
- cache가 뭔가
disk에 비해 빠르고 휘발성이지만 빠른 메모리이다 그래서 자주 사용되는 데이터 같은 내용을 임시로 저장하여 쉽게쉽게 데이터를 주고받기위한 파트이다. - 캐시의 대표적인 오픈 소스 서비스가 redis이다
즉, redis는 캐시처럼 빠르게 연산을 처리하기위한 휘발성 데이터를 저장해놓은 인메모리 데이터 스토리지이다.
내가 알기쉽게 정리해보자
redis는 데이터베이스는 아니지만, 빠르게 처리해야할 정보를 담아야할때 사용된다.
즉 엄청난 트래픽이 모일때 redis 같은것을 사용하여 빠르게 처리해야할때를 사용된다. - redis(Remote Dictionary Storage)의 특징
key-value 형식으로 데이터를 저장한다
초당 수백만 요청이 가능하다
disk가 아닌 메모리에 데이터를 저장한다
싱글 쓰레드에서 동작한다
다양한 데이터 타입을 지원해준다 - 레디스를 실행해보자
user@localhost:~$ docker run -it -d --rm -p {포트}:{포트} redis
다양한 데이터타입을 저장하는 방법을 실습해보자
1. string
set name juno
>> set : 설정한다
>> name : 이라는 key에
>> juno : juno라는 value를
실무에서는 키값을 전략적으로 사용한다.
set user:{userid}:name juno
>> user에 userid에 해당하는 name을 juno라고 설정해준다.
mget name name1
>> mget : 여러 key값의 value를 가져온다 가져온다.
get name
>> get : key 값의 value를 가져온다
2. list >> 사실상 linked list, stack, queue
stack의 개념일때
rpush student juno1
>> rpush : 그냥 rpush만 쓴다.
>> student의 key값에
>> juno1을 push한다.
pop students >> juno1
queue의 개념일때
rpush student juno1
lpop student
>> queue는 lpop이다.
3. set
유니크한 정보의 모음 >> sns의 팔로우 기능
SADD users:1:follow 1 2 3 4 5 6 7
>> SADD : REDIS의 SET 개념이다
>> users:1:follow >> 라는 키값에 1,2,3,4,5,6,7이라는값을 넣는다.
SCARD user:1:follow >> 7
>> SCARD : 키 값의 밸류 수를 알고싶을때
SMEMBERS user:1:follow > "1" "2" "3" "4" "5" "6" "7"
>> SMEMBERS : 해당 키 값의 요소들을 보고싶을때
팔로우는 중복을 허용하지않기때문에 사용할 수 있다.
SINTER 키1 키2
>> 키1의 요소와 키2의 요소중 중복되는 요소를 출력
4. HASH
HSET {key} {필드} {필드 값} {필드} {필드 값}
HSET user:1 name juno mbti aaaa email a@a.com
HGET user:1 email >> a@a.com
HGET user:1 mbti >> aaaa
127.0.0.1:6379> HSET user:1 name juno mbti aaaa email a@a.com (integer) 3 127.0.0.1:6379> HGET user:1 email "a@a.com" 127.0.0.1:6379> HGET user:1 mbti "aaaa" 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> HGETALL user:1 1) "name" 2) "juno" 3) "mbti" 4) "aaaa" 5) "email" 6) "a@a.com"
5. Sorted Set
sort와 비슷 하지만 정렬 기능이 추가된 개념 >> 랭킹느김
127.0.0.1:6379> ZADD user:rank 100 juno 200 junojyan 300 junho 400 yeppi #ZADD를 사용하여 키 스코어 멤버 스코어 멤버 식으로 추가한다 (integer) 4 127.0.0.1:6379> zrange user:rank +inf 0 byscore rev limit 0 3 withscores #ZRANGE : 정렬된 세트에서 범위를 조회하는 명령어 #+inf : 가장 큰 점수에서부터 조회한다 #0 : 0까지 조회한다 즉 가장큰 점수부터 0까지 조회한다 #byscore : 점수를 기준으로 조회한다 #rev : 이 결과의 내림차순으로 조회하겠다 #limit 0 3 : 3개까지만 조회하겠다 #withscores : 스코어도 같이 조회하겠다 1) "yeppi" 2) "400" 3) "junho" 4) "300" 5) "junojyan" 6) "200" 127.0.0.1:6379> zrange user:rank +inf 0 byscore rev limit 0 3 1) "yeppi" 2) "junho" 3) "junojyan" 127.0.0.1:6379> zincrby user:rank 1000 juno #zincrby 키 추가할스코어 멤버 # 특정 키의 멤버의 스코어를 추가한다. "1100" 127.0.0.1:6379> zrange user:rank +inf 0 byscore rev limit 0 3 withscores 1) "juno" 2) "1100" 3) "yeppi" 4) "400" 5) "junho" 6) "300"
6. geospatial
이런곳의 위치를 집어오자
대충 여기가 레드애플이었던것 같은디..
127.0.0.1:6379> geoadd place:korea 128.3934375 36.1460625 kumo (integer) 1 127.0.0.1:6379> geoadd place:korea 128.41776216410665 36.13566876072503 redapple (integer) 1 127.0.0.1:6379> geodist place:korea kumo redapple "2471.7750" 127.0.0.1:6379> geodist place:korea kumo redapple km "2.4718"
어떨때 많이쓰이나? 젠리같은거 거리측정, 페북 주변친구 찾기 - 레디스를 시각적으로 볼 수 있는 도구 redis insight
https://hub.docker.com/r/redis/redisinsight
위를 보고 천천히 따라하자
오른쪽 한번
아래 한번
그리고 브라우저에서 localhost:5540을 검색.
host는 host.docker.internal을
port에는 레디스 포트를 입력해주면 된다.
로컬호스트가 왜 안되냐?
지금 docker은 각각의 독립된 환경에서 실행된다고 했다.
즉, 127.0.0.1은 redis insight만이 있는 환경이지 redis가 있는 컨테이너는 아니기 때문이다
host.docker.internal은 컨테이너의 host가아니라 내 컴퓨터 자체의 host의 로컬호스트로 들어가겠다는 뜻이다.
host에서는 6379에 redis를 할당해놨으니까. 되는거다!
nginx는 https를 허용하려면 따로 설정을 해야한다..!
'TIL' 카테고리의 다른 글
20241004 본캠프 56일차 TIL (0) | 2024.10.04 |
---|---|
20241002 본캠프 55일차 TIL (0) | 2024.10.02 |
20240930 본캠프 53일차 TIL (0) | 2024.09.30 |
20240927 본캠프 52일차 TIL (0) | 2024.09.27 |
20240921 본캠프 51일차 TIL (0) | 2024.09.26 |