[{"data":1,"prerenderedAt":859},["ShallowReactive",2],{"post-document:\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-04-virtualization-and-image-lifecycle\u002F":3},{"id":4,"title":5,"body":6,"categories":839,"date":842,"description":843,"extension":844,"image":845,"key_concepts":845,"last_modified_at":845,"legacyPath":846,"meta":847,"navigation":522,"part":849,"path":850,"published":522,"robots":845,"seo":851,"series":852,"stem":853,"strengths":845,"summary":845,"tags":854,"tradeoffs":845,"__hash__":858},"posts\u002Fposts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-04-virtualization-and-image-lifecycle.md","Docker 기초 4편: 가상화와 컨테이너 이미지 생명주기",{"type":7,"value":8,"toc":822},"minimark",[9,13,18,21,24,27,31,34,89,94,97,111,122,126,129,143,149,153,156,159,185,189,192,195,209,215,219,290,294,445,449,452,463,474,478,570,576,614,618,621,627,633,702,707,710,714,717,722,726,729,734,818],[10,11,12],"p",{},"앞선 3장에서 Docker에 관해서 간략하게 적어봤다. 이번 장에서부터는\nDocker를 굴러가게 하는 핵심 원리는 무엇인가에 관해서 알아보자.",[14,15,17],"h2",{"id":16},"가상화virtualization","가상화(Virtualization)",[10,19,20],{},"가상화는 물리 하드웨어를 추상화해 소프트웨어로 구현하는 기술이다. 한 대의 컴퓨터를 여러 대의 독립된 컴퓨터처럼 사용할 수 있게 한다.",[10,22,23],{},"애플리케이션 관점의 실행 방식은 그대로 유지하면서, 실제로 사용하는 물리 자원을 논리적으로 분리한다.",[10,25,26],{},"(인텔 맥북을 써봤다면, 그 당시 VMWARE로 윈도우를 맥 OS에서 돌리는 것을 기억해볼 수 있을 듯 하다.)",[14,28,30],{"id":29},"하이퍼바이저hypervisor","하이퍼바이저(Hypervisor)",[10,32,33],{},"하이퍼바이저는 물리 서버 위에서 여러 가상 머신(VM, Virtual Machine)을 생성, 실행, 관리하는 소프트웨어 계층이다. 한 컴퓨터의 자원을 나누어 여러 독립된 컴퓨터처럼 운영할 수 있게 한다.",[35,36,37,49,59,69,79],"ul",{},[38,39,40,44],"li",{},[41,42,43],"strong",{},"CPU, 메모리, 디스크, NIC 등 물리 하드웨어 관리",[35,45,46],{},[38,47,48],{},"CPU(연산 장치), 메모리(작업 공간), 디스크(저장 공간), NIC(네트워크 장치)를 관리.",[38,50,51,54],{},[41,52,53],{},"VM 생성, 삭제, 스냅샷, 마이그레이션 관리",[35,55,56],{},[38,57,58],{},"VM(가상 컴퓨터)을 만들거나 삭제하고, 현재 상태 저장과 다른 서버로의 이동을 관리.",[38,60,61,64],{},[41,62,63],{},"각 VM에 적절한 자원 할당",[35,65,66],{},[38,67,68],{},"VM마다 필요한 CPU, 메모리, 디스크 용량을 나누어 제공.",[38,70,71,74],{},[41,72,73],{},"VM 간 자원 충돌 방지",[35,75,76],{},[38,77,78],{},"여러 VM이 동일한 하드웨어 자원을 동시에 사용하면서 문제가 발생하지 않도록 조정.",[38,80,81,84],{},[41,82,83],{},"VM이 요청하는 하드웨어 명령 중재 및 스케줄링",[35,85,86],{},[38,87,88],{},"여러 VM의 하드웨어 사용 요청 순서와 실행 시간을 조정.",[90,91,93],"h3",{"id":92},"type-1-nativebare-metal-hypervisor","Type 1: Native\u002FBare-metal Hypervisor",[10,95,96],{},"물리 하드웨어에서 직접 실행되는 방식이다.",[35,98,99,102,105,108],{},[38,100,101],{},"VM 전용 서버 구성에 활용",[38,103,104],{},"호스트 OS 오버헤드가 적어 높은 성능과 안정성 제공",[38,106,107],{},"클라우드, IDC, 데이터 센터에서 주로 사용",[38,109,110],{},"예: VMware ESXi, Microsoft Hyper-V, KVM, Xen",[112,113,119],"pre",{"className":114,"code":116,"language":117,"meta":118},[115],"language-text","물리 서버\n└── Type 1 Hypervisor\n    ├── 웹 서버 VM (24시간 가동)\n    ├── DB 서버 VM (24시간 가동)\n    └── 캐시 서버 VM (24시간 가동)\n","text","",[120,121,116],"code",{"__ignoreMap":118},[90,123,125],{"id":124},"type-2-hosted-hypervisor","Type 2: Hosted Hypervisor",[10,127,128],{},"기존 운영체제 위에서 애플리케이션처럼 실행되는 방식이다.",[35,130,131,134,137,140],{},[38,132,133],{},"기존 장비에 가상화 환경을 구성할 때 활용",[38,135,136],{},"호스트 OS 오버헤드 존재",[38,138,139],{},"데스크톱 테스트,개발 환경에 적합",[38,141,142],{},"예: VMware Workstation, Oracle VirtualBox, Parallels Desktop",[112,144,147],{"className":145,"code":146,"language":117,"meta":118},[115],"개발자 맥북\n└── macOS (주 작업 환경)\n    ├── Chrome, Slack, VS Code 사용\n    └── VirtualBox 실행\n        └── Ubuntu VM (테스트용, 필요할 때만 실행)\n",[120,148,146],{"__ignoreMap":118},[14,150,152],{"id":151},"vm-구조의-한계","VM 구조의 한계",[10,154,155],{},"VM은 물리 서버 자원의 동적 할당을 지원하지만, 애플리케이션 설치와 운영 방식은 전통적인 물리 서버 환경과 유사.\n(결국은 각각의 커널에 위에서 따로 돌아가는 것)",[10,157,158],{},"이로 인한 단점은 무엇인가....?",[35,160,161,169,177],{},[38,162,163,164],{},"큰 이미지 크기\n",[35,165,166],{},[38,167,168],{},"게스트 OS와 가상 하드웨어 설정 등을 포함하므로 수 GB에서 수십 GB에 이를 수 있다.",[38,170,171,172],{},"느린 시작 시간\n",[35,173,174],{},[38,175,176],{},"게스트 OS와 미들웨어, 애플리케이션을 단계적으로 실행해야 한다.",[38,178,179,180],{},"VM 간 환경 불일치\n",[35,181,182],{},[38,183,184],{},"애플리케이션 실행에 필요한 패키지와 라이브러리를 VM마다 별도로 구성하므로 환경 차이가 발생할 수 있다.",[14,186,188],{"id":187},"작은-실행-단위-컨테이너","작은 실행 단위: 컨테이너",[10,190,191],{},"그래서 새로 나온 방법인 Docker는 VM과는 다른 실행 방식을 채택하게 된다.",[10,193,194],{},"컨테이너는 호스트의 커널을 공유하고 애플리케이션과 실행에 필요한 파일,라이브러리를 이미지로 묶는다.",[35,196,197,200,203,206],{},[38,198,199],{},"작은 이미지: 게스트 OS 전체가 아닌 애플리케이션 실행 파일과 라이브러리만 포함",[38,201,202],{},"빠른 시작: 별도의 OS 부팅 없이 프로세스 수준으로 실행",[38,204,205],{},"높은 이식성: 애플리케이션과 의존성을 이미지에 함께 포함해 실행 환경을 일관되게 유지",[38,207,208],{},"높은 집적도: VM보다 적은 오버헤드로 더 많은 실행 단위를 배치 가능",[210,211,212],"blockquote",{},[10,213,214],{},"Linux 컨테이너는 Linux 커널을 공유. macOS나 Windows에서 Linux 컨테이너를 실행할 때는 내부적으로 Linux VM을 사용한다.",[14,216,218],{"id":217},"vm과-컨테이너-비교","VM과 컨테이너 비교",[220,221,222,238],"table",{},[223,224,225],"thead",{},[226,227,228,232,235],"tr",{},[229,230,231],"th",{},"비교 항목",[229,233,234],{},"기존 VM의 한계",[229,236,237],{},"컨테이너 도입 후 변화",[239,240,241,257,268,279],"tbody",{},[226,242,243,251,254],{},[244,245,246,247,250],"td",{},"이식성",[248,249],"br",{},"Portability",[244,252,253],{},"환경마다 OS 패키지와 라이브러리 버전이 달라 오류가 발생할 수 있음",[244,255,256],{},"앱과 의존성 라이브러리를 하나의 이미지로 묶어 로컬과 클라우드에서 일관되게 실행",[226,258,259,262,265],{},[244,260,261],{},"이미지 크기",[244,263,264],{},"게스트 OS 전체를 포함해 수 GB~수십 GB에 달함",[244,266,267],{},"OS 커널을 제외하고 앱 구동에 필요한 파일만 담아 일반적으로 더 작음",[226,269,270,273,276],{},[244,271,272],{},"기동 속도",[244,274,275],{},"OS 부팅과 가상 하드웨어 초기화 필요",[244,277,278],{},"프로세스 실행 수준으로 빠르게 기동",[226,280,281,284,287],{},[244,282,283],{},"자원 효율,집적도",[244,285,286],{},"VM마다 OS 구동에 필요한 CPU,메모리 오버헤드 발생",[244,288,289],{},"호스트 커널을 공유하고 필요한 자원만 소비",[90,291,293],{"id":292},"세부-비교","세부 비교",[220,295,296,308],{},[223,297,298],{},[226,299,300,302,305],{},[229,301],{},[229,303,304],{},"가상 서버",[229,306,307],{},"컨테이너",[239,309,310,324,341,352,363,374,391,402,413,424,435],{},[226,311,312,315,318],{},[244,313,314],{},"가상화",[244,316,317],{},"서버 가상화, VM 간 격리",[244,319,320,321,323],{},"호스트 자원 공유",[248,322],{},"네임 스페이스를 통해 앱 간 격리",[226,325,326,329,335],{},[244,327,328],{},"이미지화",[244,330,331,332,334],{},"OS와 가상 디바이스 등도 포함되어",[248,333],{},"사이즈가 큼",[244,336,337,338,340],{},"필요한 앱과 bin\u002Flib만 포함되어",[248,339],{},"사이즈가 매우 작음",[226,342,343,346,349],{},[244,344,345],{},"플랫폼 간 이식성",[244,347,348],{},"일반적으로 동일한 하이퍼바이저 환경 중심",[244,350,351],{},"물리,가상,클라우드 환경 간 이동이 쉬움",[226,353,354,357,360],{},[244,355,356],{},"이기종 OS 사용",[244,358,359],{},"가능",[244,361,362],{},"호스트 커널과 호환되는 OS 계열 필요",[226,364,365,368,371],{},[244,366,367],{},"부팅 시간",[244,369,370],{},"수십 초~수 분",[244,372,373],{},"수 밀리초~수 초",[226,375,376,379,385],{},[244,377,378],{},"개발 환경 구축",[244,380,381,382,384],{},"수작업으로 앱 설치 및 삭제 필요",[248,383],{},"일반적으로 오래 걸림",[244,386,387,388,390],{},"이미지 재사용으로 환경 구축 자동화",[248,389],{},"일반적으로 더 빠름",[226,392,393,396,399],{},[244,394,395],{},"집적도",[244,397,398],{},"상대적으로 낮음",[244,400,401],{},"상대적으로 높음",[226,403,404,407,410],{},[244,405,406],{},"앱 확장성",[244,408,409],{},"Low (수작업 요소 많음)",[244,411,412],{},"High (완전 자동화 가능)",[226,414,415,418,421],{},[244,416,417],{},"OS 비용",[244,419,420],{},"VM별 발생 가능",[244,422,423],{},"주로 호스트 기준",[226,425,426,429,432],{},[244,427,428],{},"베어메탈 대비 성능",[244,430,431],{},"가상화 오버헤드 존재",[244,433,434],{},"상대적으로 오버헤드가 작음",[226,436,437,440,443],{},[244,438,439],{},"자원 할당",[244,441,442],{},"CPU, Memory, GPU, 네트워크, Storage 등",[244,444,442],{},[14,446,448],{"id":447},"컨테이너-관리-도구","컨테이너 관리 도구",[10,450,451],{},"CI\u002FCD 파이프라인에서는 데이터베이스, 백엔드, Python 애플리케이션 등이 어느 환경에서나 동일하게 실행되어야 한다. 이를 위해 다음 도구를 사용.",[35,453,454,457,460],{},[38,455,456],{},"컨테이너 플랫폼",[38,458,459],{},"컨테이너 이미지 빌드 도구",[38,461,462],{},"컨테이너 런타임",[10,464,465,466,469,470,473],{},"Docker를 사용할 때는 환경과 조직 규모에 따른 라이선스 정책을 확인해야 한다. Kubernetes는 Docker Engine 자체가 아니라 ",[120,467,468],{},"containerd",", ",[120,471,472],{},"CRI-O"," 같은 CRI 호환 런타임으로 컨테이너를 실행한다.",[14,475,477],{"id":476},"컨테이너-이미지-라이프사이클","컨테이너 이미지 라이프사이클",[112,479,483],{"className":480,"code":481,"language":482,"meta":118,"style":118},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n    subgraph LOCAL[로컬 Container Engine]\n        D[Dockerfile\u003Cbr\u002F>이미지 생성 명령 정의]\n        I[(Image\u003Cbr\u002F>정적 상태로 저장)]\n        C[Container\u003Cbr\u002F>이미지를 실행한 프로세스]\n\n        D -->|Build| I\n        I -->|Run| C\n    end\n\n    R[(Registry \u002F Hub\u003Cbr\u002F>여러 이미지를 저장하는 원격 저장소)]\n\n    I -->|Push| R\n    R -->|Pull| I\n","mermaid",[120,484,485,493,499,505,511,517,524,530,536,542,547,553,558,564],{"__ignoreMap":118},[486,487,490],"span",{"class":488,"line":489},"line",1,[486,491,492],{},"flowchart LR\n",[486,494,496],{"class":488,"line":495},2,[486,497,498],{},"    subgraph LOCAL[로컬 Container Engine]\n",[486,500,502],{"class":488,"line":501},3,[486,503,504],{},"        D[Dockerfile\u003Cbr\u002F>이미지 생성 명령 정의]\n",[486,506,508],{"class":488,"line":507},4,[486,509,510],{},"        I[(Image\u003Cbr\u002F>정적 상태로 저장)]\n",[486,512,514],{"class":488,"line":513},5,[486,515,516],{},"        C[Container\u003Cbr\u002F>이미지를 실행한 프로세스]\n",[486,518,520],{"class":488,"line":519},6,[486,521,523],{"emptyLinePlaceholder":522},true,"\n",[486,525,527],{"class":488,"line":526},7,[486,528,529],{},"        D -->|Build| I\n",[486,531,533],{"class":488,"line":532},8,[486,534,535],{},"        I -->|Run| C\n",[486,537,539],{"class":488,"line":538},9,[486,540,541],{},"    end\n",[486,543,545],{"class":488,"line":544},10,[486,546,523],{"emptyLinePlaceholder":522},[486,548,550],{"class":488,"line":549},11,[486,551,552],{},"    R[(Registry \u002F Hub\u003Cbr\u002F>여러 이미지를 저장하는 원격 저장소)]\n",[486,554,556],{"class":488,"line":555},12,[486,557,523],{"emptyLinePlaceholder":522},[486,559,561],{"class":488,"line":560},13,[486,562,563],{},"    I -->|Push| R\n",[486,565,567],{"class":488,"line":566},14,[486,568,569],{},"    R -->|Pull| I\n",[112,571,574],{"className":572,"code":573,"language":117,"meta":118},[115],"Dockerfile --Build--> Image --Run--> Container\n                         |\n                         |-- Push --> Registry \u002F Hub\n                         |\u003C-- Pull -- Registry \u002F Hub\n",[120,575,573],{"__ignoreMap":118},[35,577,578,584,590,596,602,608],{},[38,579,580,583],{},[120,581,582],{},"Build",": Dockerfile을 바탕으로 Image 생성",[38,585,586,589],{},[120,587,588],{},"Run",": Image를 실행하여 Container 생성",[38,591,592,595],{},[120,593,594],{},"Push",": 로컬 Image를 Registry \u002F Hub에 업로드",[38,597,598,601],{},[120,599,600],{},"Pull",": Registry \u002F Hub의 Image를 로컬로 다운로드",[38,603,604,607],{},[120,605,606],{},"Image",": 변경되지 않는 정적 파일 묶음",[38,609,610,613],{},[120,611,612],{},"Container",": Image가 실행되어 애플리케이션 프로세스로 동작하는 상태",[90,615,617],{"id":616},"docker-이미지-참조image-reference-구조","Docker 이미지 참조(Image Reference) 구조",[10,619,620],{},"예시를 보면서 이해해보자.",[112,622,625],{"className":623,"code":624,"language":117,"meta":118},[115],"registry.example.com\u002Fteam\u002Fwebserver:1.0\n",[120,626,624],{"__ignoreMap":118},[112,628,631],{"className":629,"code":630,"language":117,"meta":118},[115],"registry.example.com \u002F team\u002Fwebserver : 1.0\n└── Registry Domain   └── Repository    └── TAG\n",[120,632,630],{"__ignoreMap":118},[220,634,635,648],{},[223,636,637],{},[226,638,639,642,645],{},[229,640,641],{},"구분",[229,643,644],{},"예시",[229,646,647],{},"의미",[239,649,650,663,676,689],{},[226,651,652,655,660],{},[244,653,654],{},"Image Name 또는 Image Reference",[244,656,657],{},[120,658,659],{},"registry.example.com\u002Fteam\u002Fwebserver:1.0",[244,661,662],{},"이미지를 구분하는 전체 이름",[226,664,665,668,673],{},[244,666,667],{},"Registry Domain",[244,669,670],{},[120,671,672],{},"registry.example.com",[244,674,675],{},"이미지 저장소 서비스의 주소",[226,677,678,681,686],{},[244,679,680],{},"Repository Name",[244,682,683],{},[120,684,685],{},"team\u002Fwebserver",[244,687,688],{},"Registry 안에서 특정 이미지 계열을 관리하는 저장소 이름",[226,690,691,694,699],{},[244,692,693],{},"TAG",[244,695,696],{},[120,697,698],{},"1.0",[244,700,701],{},"이미지의 버전 또는 구분값",[703,704,706],"h4",{"id":705},"registry","Registry",[10,708,709],{},"여러 이미지를 저장, 제공하는 전체 서비스 또는 서버",[703,711,713],{"id":712},"repository","Repository",[10,715,716],{},"Registry 안에서 특정 이미지 계열을 관리하는 개별 저장소 단위",[210,718,719],{},[10,720,721],{},"다시 한번 말하지만 Registry >> Repository 임을 기억하자.",[14,723,725],{"id":724},"컨테이너-이미지-빌드","컨테이너 이미지 빌드",[10,727,728],{},"Dockerfile은 컨테이너 이미지에 무엇을 포함할지 선언적으로 정의하는 파일이다. Dockerfile의 전용 문법(DSL)으로 기반 이미지, 패키지 설치, 파일 복사, 실행 명령 등을 작성한다.",[210,730,731],{},[10,732,733],{},"이미지 빌드를 위한 설계 사양서 같은 것.",[112,735,739],{"className":736,"code":737,"language":738,"meta":118,"style":118},"language-dockerfile shiki shiki-themes github-light github-dark","# Python 3.10 Alpine 이미지를 기반 이미지로 사용\nFROM python:3.10-alpine\n\n# bash, curl, 컴파일 도구, Linux 헤더, jq 패키지를 이미지에 설치\nRUN apk add --no-cache bash curl gcc musl-dev linux-headers jq\n\n# FastAPI 서버 실행과 시스템 모니터링에 필요한 Python 패키지를 설치\nRUN pip install --no-cache-dir fastapi uvicorn psutil python-multipart prometheus-client\n\n# 현재 디렉터리의 fastserver.py 파일을 이미지 내부로 복사\nCOPY fastserver.py \u002Fapp\u002Ffastserver.py\n\nWORKDIR \u002Fapp\n\n# 컨테이너가 시작될 때 fastserver.py를 Python 3로 실행\nCMD [\"python3\", \"fastserver.py\"]\n","dockerfile",[120,740,741,746,751,755,760,765,769,774,779,783,788,793,797,802,806,812],{"__ignoreMap":118},[486,742,743],{"class":488,"line":489},[486,744,745],{},"# Python 3.10 Alpine 이미지를 기반 이미지로 사용\n",[486,747,748],{"class":488,"line":495},[486,749,750],{},"FROM python:3.10-alpine\n",[486,752,753],{"class":488,"line":501},[486,754,523],{"emptyLinePlaceholder":522},[486,756,757],{"class":488,"line":507},[486,758,759],{},"# bash, curl, 컴파일 도구, Linux 헤더, jq 패키지를 이미지에 설치\n",[486,761,762],{"class":488,"line":513},[486,763,764],{},"RUN apk add --no-cache bash curl gcc musl-dev linux-headers jq\n",[486,766,767],{"class":488,"line":519},[486,768,523],{"emptyLinePlaceholder":522},[486,770,771],{"class":488,"line":526},[486,772,773],{},"# FastAPI 서버 실행과 시스템 모니터링에 필요한 Python 패키지를 설치\n",[486,775,776],{"class":488,"line":532},[486,777,778],{},"RUN pip install --no-cache-dir fastapi uvicorn psutil python-multipart prometheus-client\n",[486,780,781],{"class":488,"line":538},[486,782,523],{"emptyLinePlaceholder":522},[486,784,785],{"class":488,"line":544},[486,786,787],{},"# 현재 디렉터리의 fastserver.py 파일을 이미지 내부로 복사\n",[486,789,790],{"class":488,"line":549},[486,791,792],{},"COPY fastserver.py \u002Fapp\u002Ffastserver.py\n",[486,794,795],{"class":488,"line":555},[486,796,523],{"emptyLinePlaceholder":522},[486,798,799],{"class":488,"line":560},[486,800,801],{},"WORKDIR \u002Fapp\n",[486,803,804],{"class":488,"line":566},[486,805,523],{"emptyLinePlaceholder":522},[486,807,809],{"class":488,"line":808},15,[486,810,811],{},"# 컨테이너가 시작될 때 fastserver.py를 Python 3로 실행\n",[486,813,815],{"class":488,"line":814},16,[486,816,817],{},"CMD [\"python3\", \"fastserver.py\"]\n",[819,820,821],"style",{},"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":118,"searchDepth":495,"depth":495,"links":823},[824,825,829,830,831,834,835,838],{"id":16,"depth":495,"text":17},{"id":29,"depth":495,"text":30,"children":826},[827,828],{"id":92,"depth":501,"text":93},{"id":124,"depth":501,"text":125},{"id":151,"depth":495,"text":152},{"id":187,"depth":495,"text":188},{"id":217,"depth":495,"text":218,"children":832},[833],{"id":292,"depth":501,"text":293},{"id":447,"depth":495,"text":448},{"id":476,"depth":495,"text":477,"children":836},[837],{"id":616,"depth":501,"text":617},{"id":724,"depth":495,"text":725},[840,841],"DevOps","Docker","2026-08-17 12:15:00 +0900","가상화와 하이퍼바이저, VM과 컨테이너의 차이, 컨테이너 이미지 생명주기와 Dockerfile을 정리한다.","md",null,"\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-04-virtualization-and-image-lifecycle\u002F",{"layout":848},"post","4","\u002Fposts\u002Fci-cd-docker\u002Fdocker\u002F2026-08-17-docker-04-virtualization-and-image-lifecycle",{"title":5,"description":843},"Docker 기초","posts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-04-virtualization-and-image-lifecycle",[841,612,855,856,857],"Virtualization","Hypervisor","Dockerfile","vMc1eHSLDj7xDyYVolCncZ_x9a95cTosY0asFpNRG0g",1788744787589]