[{"data":1,"prerenderedAt":1188},["ShallowReactive",2],{"post-document:\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-12-compose-network-and-volume\u002F":3},{"id":4,"title":5,"body":6,"categories":1168,"date":1170,"description":1171,"extension":1172,"image":1173,"key_concepts":1173,"last_modified_at":1173,"legacyPath":1174,"meta":1175,"navigation":413,"part":1177,"path":1178,"published":413,"robots":1173,"seo":1179,"series":1180,"stem":1181,"strengths":1173,"summary":1173,"tags":1182,"tradeoffs":1173,"__hash__":1187},"posts\u002Fposts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-12-compose-network-and-volume.md","Docker 기초 12편: Compose 네트워크와 Volume",{"type":7,"value":8,"toc":1153},"minimark",[9,14,19,113,128,132,167,170,178,196,199,207,259,265,271,274,293,298,339,351,355,531,565,608,611,638,645,649,733,821,847,877,880,884,887,945,950,954,1010,1021,1025,1072,1075,1144,1147,1149],[10,11,13],"h2",{"id":12},"_1-compose-네트워크와-서비스-통신","1. Compose 네트워크와 서비스 통신",[15,16,18],"h3",{"id":17},"먼저-알아둘-단어","먼저 알아둘 단어",[20,21,22,38],"table",{},[23,24,25],"thead",{},[26,27,28,32,35],"tr",{},[29,30,31],"th",{},"단어",[29,33,34],{},"뜻",[29,36,37],{},"쉬운 비유",[39,40,41,53,64,78,91,102],"tbody",{},[26,42,43,47,50],{},[44,45,46],"td",{},"Default Network",[44,48,49],{},"Compose가 자동 생성하는 프로젝트 전용 네트워크",[44,51,52],{},"자동으로 만들어지는 사내망",[26,54,55,58,61],{},[44,56,57],{},"Service Discovery",[44,59,60],{},"서비스 이름을 컨테이너 IP로 찾는 기능",[44,62,63],{},"이름으로 찾는 사내 전화번호부",[26,65,66,72,75],{},[44,67,68],{},[69,70,71],"code",{},"ports",[44,73,74],{},"호스트 포트를 컨테이너 포트에 게시",[44,76,77],{},"외부 대표번호 공개",[26,79,80,85,88],{},[44,81,82],{},[69,83,84],{},"expose",[44,86,87],{},"컨테이너가 사용하는 포트를 문서화",[44,89,90],{},"내부 안내판",[26,92,93,96,99],{},[44,94,95],{},"Internal Network",[44,97,98],{},"외부 연결을 제한한 Docker 네트워크",[44,100,101],{},"외부 출입구가 없는 내부 통로",[26,103,104,107,110],{},[44,105,106],{},"Reverse Proxy",[44,108,109],{},"요청을 받아 적절한 내부 서비스로 전달",[44,111,112],{},"안내 데스크",[114,115,116],"blockquote",{},[117,118,119,120,123,124,127],"p",{},"쉬운 비유: Compose 네트워크 안에서 ",[69,121,122],{},"backend","와 ",[69,125,126],{},"db","는 사람 이름과 같다. IP라는 좌석 번호가 바뀌어도 이름으로 상대를 찾을 수 있다.",[15,129,131],{"id":130},"_11-서비스-이름으로-통신하기","1.1 서비스 이름으로 통신하기",[133,134,139],"pre",{"className":135,"code":136,"language":137,"meta":138,"style":138},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n    USER[\"Browser\"] -->|\"localhost:8080\"| FE[\"frontend\u003Cbr\u002F>Nginx\"]\n    FE -->|\"http:\u002F\u002Fbackend:8080\"| BE[\"backend\"]\n    BE -->|\"db:5432\"| DB[\"PostgreSQL\"]\n","mermaid","",[69,140,141,149,155,161],{"__ignoreMap":138},[142,143,146],"span",{"class":144,"line":145},"line",1,[142,147,148],{},"flowchart LR\n",[142,150,152],{"class":144,"line":151},2,[142,153,154],{},"    USER[\"Browser\"] -->|\"localhost:8080\"| FE[\"frontend\u003Cbr\u002F>Nginx\"]\n",[142,156,158],{"class":144,"line":157},3,[142,159,160],{},"    FE -->|\"http:\u002F\u002Fbackend:8080\"| BE[\"backend\"]\n",[142,162,164],{"class":144,"line":163},4,[142,165,166],{},"    BE -->|\"db:5432\"| DB[\"PostgreSQL\"]\n",[117,168,169],{},"같은 Compose 네트워크에 연결된 서비스는 서비스 이름으로 통신.",[133,171,176],{"className":172,"code":174,"language":175,"meta":138},[173],"language-text","Frontend → http:\u002F\u002Fbackend:8080\nBackend  → postgresql:\u002F\u002Fdb:5432\u002Fapp\n","text",[69,177,174],{"__ignoreMap":138},[117,179,180,181,184,185,189,190,192,193,195],{},"컨테이너 안의 ",[69,182,183],{},"localhost","는 ",[186,187,188],"strong",{},"호스트나 다른 컨테이너가 아니라 그 컨테이너 자신","을 가리킨다. 다른 서비스에는 ",[69,191,122],{},", ",[69,194,126],{}," 같은 서비스 이름으로 접근해야 한다.",[117,197,198],{},"컨테이너 IP로도 통신할 수 있지만 재생성 시 IP가 바뀔 수 있으므로 서비스 이름을 사용하는 것이 안전하다. 연결이 이미 열려 있던 상태에서 컨테이너가 교체되면 애플리케이션은 DNS 재조회와 재연결을 수행할 수 있어야 한다.",[15,200,202,203,123,205],{"id":201},"_12-ports와-expose","1.2 ",[69,204,71],{},[69,206,84],{},[133,208,212],{"className":209,"code":210,"language":211,"meta":138,"style":138},"language-yaml shiki shiki-themes github-light github-dark","services:\n  frontend:\n    image: nginx:alpine\n    ports:\n      - \"8080:80\"\n","yaml",[69,213,214,224,231,243,250],{"__ignoreMap":138},[142,215,216,220],{"class":144,"line":145},[142,217,219],{"class":218},"s9eBZ","services",[142,221,223],{"class":222},"sVt8B",":\n",[142,225,226,229],{"class":144,"line":151},[142,227,228],{"class":218},"  frontend",[142,230,223],{"class":222},[142,232,233,236,239],{"class":144,"line":157},[142,234,235],{"class":218},"    image",[142,237,238],{"class":222},": ",[142,240,242],{"class":241},"sZZnC","nginx:alpine\n",[142,244,245,248],{"class":144,"line":163},[142,246,247],{"class":218},"    ports",[142,249,223],{"class":222},[142,251,253,256],{"class":144,"line":252},5,[142,254,255],{"class":222},"      - ",[142,257,258],{"class":241},"\"8080:80\"\n",[117,260,261,264],{},[69,262,263],{},"8080:80","은 호스트의 모든 인터페이스에서 8080 포트를 열어 컨테이너의 80 포트로 전달할 수 있다.",[133,266,269],{"className":267,"code":268,"language":175,"meta":138},[173],"외부 또는 호스트 → HostIP:8080 → frontend:80\n",[69,270,268],{"__ignoreMap":138},[117,272,273],{},"로컬 호스트에서만 접근하게 하려면 바인딩 주소를 제한한다.",[133,275,277],{"className":209,"code":276,"language":211,"meta":138,"style":138},"ports:\n  - \"127.0.0.1:8080:80\"\n",[69,278,279,285],{"__ignoreMap":138},[142,280,281,283],{"class":144,"line":145},[142,282,71],{"class":218},[142,284,223],{"class":222},[142,286,287,290],{"class":144,"line":151},[142,288,289],{"class":222},"  - ",[142,291,292],{"class":241},"\"127.0.0.1:8080:80\"\n",[117,294,295,297],{},[69,296,84],{},"는 호스트에 포트를 공개하지 않는다.",[133,299,301],{"className":209,"code":300,"language":211,"meta":138,"style":138},"services:\n  backend:\n    image: my-backend:1.0\n    expose:\n      - \"8080\"\n",[69,302,303,309,316,325,332],{"__ignoreMap":138},[142,304,305,307],{"class":144,"line":145},[142,306,219],{"class":218},[142,308,223],{"class":222},[142,310,311,314],{"class":144,"line":151},[142,312,313],{"class":218},"  backend",[142,315,223],{"class":222},[142,317,318,320,322],{"class":144,"line":157},[142,319,235],{"class":218},[142,321,238],{"class":222},[142,323,324],{"class":241},"my-backend:1.0\n",[142,326,327,330],{"class":144,"line":163},[142,328,329],{"class":218},"    expose",[142,331,223],{"class":222},[142,333,334,336],{"class":144,"line":252},[142,335,255],{"class":222},[142,337,338],{"class":241},"\"8080\"\n",[117,340,341,343,344,347,348,350],{},[69,342,84],{},"는 내부 사용 포트를 문서화하는 성격이 강하다. 같은 네트워크의 컨테이너 간 접근을 방화벽처럼 허용하거나 차단하지는 않는다. 애플리케이션이 ",[69,345,346],{},"0.0.0.0:8080","에서 듣고 있고 네트워크가 연결되어 있다면 ",[69,349,84],{},"가 없어도 다른 컨테이너가 접근할 수 있습니다.",[15,352,354],{"id":353},"_13-publicprivate-네트워크-분리","1.3 Public,Private 네트워크 분리",[133,356,358],{"className":209,"code":357,"language":211,"meta":138,"style":138},"services:\n  frontend:\n    image: nginx:alpine\n    ports:\n      - \"8080:80\"\n    networks:\n      - public\n\n  backend:\n    image: my-backend:1.0\n    networks:\n      - public\n      - private\n\n  db:\n    image: postgres:15\n    networks:\n      - private\n\nnetworks:\n  public:\n  private:\n    internal: true\n",[69,359,360,366,372,380,386,392,400,408,415,422,431,438,445,453,458,466,476,483,490,495,503,511,519],{"__ignoreMap":138},[142,361,362,364],{"class":144,"line":145},[142,363,219],{"class":218},[142,365,223],{"class":222},[142,367,368,370],{"class":144,"line":151},[142,369,228],{"class":218},[142,371,223],{"class":222},[142,373,374,376,378],{"class":144,"line":157},[142,375,235],{"class":218},[142,377,238],{"class":222},[142,379,242],{"class":241},[142,381,382,384],{"class":144,"line":163},[142,383,247],{"class":218},[142,385,223],{"class":222},[142,387,388,390],{"class":144,"line":252},[142,389,255],{"class":222},[142,391,258],{"class":241},[142,393,395,398],{"class":144,"line":394},6,[142,396,397],{"class":218},"    networks",[142,399,223],{"class":222},[142,401,403,405],{"class":144,"line":402},7,[142,404,255],{"class":222},[142,406,407],{"class":241},"public\n",[142,409,411],{"class":144,"line":410},8,[142,412,414],{"emptyLinePlaceholder":413},true,"\n",[142,416,418,420],{"class":144,"line":417},9,[142,419,313],{"class":218},[142,421,223],{"class":222},[142,423,425,427,429],{"class":144,"line":424},10,[142,426,235],{"class":218},[142,428,238],{"class":222},[142,430,324],{"class":241},[142,432,434,436],{"class":144,"line":433},11,[142,435,397],{"class":218},[142,437,223],{"class":222},[142,439,441,443],{"class":144,"line":440},12,[142,442,255],{"class":222},[142,444,407],{"class":241},[142,446,448,450],{"class":144,"line":447},13,[142,449,255],{"class":222},[142,451,452],{"class":241},"private\n",[142,454,456],{"class":144,"line":455},14,[142,457,414],{"emptyLinePlaceholder":413},[142,459,461,464],{"class":144,"line":460},15,[142,462,463],{"class":218},"  db",[142,465,223],{"class":222},[142,467,469,471,473],{"class":144,"line":468},16,[142,470,235],{"class":218},[142,472,238],{"class":222},[142,474,475],{"class":241},"postgres:15\n",[142,477,479,481],{"class":144,"line":478},17,[142,480,397],{"class":218},[142,482,223],{"class":222},[142,484,486,488],{"class":144,"line":485},18,[142,487,255],{"class":222},[142,489,452],{"class":241},[142,491,493],{"class":144,"line":492},19,[142,494,414],{"emptyLinePlaceholder":413},[142,496,498,501],{"class":144,"line":497},20,[142,499,500],{"class":218},"networks",[142,502,223],{"class":222},[142,504,506,509],{"class":144,"line":505},21,[142,507,508],{"class":218},"  public",[142,510,223],{"class":222},[142,512,514,517],{"class":144,"line":513},22,[142,515,516],{"class":218},"  private",[142,518,223],{"class":222},[142,520,522,525,527],{"class":144,"line":521},23,[142,523,524],{"class":218},"    internal",[142,526,238],{"class":222},[142,528,530],{"class":529},"sj4cs","true\n",[133,532,534],{"className":135,"code":533,"language":137,"meta":138,"style":138},"flowchart LR\n    U[\"외부 사용자\"] -->|\"Host:8080\"| F[\"frontend\"]\n    F \u003C--> PUB[\"public network\"]\n    PUB \u003C--> B[\"backend\"]\n    B \u003C--> PRI[\"private network\u003Cbr\u002F>internal\"]\n    PRI \u003C--> DB[\"database\"]\n",[69,535,536,540,545,550,555,560],{"__ignoreMap":138},[142,537,538],{"class":144,"line":145},[142,539,148],{},[142,541,542],{"class":144,"line":151},[142,543,544],{},"    U[\"외부 사용자\"] -->|\"Host:8080\"| F[\"frontend\"]\n",[142,546,547],{"class":144,"line":157},[142,548,549],{},"    F \u003C--> PUB[\"public network\"]\n",[142,551,552],{"class":144,"line":163},[142,553,554],{},"    PUB \u003C--> B[\"backend\"]\n",[142,556,557],{"class":144,"line":252},[142,558,559],{},"    B \u003C--> PRI[\"private network\u003Cbr\u002F>internal\"]\n",[142,561,562],{"class":144,"line":394},[142,563,564],{},"    PRI \u003C--> DB[\"database\"]\n",[566,567,568,576,586,595,602],"ul",{},[569,570,571,572,575],"li",{},"외부에는 ",[69,573,574],{},"frontend","만 포트가 게시됩니다.",[569,577,578,123,580,184,582,585],{},[69,579,574],{},[69,581,122],{},[69,583,584],{},"public"," 네트워크에서 통신.",[569,587,588,123,590,184,592,585],{},[69,589,122],{},[69,591,126],{},[69,593,594],{},"private",[569,596,597,123,599,601],{},[69,598,574],{},[69,600,126],{},"는 공통 네트워크가 없어 직접 통신할 수 없다.",[569,603,604,607],{},[69,605,606],{},"internal: true","는 해당 네트워크에 외부 연결성을 제공하지 않도록 구성.",[117,609,610],{},"이미 만들어진 Docker 네트워크를 사용하려면 외부 네트워크로 선언.",[133,612,614],{"className":209,"code":613,"language":211,"meta":138,"style":138},"networks:\n  shared-network:\n    external: true\n",[69,615,616,622,629],{"__ignoreMap":138},[142,617,618,620],{"class":144,"line":145},[142,619,500],{"class":218},[142,621,223],{"class":222},[142,623,624,627],{"class":144,"line":151},[142,625,626],{"class":218},"  shared-network",[142,628,223],{"class":222},[142,630,631,634,636],{"class":144,"line":157},[142,632,633],{"class":218},"    external",[142,635,238],{"class":222},[142,637,530],{"class":529},[117,639,640,641,644],{},"외부 네트워크는 Compose가 생성하거나 ",[69,642,643],{},"down","으로 삭제하지 않는다.",[15,646,648],{"id":647},"_14-nginx-reverse-proxy-예제","1.4 Nginx Reverse Proxy 예제",[133,650,654],{"className":651,"code":652,"language":653,"meta":138,"style":138},"language-nginx shiki shiki-themes github-light github-dark","server {\n    listen 80;\n\n    location \u002F {\n        root \u002Fusr\u002Fshare\u002Fnginx\u002Fhtml;\n        index index.html;\n    }\n\n    location \u002Fapi\u002F {\n        proxy_pass http:\u002F\u002Fbackend:8080\u002F;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n","nginx",[69,655,656,661,666,670,675,680,685,690,694,699,704,709,714,719,724,728],{"__ignoreMap":138},[142,657,658],{"class":144,"line":145},[142,659,660],{},"server {\n",[142,662,663],{"class":144,"line":151},[142,664,665],{},"    listen 80;\n",[142,667,668],{"class":144,"line":157},[142,669,414],{"emptyLinePlaceholder":413},[142,671,672],{"class":144,"line":163},[142,673,674],{},"    location \u002F {\n",[142,676,677],{"class":144,"line":252},[142,678,679],{},"        root \u002Fusr\u002Fshare\u002Fnginx\u002Fhtml;\n",[142,681,682],{"class":144,"line":394},[142,683,684],{},"        index index.html;\n",[142,686,687],{"class":144,"line":402},[142,688,689],{},"    }\n",[142,691,692],{"class":144,"line":410},[142,693,414],{"emptyLinePlaceholder":413},[142,695,696],{"class":144,"line":417},[142,697,698],{},"    location \u002Fapi\u002F {\n",[142,700,701],{"class":144,"line":424},[142,702,703],{},"        proxy_pass http:\u002F\u002Fbackend:8080\u002F;\n",[142,705,706],{"class":144,"line":433},[142,707,708],{},"        proxy_set_header Host $host;\n",[142,710,711],{"class":144,"line":440},[142,712,713],{},"        proxy_set_header X-Real-IP $remote_addr;\n",[142,715,716],{"class":144,"line":447},[142,717,718],{},"        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[142,720,721],{"class":144,"line":455},[142,722,723],{},"        proxy_set_header X-Forwarded-Proto $scheme;\n",[142,725,726],{"class":144,"line":460},[142,727,689],{},[142,729,730],{"class":144,"line":468},[142,731,732],{},"}\n",[133,734,736],{"className":209,"code":735,"language":211,"meta":138,"style":138},"services:\n  frontend:\n    image: nginx:alpine\n    ports:\n      - \"8080:80\"\n    volumes:\n      - .\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fconf.d\u002Fdefault.conf:ro\n      - .\u002Ffrontend\u002Fdist:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml:ro\n\n  backend:\n    image: my-backend:1.0\n    expose:\n      - \"8080\"\n",[69,737,738,744,750,758,764,770,777,784,791,795,801,809,815],{"__ignoreMap":138},[142,739,740,742],{"class":144,"line":145},[142,741,219],{"class":218},[142,743,223],{"class":222},[142,745,746,748],{"class":144,"line":151},[142,747,228],{"class":218},[142,749,223],{"class":222},[142,751,752,754,756],{"class":144,"line":157},[142,753,235],{"class":218},[142,755,238],{"class":222},[142,757,242],{"class":241},[142,759,760,762],{"class":144,"line":163},[142,761,247],{"class":218},[142,763,223],{"class":222},[142,765,766,768],{"class":144,"line":252},[142,767,255],{"class":222},[142,769,258],{"class":241},[142,771,772,775],{"class":144,"line":394},[142,773,774],{"class":218},"    volumes",[142,776,223],{"class":222},[142,778,779,781],{"class":144,"line":402},[142,780,255],{"class":222},[142,782,783],{"class":241},".\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fconf.d\u002Fdefault.conf:ro\n",[142,785,786,788],{"class":144,"line":410},[142,787,255],{"class":222},[142,789,790],{"class":241},".\u002Ffrontend\u002Fdist:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml:ro\n",[142,792,793],{"class":144,"line":417},[142,794,414],{"emptyLinePlaceholder":413},[142,796,797,799],{"class":144,"line":424},[142,798,313],{"class":218},[142,800,223],{"class":222},[142,802,803,805,807],{"class":144,"line":433},[142,804,235],{"class":218},[142,806,238],{"class":222},[142,808,324],{"class":241},[142,810,811,813],{"class":144,"line":440},[142,812,329],{"class":218},[142,814,223],{"class":222},[142,816,817,819],{"class":144,"line":447},[142,818,255],{"class":222},[142,820,338],{"class":241},[566,822,823,829,835,841],{},[569,824,825,828],{},[69,826,827],{},"$host",": 클라이언트가 요청한 Host 정보를 백엔드에 전달.",[569,830,831,834],{},[69,832,833],{},"$remote_addr",": Nginx에 직접 연결한 클라이언트 주소.",[569,836,837,840],{},[69,838,839],{},"$proxy_add_x_forwarded_for",": 기존 전달 경로를 보존하며 클라이언트 IP를 추가.",[569,842,843,846],{},[69,844,845],{},":ro",": 컨테이너에서 마운트한 호스트 파일을 읽기 전용으로 사용한다.",[117,848,849,850,123,853,856,857,860,861,864,865,868,869,872,873,876],{},"위 ",[69,851,852],{},"location \u002Fapi\u002F",[69,854,855],{},"proxy_pass http:\u002F\u002Fbackend:8080\u002F","는 둘 다 끝에 ",[69,858,859],{},"\u002F","가 있으므로 ",[69,862,863],{},"\u002Fapi\u002Fusers"," 요청이 백엔드의 ",[69,866,867],{},"\u002Fusers","로 전달. ",[69,870,871],{},"\u002Fapi"," 경로를 유지해야 한다면 ",[69,874,875],{},"proxy_pass","의 URI 구성 차이를 확인해야 한다.",[878,879],"hr",{},[10,881,883],{"id":882},"_2-volume과-데이터-영속성","2. Volume과 데이터 영속성",[15,885,18],{"id":886},"먼저-알아둘-단어-1",[20,888,889,899],{},[23,890,891],{},[26,892,893,895,897],{},[29,894,31],{},[29,896,34],{},[29,898,37],{},[39,900,901,912,923,934],{},[26,902,903,906,909],{},[44,904,905],{},"Writable Layer",[44,907,908],{},"컨테이너가 실행 중 변경한 파일을 저장하는 임시 계층",[44,910,911],{},"철거 시 사라지는 임시 보관함",[26,913,914,917,920],{},[44,915,916],{},"Named Volume",[44,918,919],{},"Docker가 관리하고 이름으로 참조하는 저장 공간",[44,921,922],{},"관리사무소가 관리하는 창고",[26,924,925,928,931],{},[44,926,927],{},"Bind Mount",[44,929,930],{},"호스트의 특정 경로를 컨테이너에 직접 연결",[44,932,933],{},"내 방의 서랍을 작업장에 연결",[26,935,936,939,942],{},[44,937,938],{},"Anonymous Volume",[44,940,941],{},"명시적 이름 없이 만들어진 Volume",[44,943,944],{},"번호만 붙은 임시 창고",[114,946,947],{},[117,948,949],{},"쉬운 비유: 컨테이너는 교체 가능한 사무실이고 Volume은 별도 문서 보관실. 사무실을 철거해도 보관실을 없애지 않으면 문서는 남는다.",[15,951,953],{"id":952},"_21-named-volume","2.1 Named Volume",[133,955,957],{"className":209,"code":956,"language":211,"meta":138,"style":138},"services:\n  db:\n    image: postgres:15\n    volumes:\n      - db-data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n\nvolumes:\n  db-data:\n",[69,958,959,965,971,979,985,992,996,1003],{"__ignoreMap":138},[142,960,961,963],{"class":144,"line":145},[142,962,219],{"class":218},[142,964,223],{"class":222},[142,966,967,969],{"class":144,"line":151},[142,968,463],{"class":218},[142,970,223],{"class":222},[142,972,973,975,977],{"class":144,"line":157},[142,974,235],{"class":218},[142,976,238],{"class":222},[142,978,475],{"class":241},[142,980,981,983],{"class":144,"line":163},[142,982,774],{"class":218},[142,984,223],{"class":222},[142,986,987,989],{"class":144,"line":252},[142,988,255],{"class":222},[142,990,991],{"class":241},"db-data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[142,993,994],{"class":144,"line":394},[142,995,414],{"emptyLinePlaceholder":413},[142,997,998,1001],{"class":144,"line":402},[142,999,1000],{"class":218},"volumes",[142,1002,223],{"class":222},[142,1004,1005,1008],{"class":144,"line":410},[142,1006,1007],{"class":218},"  db-data",[142,1009,223],{"class":222},[117,1011,1012,1013,1016,1017,1020],{},"Named Volume은 Docker가 실제 저장 위치를 관리. ",[69,1014,1015],{},"docker compose down","만 실행하면 기본적으로 남고, 다음 ",[69,1018,1019],{},"up","에서 다시 연결.",[15,1022,1024],{"id":1023},"_22-bind-mount","2.2 Bind Mount",[133,1026,1028],{"className":209,"code":1027,"language":211,"meta":138,"style":138},"services:\n  backend:\n    build: .\u002Fbackend\n    volumes:\n      - .\u002Fbackend\u002Fsrc:\u002Fapp\u002Fsrc\n      - .\u002Fbackend\u002Fconfig.yml:\u002Fapp\u002Fconfig.yml:ro\n",[69,1029,1030,1036,1042,1052,1058,1065],{"__ignoreMap":138},[142,1031,1032,1034],{"class":144,"line":145},[142,1033,219],{"class":218},[142,1035,223],{"class":222},[142,1037,1038,1040],{"class":144,"line":151},[142,1039,313],{"class":218},[142,1041,223],{"class":222},[142,1043,1044,1047,1049],{"class":144,"line":157},[142,1045,1046],{"class":218},"    build",[142,1048,238],{"class":222},[142,1050,1051],{"class":241},".\u002Fbackend\n",[142,1053,1054,1056],{"class":144,"line":163},[142,1055,774],{"class":218},[142,1057,223],{"class":222},[142,1059,1060,1062],{"class":144,"line":252},[142,1061,255],{"class":222},[142,1063,1064],{"class":241},".\u002Fbackend\u002Fsrc:\u002Fapp\u002Fsrc\n",[142,1066,1067,1069],{"class":144,"line":394},[142,1068,255],{"class":222},[142,1070,1071],{"class":241},".\u002Fbackend\u002Fconfig.yml:\u002Fapp\u002Fconfig.yml:ro\n",[117,1073,1074],{},"Bind Mount는 소스 코드와 설정 파일을 즉시 반영하는 개발 환경에 편리. 반면 호스트 경로, 권한, 운영체제 차이에 영향을 받기 쉽다.",[20,1076,1077,1088],{},[23,1078,1079],{},[26,1080,1081,1084,1086],{},[29,1082,1083],{},"구분",[29,1085,916],{},[29,1087,927],{},[39,1089,1090,1101,1112,1123,1134],{},[26,1091,1092,1095,1098],{},[44,1093,1094],{},"경로 관리",[44,1096,1097],{},"Docker",[44,1099,1100],{},"사용자",[26,1102,1103,1106,1109],{},[44,1104,1105],{},"호스트 경로 의존성",[44,1107,1108],{},"낮음",[44,1110,1111],{},"높음",[26,1113,1114,1117,1120],{},[44,1115,1116],{},"개발 코드 동기화",[44,1118,1119],{},"보통",[44,1121,1122],{},"편리함",[26,1124,1125,1128,1131],{},[44,1126,1127],{},"DB 영속 데이터",[44,1129,1130],{},"일반적으로 적합",[44,1132,1133],{},"권한,성능 검토 필요",[26,1135,1136,1139,1142],{},[44,1137,1138],{},"설정 파일 한 개 연결",[44,1140,1141],{},"가능",[44,1143,1122],{},[117,1145,1146],{},"Volume은 백업이 아니다. 중요한 데이터는 별도의 백업과 복구 절차가 필요.",[878,1148],{},[1150,1151,1152],"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);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":138,"searchDepth":151,"depth":151,"links":1154},[1155,1163],{"id":12,"depth":151,"text":13,"children":1156},[1157,1158,1159,1161,1162],{"id":17,"depth":157,"text":18},{"id":130,"depth":157,"text":131},{"id":201,"depth":157,"text":1160},"1.2 ports와 expose",{"id":353,"depth":157,"text":354},{"id":647,"depth":157,"text":648},{"id":882,"depth":151,"text":883,"children":1164},[1165,1166,1167],{"id":886,"depth":157,"text":18},{"id":952,"depth":157,"text":953},{"id":1023,"depth":157,"text":1024},[1169,1097],"DevOps","2026-08-17 12:55:00 +0900","Docker Compose 서비스 통신, ports와 expose, 네트워크 분리, Nginx와 Volume을 정리한다.","md",null,"\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-12-compose-network-and-volume\u002F",{"layout":1176},"post","12","\u002Fposts\u002Fci-cd-docker\u002Fdocker\u002F2026-08-17-docker-12-compose-network-and-volume",{"title":5,"description":1171},"Docker 기초","posts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-12-compose-network-and-volume",[1097,1183,1184,1185,1186,927],"Docker Compose","Network","Nginx","Volume","An4DP9EQqZeuwEU0IY5bn3RlNg0Ig3exJfZK-3dD6Cg",1788744787955]