목차로컬 개발 환경 구성AWS 인프라 구축CI/CD 자동화많은 과정이 내포되어 있지만, 함축해서 작성했다.Step1: 로컬 개발 환경 구성 (Spring Boot + Docker)혼자 개발할 땐 로컬 DB만 깔아서 쓰면 그만이지만, 팀 프로젝트와 배포까지 고려한다면 처음부터 격리된 환경(Docker)을 잡고 가는 것이 좋다고 판단했다. 1. 기술 스택 (Tech Stack)가장 보편적이고 안정적인 스택을 선정했다.Language: Java 17Framework: Spring Boot 3.5.9Database: MySQL 8.0Build Tool: Gradle 2. 보안과 환경 변수 관리 (.env)처음 환경 세팅을 할 때 MySQL user, password를 그대로 노출하는 것에 거부감이 느껴졌다. 이..
docker
https://www.udemy.com/course/docker-kubernetes-2022/ 자체 EC2 인스턴스 관리의 부담을 덜기 위해 클라우드 서비스 프로바이더 기술을 사용한다. 이번 시간에는 AWS ECS를 활용한 프로덕션 환경 구성에 대해 알아본다.ECS 아키텍쳐, 개념ECS는 AWS의 컨테이너 오케스트레이션 도구로, 다음 4가지 계층으로 구성된다. 개념설명역할Cluster컨테이너가 실행되는 논리적 네트워크 공간인프라의 경계 (VPC 설정 등)Service테스크의 실행 관리자 (Auto Scaling, 로드 밸런싱)n개 테스크 유지와 같은 역할을 수행Task Definition애플리케이션의 블루프린트- Docker Image, CPU/RAM, Envdocker-compose.yml과 유사한 역..
컨테이너 배포 (Deployment)왜 배포에 컨테이너를 사용하는가?컨테이너는 애플리케이션 코드와 실행 환경을 하나의 독립적인 패키지로 묶어준다.도커가 설치된 곳이라면 어디서든 동일하게 실행 가능로컬 머신에서 작동하는 코드가 리모트 머신에서도 그대로 작동머신 자체에 NodeJS 같은 도구를 직접 설치할 필요 없음 (컨테이너 내부에 모두 포함)핵심 아이디어는 아래와 같다.로컬에서 작동하면, 배포 후에도 작동한다개발 vs 프로덕션1. 바인드 마운트개발: 바인드 마운트를 많이 사용 (코드 변경 즉시 반영)프로덕션: 바인드 마운트를 사용하면 안 됨2. 빌드 단계React 앱 같은 경우, 배포 전에 코드 변환 및 최적화를 위한 빌드 단계가 필요개발과 프로덕션에서 다른 설정이 필요할 수 있음3. 다중 컨테이너 프로..
지난번 Image / Container가 UnionFS를 이용해 어떻게 레이어을 구성하는 지도 봤고 이를 통해 docker run을 했을 때 내부에서 어떻게 구현되는 지도 간단히 살펴봤다. 오늘은 이 핵심 요소 이미지, 컨테이너에 대한 정의와 명령어들에 대해 알아본다.Image이미지는 컨테이너를 위한 blueprint, 템플릿이다. 특징읽기 전용(Read-only)이며, 애플리케이션뿐만 아니라 필요한 환경(OS, 런타임, 도구 등)을 모두 포함한다.이미지 자체는 실행되지 않으며, 컨테이너로서 실행되어야 한다.생성 방식DockerHub 등에 있는 공식 이미지를 사용하거나, Dockerfile을 정의하여 직접 빌드할 수 있다.Dockerfile 명령어들은 이미지 빌드 시 실행되며, 각 명령어는 하나의 레이어..
이전 글에서 namespace와 cgroup에 대해 알아보았다.namespace: 격리cgroup: 제한그런데 이 둘만으로 Docker에서 사용되는 Container처럼 구현할 수는 없다.컨테이너는 화물 컨테이너처럼 환경을 통째로 가져오는 기술이다. 따라서 실행 환경 설치를 하지 않고 바로 실행할 수 있다. 내가 처음 Docker에서 Container에 대해 설명을 들었을 때 화물 컨테이너라는 비유를 들었던 게 기억이 난다. namespace / cgroup은 프로세스를 가두고... 제한하는 기술이다. 그렇다면 환경을 통째로 가져온다 이건 어떻게 구현할 수 있을까?Union FS포토샵 레이어를 떠올려보자.[레이어 3] 텍스트 "Hello"[레이어 2] 빨간 원[레이어 1] 배경 이미지-----------..
이전 글에서 namespace로 프로세스를 격리하는 방법에 대해서 알아봤다. 하지만 마지막에도 언급했듯이 격리된 프로세스만으로는 부족한 점이 몇가지 있다.CPU를 100% 점유하는 나쁜 녀석들메모리를 무한정 먹어버리는 이상한 녀석들그럼 착한 녀석들로 만들어주기 위해선 어떻게 해야될까? 이 문제를 해결하는 게 cgroup이다.cgroup?namespace가 '뭘 볼 수 있는가'를 제한한다면, cgroup은 '얼마나 쓸 수 있는가'를 제한한다. cgroup은 Control Groups의 약자로, 프로세스 그룹의 리소스 사용량을 제한, 계량, 격리하는 리눅스 커널 기능이다. cgroup이 제어하는 리소스컨트롤러설명cpuCPU 시간 할당량 제한 -> 전체의 50%만 써cpuset특정 CPU 코어만 사용하도록 ..
docker는 어떻게 내 컴퓨터 안에서 또 다른 OS가 독립적으로 돌아가도록 할 수 있을까? image를 통해 여러 container들을 만들어보면서, 신기하다... 밖에 생각을 안했다. 컨테이너는 VM처럼 하드웨어를 가상화하는 게 아니다. 리눅스 커널의 기능을 이용해 프로세스를 격리하고, 제한하는 기술을 기반으로 한다. 이 기능은 namespace, cgroup + union fs를 메인으로 한 기술들을 통해 이루어진다. 오늘은 namespace에 대해 알아본다. (사실 다 하려했다가 분량이 넘 길어져서 컷함 ^^7) https://bentist.tistory.com/73 가상화, 도커 의미(이미지와 컨테이너)도커가 필요한 이유는 무엇인가? 내가 만든 파워포인트 문서를 다른 컴퓨터에서 열었을 때, 글꼴..
왜 티스토리는 기본모드에서 yaml 코드블록을 지원하지 않는가..[물론 마크다운으로 하면 되는데 그러면 설정이 깨짐;;] 지난 포스팅에서는 docker-compose를 이용해 Node.js + React 개발 환경을 도커로 구성했다. 그런데 사실 Node.js는 도커 없이 직접 설치한다고 해도 그렇게 어렵지는 않다. 하지만 PHP, Laverel은 이야기가 조금 다르다.PHP는 Interperter일 뿐이다. PHP 혼자서는 HTTP Request를 처리할 수 없다.웹 서버가 별도로 필요하다. Nignx, Apache 같은 웹 서버가 요청을 받아 PHP에게 넘겨줘야 비로서 코드가 실행된다.설치 과정이 복잡하다. 만약 PHP + Nginx + MySQL을 각각 버전에 맞춰 설정한다고 해보자.나 혼자 컴퓨터..
유틸리티 컨테이너란 무엇인가? 기존 애플리케이션 컨테이너를 기억해보자.애플리케이션 코드 + 실행 환경이 포함된다.Dockerfile을 빌드하고 docker run으로 실행하면 애플리케이션이 시작된다.Node API, React SPA, DB 등유틸리티 컨테이너란?정식 명칭은 아니다.다만 특정 환경만 포함하는 컨테이너다. (etc: Node.js, PHP, Python 등)애플리케이션을 시작하지 않고, 특정 작업/명령을 실행하기 위해 사용한다.이미지 이름 뒤에 실행할 명령을 추가하는 방식이다.왜 사용하는가?아래와 같은 상황을 생각해보자. 새 프로젝트를 시작할 때를 기준으로 한다.Node.js 프로젝트 생성 시 npm init 명령이 필요하다.하지만 npm은 Node.js가 설치되어 있어야만 사용 가능하다...
Docker Compose란?Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구다. 기존 multi-container 환경에서는 각각의 container를 다루기 위한 커맨드가 필요했다.기존 방식Docker Compose여러 개의 docker build 실행하나의 구성 파일(docker-compose.yaml)여러 개의 docker run 명령하나의 명령 (docker-compose up)긴 명령어를 매번 입력설정을 파일로 저장하여 재사용네트워크 수동 생성자동으로 네트워크 생성 및 연결 Docker Compose의 역할이 아닌 것Dockerfile을 대체하는 것은 아니다.이미지나 컨테이너를 대체하는 것은 아니다.다수의 호스트에서 컨테이너를 관리하는 도구가 아니다. (단일..