[{"data":1,"prerenderedAt":338},["ShallowReactive",2],{"post-document:\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-03-deployment-principles\u002F":3},{"id":4,"title":5,"body":6,"categories":318,"date":320,"description":321,"extension":322,"image":323,"key_concepts":323,"last_modified_at":323,"legacyPath":324,"meta":325,"navigation":327,"part":328,"path":329,"published":327,"robots":323,"seo":330,"series":331,"stem":332,"strengths":323,"summary":323,"tags":333,"tradeoffs":323,"__hash__":337},"posts\u002Fposts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-03-deployment-principles.md","Docker 기초 3편: CI\u002FCD 연결과 배포 원칙",{"type":7,"value":8,"toc":311},"minimark",[9,14,18,41,44,52,55,61,65,68,74,77,83,86,89,95,99,102,105,129,132,135,141,144,147,150,153,156,159,162,166,172,256,260,307],[10,11,13],"h2",{"id":12},"_1-docker와-cicd가-연결되는-순간","1. Docker와 CI\u002FCD가 연결되는 순간",[15,16,17],"p",{},"소스 코드를 Github에 올리는 순간부터 시작한다.",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-bash shiki shiki-themes github-light github-dark","git push\n","bash","",[26,27,28],"code",{"__ignoreMap":24},[29,30,33,37],"span",{"class":31,"line":32},"line",1,[29,34,36],{"class":35},"sScJk","git",[29,38,40],{"class":39},"sZZnC"," push\n",[15,42,43],{},"이후 CI가 실행된다",[19,45,50],{"className":46,"code":48,"language":49,"meta":24},[47],"language-text","Developer\n->\nGithub\n->\nGithub Actions\n->\nTests\n->\nSpring Boot build\n->\napp.jar\n->\nDocker build\n->\nDocker Image\n->\nDocker push\n->\nDocker Registry\n","text",[26,51,48],{"__ignoreMap":24},[15,53,54],{},"그 다음에 CD가 이뤄진다.",[19,56,59],{"className":57,"code":58,"language":49,"meta":24},[47],"Production Server\n->\nDocker pull\n->\nDocker Image\n->\nDocker run\n->\nContainer\n->\nSpring Boot 실행\n",[26,60,58],{"__ignoreMap":24},[10,62,64],{"id":63},"_2-docker를-배포-단위로-사용","2. Docker를 배포 단위로 사용",[15,66,67],{},"Docker가 없는 경우",[19,69,72],{"className":70,"code":71,"language":49,"meta":24},[47],"Source Code\n->\nServer 접속\n->\nJava 설치\n->\nDependency 설치\n->\n설정\n->\n실행\n",[26,73,71],{"__ignoreMap":24},[15,75,76],{},"Docker를 사용하면",[19,78,81],{"className":79,"code":80,"language":49,"meta":24},[47],"Docker Image\n->\nServer\n->\nDocker run\n",[26,82,80],{"__ignoreMap":24},[15,84,85],{},"으로 단순화",[15,87,88],{},"그래서 중요한 개념",[90,91,92],"blockquote",{},[15,93,94],{},"배포 단위를 Source Code가 아니라 Docker Image로 만든다.",[10,96,98],{"id":97},"_3-docker의-핵심-철학","3. Docker의 핵심 철학",[15,100,101],{},"Docker를 공부할 때 이 개념도 굉장히 중요하다.",[15,103,104],{},"Container가 이상해졌다고 안에 들어가서:",[19,106,108],{"className":21,"code":107,"language":23,"meta":24,"style":24},"vi ...\napt install ...\n",[26,109,110,118],{"__ignoreMap":24},[29,111,112,115],{"class":31,"line":32},[29,113,114],{"class":35},"vi",[29,116,117],{"class":39}," ...\n",[29,119,121,124,127],{"class":31,"line":120},2,[29,122,123],{"class":35},"apt",[29,125,126],{"class":39}," install",[29,128,117],{"class":39},[15,130,131],{},"하면서 직접 수정하는 방식은 좋지 않다.",[15,133,134],{},"대신:",[19,136,139],{"className":137,"code":138,"language":49,"meta":24},[47],"Dockerfile 수정\n      ↓\n새 Image Build\n      ↓\n새 Container 생성\n      ↓\n기존 Container 제거\n",[26,140,138],{"__ignoreMap":24},[15,142,143],{},"한다.",[15,145,146],{},"즉:",[15,148,149],{},"수리해서 계속 사용",[15,151,152],{},"하는 것이 아니라:",[15,154,155],{},"문제가 있으면 새것으로 교체",[15,157,158],{},"하는 방향이다.",[15,160,161],{},"이것을 Immutable Infrastructure 사고방식이라고 한다.",[10,163,165],{"id":164},"_4-기억하면-되는-구조","4. 기억하면 되는 구조",[19,167,170],{"className":168,"code":169,"language":49,"meta":24},[47],"                      Dockerfile\n                           │\n                           │ docker build\n                           ▼\n                     Docker Image\n                           │\n             ┌─────────────┴─────────────┐\n             │                           │\n         docker run                 docker push\n             │                           │\n             ▼                           ▼\n         Container               Docker Registry\n                                         │\n                                     docker pull\n                                         │\n                                         ▼\n                                  Production Server\n                                         │\n                                     docker run\n                                         │\n                                         ▼\n                                     Container\n",[26,171,169],{"__ignoreMap":24},[173,174,175,188],"table",{},[176,177,178],"thead",{},[179,180,181,185],"tr",{},[182,183,184],"th",{},"개념",[182,186,187],{},"의미",[189,190,191,200,208,216,224,232,240,248],"tbody",{},[179,192,193,197],{},[194,195,196],"td",{},"Docker",[194,198,199],{},"Container를 만들고 실행하는 플랫폼",[179,201,202,205],{},[194,203,204],{},"Dockerfile",[194,206,207],{},"Image 제작 방법",[179,209,210,213],{},[194,211,212],{},"Image",[194,214,215],{},"실행 가능한 패키지",[179,217,218,221],{},[194,219,220],{},"Container",[194,222,223],{},"Image를 실행한 프로세스 환경",[179,225,226,229],{},[194,227,228],{},"Registry",[194,230,231],{},"Image 저장소",[179,233,234,237],{},[194,235,236],{},"Volume",[194,238,239],{},"Container 외부 데이터 저장",[179,241,242,245],{},[194,243,244],{},"Network",[194,246,247],{},"Container 간 통신",[179,249,250,253],{},[194,251,252],{},"Compose",[194,254,255],{},"여러 Container를 한 번에 관리",[10,257,259],{"id":258},"_5-요약","5. 요약",[261,262,263,271,277,283,289,295,301],"ul",{},[264,265,266,270],"li",{},[267,268,269],"strong",{},"Docker:"," 애플리케이션과 실행 환경을 Container 라는 격리된 환경 패키징하고 실행하기 위한 플랫폼",[264,272,273,276],{},[267,274,275],{},"Dockerfile:"," Docker Image를 어떤 환경과 파일, 명령으로 구성할지 선언하는 파일",[264,278,279,282],{},[267,280,281],{},"Image:"," 애플리케이션을 실행하기 위한 필요한 환경과 파일을 포함한 불변 패키지",[264,284,285,288],{},[267,286,287],{},"Container:"," Docker Image를 기반으로 실제 실행되고 있는 격리된 Runtime 환경",[264,290,291,294],{},[267,292,293],{},"Registry:"," Docker Image를 저장하고 배포하기 위한 저장소",[264,296,297,300],{},[267,298,299],{},"Volume:"," Container가 삭제되더라도 유지해야 하는 데이터를 Container 밖에 저장하는 공간",[264,302,303,306],{},[267,304,305],{},"Docker Compose:"," 여러 Docker Container의 실행 환경과 연결 관계를 하나의 설정 파일로 관리하는 도구",[308,309,310],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":24,"searchDepth":120,"depth":120,"links":312},[313,314,315,316,317],{"id":12,"depth":120,"text":13},{"id":63,"depth":120,"text":64},{"id":97,"depth":120,"text":98},{"id":164,"depth":120,"text":165},{"id":258,"depth":120,"text":259},[319,196],"DevOps","2026-08-17 12:10:00 +0900","Docker가 CI\u002FCD와 연결되는 흐름, 이미지 기반 배포와 Immutable Infrastructure 원칙을 정리한다.","md",null,"\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-03-deployment-principles\u002F",{"layout":326},"post",true,"3","\u002Fposts\u002Fci-cd-docker\u002Fdocker\u002F2026-08-17-docker-03-deployment-principles",{"title":5,"description":321},"Docker 기초","posts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-03-deployment-principles",[196,334,335,336],"CI\u002FCD","Deployment","Immutable Infrastructure","1wFn9ENitpjZdY8W79wiDer96vxN11GIZKFt4imw7uo",1788744787558]