내가 알기쉽게 요약해보자 도커 이미지는 해당 프로젝트를 실행하기위한 모든 설정값, 라이브러리, 애플리케이션 코드가 들어있다. 예를들어 스프링 이미지를 하나 만들어놓고, 트래픽이 많아져서 스프링 애플리케이션 인스턴스를 더 추가해야할 상황이있을때, 이미 만들어진 이미지로 여러개의 컨테이너를 얹을수 있으므로 확장성이 뛰어나고,
여러개의 도커 컨테이너 (스프링, mysql등등..)을 관리하려면 docker compose를통해 하나의 파일에 각 컨테이너를 관리할 설정값을 적용할 수 있는것이다..
도커 파일에 있는 설정값을 기준으로(베이스 이미지 - 이 프로젝트가 어떤 프로그램으로 실행될건지, 어떤파일로 실행하는지), 한 프로젝트를 구동할수 있는 전체 프로젝트를 도커가 돌려준다는 뜻이다. 즉, 내가 이제 인텔리제이를 켜서 실행시킬 이유가 없다는뜻. 물론 내 메모리를 사용해서, 하지만 독립적인 환경(리눅스) 에서 실행되기때문에 윈도우나, 맥의 제한이없다. 또 트래픽이 몰린다면 ec2 같은 클라우드 서버에 올리는것이다.
도커를 통한 ci(지속적 통합) / cd(지속적 배포) 의 무중단 배포가 가능한 이유는 docker컨테이너는 독립된 환경에서 실행되기때문에, 기존 컨테이너에 영향을 미치지 않고, 수정 후 배포를 하여도, 중단없이 배포가 되며, ci/cd 파이프라인에서 코드가 푸시될때마다 자동으로 docker 이미지가 빌드되고 컨테이너가 생성되며, 테스트가 통과할 경우, 자동으로 배포하기때문에 인간의 개입이 최소화되어 빠르고, 안정적인 배포가 가능한것이다.
또 컨테이너가 막대하게 증가한다면 개발자가 일일히 관리할 범주가 넘어서기때문에, 자동으로 관리해주는것이 쿠버네티스 같은것이다.
주요 서비스 컴퓨팅 : 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형식으로 작성된 정책으로, 리소스에 대한 허용 또는 거부할 작업 명시. 최소한의 권한 원칙(최소한의 권한만 유저에게 권한을 부여해야한다!)
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 출처 : 내일배움캠프 AWS 5주차
성능을 향상시키기 위해 읽기 작업만 가능한 복제본을 만든다 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 인스턴스, 데이터베이스 인스턴스, 로드밸런서 등이 포함된 실행 환경
propagation 옵션들 REQUIRED : 디폴트값, 이미 진행중인 트랜잭션이 있으면 그 트랜잭션을 사용하고 없으면 새 트랜잭션을 시작. >> REQUIRES_NEW : 항상 새 트랜잭션을 시작하며, 진행중인 트랜잭션은 잠시중단 >> 이미 어떤 트랜잭션이 있더라도 기존 트랜잭션은 중단.
만약 savetodo에 로그를 찍는 메서드가 있는데, 로그를 찍는 메서드는 requires_new전략이 되어있다면, savetodo에 exception을 띄우면 로그를찍는 메서드는 문제없이 로그를찍게된다 왜냐면 로그 트랜잭션은 todo 트랜잭션을 중단시키고, log메서드의 트랜잭션을 시작한후, 종료뒤 todo메서드가 이어지기 때문이다.
docker의 탄생배경 하나의 서비스에 사람이 엄청나게 몰릴수있다 > 하나의 트래픽을 여러개로 분리하자 > 새로운 서비스를 만들자 서비스를 늘리고, 줄일때마다 직접 구현하나? 위를 해결하기위해 컨테이너 개념이 등장하게 되었고 자주쓰는게 도커이다. >> 도커는 자동으로 환경설정을 해주는 서비스이다.
왜 필요한가?? 현대 아키텍쳐가 필요로하는 확장성과 유연성을 쉽고, 빠르게 제공하기위해서
내가 알기쉽게 요약해보자 도커 이미지는 해당 프로젝트를 실행하기위한 모든 설정값, 라이브러리, 애플리케이션 코드가 들어있다. 예를들어 스프링 이미지를 하나 만들어놓고, 트래픽이 많아져서 스프링 애플리케이션 인스턴스를 더 추가해야할 상황이있을때, 이미 만들어진 이미지로 여러개의 컨테이너를 얹을수 있으므로 확장성이 뛰어나고,
여러개의 도커 컨테이너 (스프링, mysql등등..)을 관리하려면 docker compose를통해 하나의 파일에 각 컨테이너를 관리할 설정값을 적용할 수 있는것이다..
도커 파일에 있는 설정값을 기준으로(베이스 이미지 - 이 프로젝트가 어떤 프로그램으로 실행될건지, 어떤파일로 실행하는지), 한 프로젝트를 구동할수 있는 전체 프로젝트를 도커가 돌려준다는 뜻이다. 즉, 내가 이제 인텔리제이를 켜서 실행시킬 이유가 없다는뜻. 물론 내 메모리를 사용해서, 하지만 독립적인 환경(리눅스) 에서 실행되기때문에 윈도우나, 맥의 제한이없다. 또 트래픽이 몰린다면 ec2 같은 클라우드 서버에 올리는것이다.
컨테이너란? 어플리케이션에 필요한 설정을모아서, 패키징하고, 다른컨테이너가 생길때 독립된 환경에서 실행할수있는 기술이다.
docker는 리눅스 기반이다 윈도우든 맥북이든 사용할수있는이유는 리눅스 커널이라는 서비스를 가상화시켜서 시키기때문에 (jvm개념이라고 생각하면 편함) os에 구애받지않는다.
docker 이미지 환경설정등을 미리 저장해놓은 파일이다. docker는 docker 이미지를 실행한다.
docker file docker file은 docker 이미지를 생성하기위한 스크립트이다 예를들어 베이스 이미지 설정 등을 수행한다
docker compose 1개 이상의 도커 이미지를 하나의 어플리케이션으로 관리 할 수 있는도구이다 스프링, 레디스, mysql을 하나로 설정해서 관리할 수 있다.
docker hub 도커 이미지를 저장 공유하는 사이트라고 보면된다.. 깃허브개념으로..
컨테이너 오케스트레이션 많은 컨테이너를 관리하기는 힘들다, 많은 컨테이너를 관리하기 위한 기술이 도커 오케스트레이션이며, 그것을 관리하는 시스템이 쿠버네티스 등이 있다.
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포트랑 할당해준다
host는 host.docker.internal을 port에는 레디스 포트를 입력해주면 된다.
로컬호스트가 왜 안되냐? 지금 docker은 각각의 독립된 환경에서 실행된다고 했다. 즉, 127.0.0.1은 redis insight만이 있는 환경이지 redis가 있는 컨테이너는 아니기 때문이다 host.docker.internal은 컨테이너의 host가아니라 내 컴퓨터 자체의 host의 로컬호스트로 들어가겠다는 뜻이다. host에서는 6379에 redis를 할당해놨으니까. 되는거다!