Showing Posts From
Docker
- 26 Dec, 2025
Docker 설정부터 배포까지: DevOps도 내 몫이다
Docker 설정부터 배포까지: DevOps도 내 몫이다 어느 날 나는 DevOps 엔지니어가 되어 있었다 풀스택 개발자로 입사했다. JD에는 "React, Node.js 가능자" 라고 써있었다. 첫 출근날 대표님이 말했다. "AWS 계정 드렸어요. 배포 환경은 알아서 구축해주시면 돼요." 그날부터 나는 DevOps 엔지니어다. Docker, Kubernetes, CI/CD, 모니터링, 로그 수집, 백업, 보안. 전부 내가 한다. 개발자가 나 혼자라서 그렇다. 누가 할 사람이 없다.Docker부터 시작한 이유 처음엔 EC2에 바로 배포했다. Node.js 설치하고, PostgreSQL 설치하고, Nginx 설정하고. 한 달 뒤 서버가 터졌다. 뭐가 문제인지 모르겠다. 로컬에선 되는데 서버에선 안 된다. 버전 문제? 환경변수 문제? 3시간 삽질 후 깨달았다. "환경을 통일해야 한다." 그게 Docker였다. Dockerfile 작성했다. 처음엔 FROM node:14만 썼다. 지금은 multi-stage build로 이미지 크기 500MB에서 150MB로 줄였다. .dockerignore도 만들었다. node_modules 안 들어가게. docker-compose.yml도 만들었다. DB, Redis, API 한 번에 띄우게. version: '3.8' services: api: build: . ports: - "3000:3000" depends_on: - db db: image: postgres:14 environment: POSTGRES_PASSWORD: ${DB_PASSWORD}로컬에서도 쓴다. docker-compose up 하면 개발 환경 준비 끝. 새로 합류할 개발자 있으면 (언젠가) 바로 시작할 수 있다. ECR에 이미지 올리고 ECS로 돌리고 처음엔 EC2에 Docker 설치하고 거기서 돌렸다. 배포할 때마다 SSH 접속해서 git pull, docker build, docker run. 새벽 2시에 긴급 배포하면서 생각했다. "이거 자동화해야 한다." AWS ECR에 이미지 올리기로 했다. 로컬에서 빌드 → ECR push → EC2에서 pull → 컨테이너 재시작. 그것도 귀찮아서 ECS로 갈아탔다. Fargate 쓴다. 서버 관리 안 해도 된다. Task Definition 만들고, Service 만들고, Load Balancer 연결하고. 처음 설정하는데 이틀 걸렸다. 문서 보면서 삽질. 근데 한 번 만들어두니까 편하다. 새 이미지 푸시하면 자동으로 교체된다. 블루-그린 배포도 설정했다. 무중단 배포. 대표님이 "오, 전문적이네요" 했다. 뿌듯했다. 3일 밤샘한 건 안 말했다.GitHub Actions로 CI/CD 구축 배포 자동화했다고 끝이 아니다. 빌드 → 테스트 → 이미지 푸시 → 배포. 이 과정을 자동화해야 한다. GitHub Actions 쓴다. 무료 티어로도 충분하다. .github/workflows/deploy.yml 만들었다. main 브랜치에 푸시하면 자동으로 돌아간다. name: Deploy on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t myapp . - name: Push to ECR run: | aws ecr get-login-password | docker login ... docker push ... - name: Deploy to ECS run: aws ecs update-service ...실제론 더 복잡하다. 환경변수, 시크릿, 롤백 로직. 처음엔 실패했다. IAM 권한 문제, 환경변수 누락, 타임아웃. 로그 보면서 하나씩 고쳤다. 지금은 커밋 푸시하면 10분 뒤 배포 완료된다. 슬랙에 알림 온다. "Deployment successful ✅" 실패하면 롤백된다. "Deployment failed ❌ Rolling back..." 혼자 만들었다. 뿌듯하다. 근데 유지보수도 혼자 한다. 피곤하다. 모니터링은 필수다 배포하고 끝이 아니다. 서버 살아있는지 봐야 한다. CloudWatch 쓴다. CPU, 메모리, 네트워크 지표. 알람 설정했다. CPU 80% 넘으면 슬랙 알림. 새벽 4시에 알림 왔다. CPU 95%. 뭔가 터졌다. 급하게 노트북 켜서 확인했다. 무한 루프 버그였다. 롤백했다. 10분 만에 복구. 그 뒤로 알람을 더 세밀하게 만들었다. 에러율 5% 넘으면 알림, 응답속도 2초 넘으면 알림, 메모리 부족하면 알림. Sentry도 붙였다. 프론트/백엔드 에러 추적. 에러 나면 슬랭에 바로 온다. 스택 트레이스까지. 덕분에 새벽 알림이 더 늘었다. 주말에도 온다. 디테일하게 설정한 내 잘못이다.로그는 어디로 가는가 서버 여러 대 돌아간다. ECS task 3개. 각 컨테이너가 로그를 뱉는다. 어디서 봐야 하나. CloudWatch Logs에 다 모인다. Log Group 만들어뒀다. 근데 찾기 힘들다. 로그가 너무 많다. "5분 전에 에러 났는데 어디 있지?" 스크롤 하다가 지친다. ElasticSearch 고려했다. 비싸다. 월 100만원. 대신 CloudWatch Insights 쓴다. 쿼리 짜서 검색한다. SQL 비슷하다. fields @timestamp, @message | filter @message like /ERROR/ | sort @timestamp desc | limit 100에러 로그만 필터링해서 본다. 특정 사용자 요청 추적도 가능하다. Request ID로 그룹핑. 처음엔 쿼리 짜는 게 어려웠다. 지금은 익숙하다. 대표님이 "이 기능 왜 느려요?" 물으면 로그 바로 뽑는다. "14:32:05에 DB 쿼리가 3초 걸렸네요. 인덱스 문제입니다." 데이터로 말한다. 설득력 있다. 백업과 재해 복구 처음엔 백업 신경 안 썼다. "PostgreSQL RDS 쓰는데 자동 백업되지 않나?" 된다. 근데 복구 테스트는 안 해봤다. 어느 날 대표님이 물었다. "DB 날아가면 어떻게 되나요?" "...RDS 스냅샷이 있습니다." "복구해본 적 있어요?" 없었다. 그날 밤 복구 시나리오 짰다.RDS 스냅샷 복원 (30분 소요) 환경변수 업데이트 ECS task 재시작 헬스체크 확인테스트 환경에서 해봤다. 1시간 걸렸다. 프로덕션에서 하면 더 걸릴 것 같다. 압박 받으면 실수한다. 스크립트 만들었다. 복구 절차 자동화. S3에 매일 백업도 추가했다. DB 덤프 떠서 올린다. 이제 조금 안심이다. 완전히는 아니다. 재해 복구 계획서도 썼다. 대표님께 공유했다. "전문적이네요." 또 들었다. 근데 이거 원래 DevOps 팀이 할 일 아닌가. 보안은 끝이 없다 AWS 계정 만들고 바로 했던 것. MFA 설정. 루트 계정은 봉인했다. IAM 유저로만 쓴다. 권한은 최소한으로. 필요한 것만 준다. 시크릿은 코드에 안 넣는다. 환경변수나 Secrets Manager. 처음엔 환경변수에 직접 박았다. .env 파일. 그게 git에 올라갔다. API 키가 public repo에. 바로 삭제하고 키 재발급했다. 식은땀 났다. 지금은 AWS Secrets Manager 쓴다. 코드에서 불러온다. 비밀번호도 rotation 설정했다. 90일마다 바뀐다. 보안 그룹도 손봤다. 불필요한 포트 다 막았다. SSH는 내 IP에서만 접근 가능. RDS는 VPC 내부에서만 접근. Load Balancer만 외부에 노출. AWS Inspector 돌려봤다. 취약점 스캔. 몇 개 나왔다. 패치 적용했다. Security Hub도 켰다. 대시보드로 한눈에. 이거 다 공부하는 데 한 달 걸렸다. 보안은 끝이 없다. 근데 해야 한다. 한 번 뚫리면 끝이다. 비용 최적화는 계속된다 AWS 계정 만든 첫 달. 청구서 30만원. "왜 이렇게 나왔지?" Cost Explorer 열었다. 항목별로 나온다. NAT Gateway가 15만원. 왜? 트래픽이 많아서? 아니다. 설정을 잘못했다. VPC endpoint 만들어서 해결. 비용 70% 감소. ECS Fargate도 비쌌다. Task 계속 돌아간다. 스케줄링 넣었다. 새벽에는 task 줄인다. 트래픽 적으니까. RDS는 Reserved Instance로 바꿨다. 1년 약정. 40% 할인. S3는 Intelligent-Tiering 설정. 자주 안 쓰는 건 Glacier로. CloudWatch Logs는 retention 30일. 오래된 건 삭제. 지금은 월 18만원 정도. 반으로 줄었다. 매주 Cost Anomaly Detection 확인한다. 비정상 지출 있으면 알림. 대표님이 "비용 관리 잘하네요" 했다. 당연하다. 회사 돈이고, 내 월급이 여기서 나온다. 근데 이것도 개발자가 할 일인가 싶다. 언제부터 나는 DevOps 엔지니어였나 JD엔 풀스택 개발자라고 했다. 입사 3년. 이제 뭐가 내 업무인지 모르겠다. 프론트 개발 30%, 백엔드 개발 30%, DevOps 40%. 비율로 따지면 DevOps가 제일 많다. Docker, AWS, CI/CD, 모니터링, 로그, 백업, 보안, 비용. 전부 혼자 공부했다. 유튜브, 문서, 삽질. AWS 공인 자격증도 땄다. Solutions Architect Associate. 회사에서 시험비 지원해줬다. 15만원. 합격하고 나서 연봉 협상했다. "DevOps 업무 비중이 크니 조정 필요합니다." 올랐다. 300만원. 연봉 5100만원. 감사하다. 근데 시장가보다는 낮다. 이직하면 6500만원은 받을 수 있다. DevOps 경력 3년이면. 근데 못 간다. 여기 내가 만든 인프라다. 내가 없으면 배포 못 한다. 장애 대응 못 한다. 책임감이다. 아니면 집착이다. 동기가 물었다. "너 언제까지 거기 있을 거야?" 모르겠다. 개발자 한 명 더 뽑히면 그때 생각해본다. 근데 6개월째 안 뽑힌다. 풀스택에서 원맨밴드로 요즘 명함에 뭐라고 써야 할지 모르겠다. Full-stack Developer? DevOps Engineer? SRE? 전부 맞는 것 같기도 하고, 전부 틀린 것 같기도 하다. 정확하게는 "혼자 다 하는 사람"이다. 기획자가 "이 기능 추가해주세요" 하면 프론트 만들고. 백엔드 API 만들고, DB 스키마 수정하고. Docker 이미지 빌드하고, ECR에 푸시하고. ECS 배포하고, 모니터링 설정하고. 장애 나면 로그 보고, 원인 찾고, 패치하고. 비용 넘치면 최적화하고. 보안 이슈 나면 대응하고. 이게 한 사람의 일인가. 대기업 가면 이 일을 팀 단위로 나눠서 한다. 프론트팀, 백엔드팀, DevOps팀, SRE팀. 여긴 나 혼자다. 장점은 빠르다. 의사결정 필요 없다. 그냥 한다. 단점은 외롭다. 코드리뷰 없다. 내 방식이 맞는지 모른다. 기술 부채 쌓인다. 리팩토링할 시간 없다. 기능 개발이 우선이다. 번아웃 온다. 온콜 24시간. 휴가 못 간다. 내가 없으면 서비스 멈춘다. 그래도 배운 건 많다. 3년 전엔 Docker가 뭔지도 몰랐다. 지금은 Kubernetes도 할 수 있다. 필요하면. AWS는 10개 넘는 서비스 쓴다. 손에 익었다. 이력서는 화려해졌다. 실무 경험 빡빡하다. 이직하면 잘 나갈 것 같다. 근데 지금은 여기서 버틴다. 조금만 더. 다음 개발자를 위한 문서 언젠가 개발자가 한 명 더 들어올 것이다. 그 사람을 위해 문서 쓴다. "온보딩 가이드", "배포 매뉴얼", "장애 대응 플레이북". Notion에 정리한다. 스크린샷 넣고, 명령어 적고. 다음 사람이 나처럼 삽질 안 하길 바란다. README.md도 열심히 쓴다. "로컬 환경 설정", "환경변수 설정", "Docker로 실행하기". 코드에 주석도 단다. "왜 이렇게 했는지" 설명. 미래의 나를 위해서이기도 하다. 6개월 뒤엔 내가 쓴 코드도 이해 못 한다. 그때 주석 보고 "아, 그래서 이렇게 했구나" 한다. 문서화는 시간 많이 걸린다. 근데 안 하면 더 걸린다. 같은 질문 받고, 같은 설명 반복하는 시간. 한 번 써두면 계속 쓴다. 대표님도 본다. "문서 정리 잘 되어있네요." "나중에 팀 커지면 도움 될 겁니다." 나중이 언제인지 모르겠지만, 준비는 해둔다.개발자인데 DevOps 엔지니어 됐다. 아니, 될 수밖에 없었다. 혼자니까. 그래도 배운 건 많다. 지치긴 하지만.