[{"data":1,"prerenderedAt":1317},["ShallowReactive",2],{"post-document:\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-09-container-networking\u002F":3},{"id":4,"title":5,"body":6,"categories":1298,"date":1301,"description":1302,"extension":1303,"image":1304,"key_concepts":1304,"last_modified_at":1304,"legacyPath":1305,"meta":1306,"navigation":316,"part":1308,"path":1309,"published":316,"robots":1304,"seo":1310,"series":1311,"stem":1312,"strengths":1304,"summary":1304,"tags":1313,"tradeoffs":1304,"__hash__":1316},"posts\u002Fposts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-09-container-networking.md","Docker 기초 9편: Docker 및 Kubernetes 네트워크",{"type":7,"value":8,"toc":1276},"minimark",[9,14,19,119,126,130,190,193,216,220,286,289,364,375,378,396,403,407,428,439,473,476,505,519,530,534,537,566,583,587,590,618,730,733,741,744,747,751,754,834,839,843,872,875,879,913,937,947,951,1022,1025,1029,1038,1044,1047,1053,1055,1059,1063,1189,1193,1262,1266,1272],[10,11,13],"h2",{"id":12},"_1-docker-네트워크","1. Docker 네트워크",[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,75,86,97,108],"tbody",{},[26,42,43,47,50],{},[44,45,46],"td",{},"Network Namespace",[44,48,49],{},"컨테이너만의 네트워크 장치, IP, 라우팅 공간",[44,51,52],{},"세대별로 분리된 집안 배선",[26,54,55,58,61],{},[44,56,57],{},"veth pair",[44,59,60],{},"두 끝이 서로 연결된 가상 네트워크 인터페이스 쌍",[44,62,63],{},"벽 양쪽을 잇는 랜 케이블",[26,65,66,69,72],{},[44,67,68],{},"Linux Bridge",[44,70,71],{},"여러 인터페이스를 연결해 프레임을 전달하는 가상 스위치",[44,73,74],{},"멀티탭 또는 네트워크 스위치",[26,76,77,80,83],{},[44,78,79],{},"NAT",[44,81,82],{},"패킷의 IP 주소를 변환",[44,84,85],{},"우편물의 주소를 바꿔 적기",[26,87,88,91,94],{},[44,89,90],{},"NAPT",[44,92,93],{},"IP와 포트를 함께 변환",[44,95,96],{},"대표 전화번호와 내선번호 사용",[26,98,99,102,105],{},[44,100,101],{},"Port Publishing",[44,103,104],{},"호스트 포트를 컨테이너 포트에 연결",[44,106,107],{},"건물 대표번호를 특정 내선에 연결",[26,109,110,113,116],{},[44,111,112],{},"Netfilter",[44,114,115],{},"커널에서 패킷을 검사,변환,차단하는 체계",[44,117,118],{},"도로의 검문소와 방향 안내판",[120,121,122],"blockquote",{},[123,124,125],"p",{},"쉬운 비유: Bridge 네트워크는 가상 공유기에 여러 컨테이너를 연결한 모습입니다. 컨테이너는 내부 주소를 쓰고, 외부로 나갈 때 호스트가 주소를 바꿉니다.",[15,127,129],{"id":128},"_11-bridge-네트워크-구조","1.1 Bridge 네트워크 구조",[131,132,137],"pre",{"className":133,"code":134,"language":135,"meta":136,"style":136},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n    APP[\"Container App\"] --> E0[\"container eth0\"]\n    E0 --> V1[\"veth pair\"]\n    V1 --> BR[\"docker0 또는\u003Cbr\u002F>사용자 정의 bridge\"]\n    BR --> IP[\"Host IP stack\"]\n    IP --> NAT[\"Netfilter\u003Cbr\u002F>NAT,필터링\"]\n    NAT --> NIC[\"Physical NIC\"]\n    NIC --> INTERNET[\"Internet\"]\n","mermaid","",[138,139,140,148,154,160,166,172,178,184],"code",{"__ignoreMap":136},[141,142,145],"span",{"class":143,"line":144},"line",1,[141,146,147],{},"flowchart LR\n",[141,149,151],{"class":143,"line":150},2,[141,152,153],{},"    APP[\"Container App\"] --> E0[\"container eth0\"]\n",[141,155,157],{"class":143,"line":156},3,[141,158,159],{},"    E0 --> V1[\"veth pair\"]\n",[141,161,163],{"class":143,"line":162},4,[141,164,165],{},"    V1 --> BR[\"docker0 또는\u003Cbr\u002F>사용자 정의 bridge\"]\n",[141,167,169],{"class":143,"line":168},5,[141,170,171],{},"    BR --> IP[\"Host IP stack\"]\n",[141,173,175],{"class":143,"line":174},6,[141,176,177],{},"    IP --> NAT[\"Netfilter\u003Cbr\u002F>NAT,필터링\"]\n",[141,179,181],{"class":143,"line":180},7,[141,182,183],{},"    NAT --> NIC[\"Physical NIC\"]\n",[141,185,187],{"class":143,"line":186},8,[141,188,189],{},"    NIC --> INTERNET[\"Internet\"]\n",[123,191,192],{},"Bridge 네트워크의 특징은 다음과 같습니다.",[194,195,196,200,207,210,213],"ul",{},[197,198,199],"li",{},"컨테이너마다 별도의 Network Namespace와 내부 IP를 사용합니다.",[197,201,202,203,206],{},"컨테이너의 ",[138,204,205],{},"eth0","와 호스트의 Bridge를 veth pair로 연결합니다.",[197,208,209],{},"같은 Bridge에 있는 컨테이너끼리는 내부 네트워크로 통신합니다.",[197,211,212],{},"외부로 나갈 때는 보통 SNAT\u002FMASQUERADE가 적용됩니다.",[197,214,215],{},"외부에서 들어오려면 일반적으로 포트를 게시합니다.",[15,217,219],{"id":218},"_12-기본-bridge-사용자-정의-bridge-host-비교","1.2 기본 Bridge, 사용자 정의 Bridge, Host 비교",[20,221,222,239],{},[23,223,224],{},[26,225,226,229,233,236],{},[29,227,228],{},"유형",[29,230,232],{"align":231},"right","네트워크 격리",[29,234,235],{"align":231},"이름 기반 DNS",[29,237,238],{},"일반적인 용도",[39,240,241,258,270],{},[26,242,243,249,252,255],{},[44,244,245,246],{},"기본 ",[138,247,248],{},"bridge",[44,250,251],{"align":231},"O",[44,253,254],{"align":231},"제한적",[44,256,257],{},"간단한 단일 컨테이너 테스트",[26,259,260,263,265,267],{},[44,261,262],{},"사용자 정의 Bridge",[44,264,251],{"align":231},[44,266,251],{"align":231},[44,268,269],{},"같은 애플리케이션의 컨테이너 그룹",[26,271,272,277,280,283],{},[44,273,274],{},[138,275,276],{},"host",[44,278,279],{"align":231},"X",[44,281,282],{"align":231},"해당 없음",[44,284,285],{},"네트워크 격리보다 낮은 오버헤드가 중요한 경우",[123,287,288],{},"사용자 정의 Bridge를 만드는 예.",[131,290,294],{"className":291,"code":292,"language":293,"meta":136,"style":136},"language-bash shiki shiki-themes github-light github-dark","docker network create my-bridge\n\ndocker run -d --name web --network my-bridge nginx\ndocker run -d --name api --network my-bridge my-api\n","bash",[138,295,296,312,318,344],{"__ignoreMap":136},[141,297,298,302,306,309],{"class":143,"line":144},[141,299,301],{"class":300},"sScJk","docker",[141,303,305],{"class":304},"sZZnC"," network",[141,307,308],{"class":304}," create",[141,310,311],{"class":304}," my-bridge\n",[141,313,314],{"class":143,"line":150},[141,315,317],{"emptyLinePlaceholder":316},true,"\n",[141,319,320,322,325,329,332,335,338,341],{"class":143,"line":156},[141,321,301],{"class":300},[141,323,324],{"class":304}," run",[141,326,328],{"class":327},"sj4cs"," -d",[141,330,331],{"class":327}," --name",[141,333,334],{"class":304}," web",[141,336,337],{"class":327}," --network",[141,339,340],{"class":304}," my-bridge",[141,342,343],{"class":304}," nginx\n",[141,345,346,348,350,352,354,357,359,361],{"class":143,"line":162},[141,347,301],{"class":300},[141,349,324],{"class":304},[141,351,328],{"class":327},[141,353,331],{"class":327},[141,355,356],{"class":304}," api",[141,358,337],{"class":327},[141,360,340],{"class":304},[141,362,363],{"class":304}," my-api\n",[123,365,366,367,370,371,374],{},"같은 사용자 정의 Bridge에 연결된 컨테이너는 Docker의 내장 DNS를 통해 ",[138,368,369],{},"web",", ",[138,372,373],{},"api"," 같은 컨테이너 이름으로 서로를 찾을 수 있습니다.",[123,376,377],{},"Host 네트워크는 다음처럼 사용합니다.",[131,379,381],{"className":291,"code":380,"language":293,"meta":136,"style":136},"docker run --network host nginx\n",[138,382,383],{"__ignoreMap":136},[141,384,385,387,389,391,394],{"class":143,"line":144},[141,386,301],{"class":300},[141,388,324],{"class":304},[141,390,337],{"class":327},[141,392,393],{"class":304}," host",[141,395,343],{"class":304},[123,397,398,399,402],{},"이 모드에서는 컨테이너가 호스트의 Network Namespace를 공유하므로 별도의 컨테이너 IP, veth, Bridge를 사용하지 않습니다. 호스트의 다른 프로세스와 포트가 충돌할 수 있으며, 일반적인 ",[138,400,401],{},"-p"," 포트 게시의 의미도 없어집니다. 동작과 지원 범위는 운영체제 및 Docker 환경에 따라 차이가 있습니다.",[15,404,406],{"id":405},"_13-외부에서-컨테이너로-port-publishing과-dnat","1.3 외부에서 컨테이너로: Port Publishing과 DNAT",[131,408,410],{"className":291,"code":409,"language":293,"meta":136,"style":136},"docker run -d -p 8080:80 nginx\n",[138,411,412],{"__ignoreMap":136},[141,413,414,416,418,420,423,426],{"class":143,"line":144},[141,415,301],{"class":300},[141,417,324],{"class":304},[141,419,328],{"class":327},[141,421,422],{"class":327}," -p",[141,424,425],{"class":304}," 8080:80",[141,427,343],{"class":304},[123,429,430,433,434,438],{},[138,431,432],{},"-p 8080:80","은 ",[435,436,437],"strong",{},"호스트의 8080 포트로 들어온 요청을 컨테이너의 80 포트로 전달","한다는 뜻입니다.",[131,440,442],{"className":133,"code":441,"language":135,"meta":136,"style":136},"flowchart LR\n    C[\"External Client\"] --> H[\"HostIP:8080\"]\n    H -->|\"DNAT\u003Cbr\u002F>목적지 변경\"| R[\"Routing,Forwarding\"]\n    R --> BR[\"Linux Bridge\"]\n    BR --> V[\"veth pair\"]\n    V --> N[\"ContainerIP:80\u003Cbr\u002F>nginx\"]\n",[138,443,444,448,453,458,463,468],{"__ignoreMap":136},[141,445,446],{"class":143,"line":144},[141,447,147],{},[141,449,450],{"class":143,"line":150},[141,451,452],{},"    C[\"External Client\"] --> H[\"HostIP:8080\"]\n",[141,454,455],{"class":143,"line":156},[141,456,457],{},"    H -->|\"DNAT\u003Cbr\u002F>목적지 변경\"| R[\"Routing,Forwarding\"]\n",[141,459,460],{"class":143,"line":162},[141,461,462],{},"    R --> BR[\"Linux Bridge\"]\n",[141,464,465],{"class":143,"line":168},[141,466,467],{},"    BR --> V[\"veth pair\"]\n",[141,469,470],{"class":143,"line":174},[141,471,472],{},"    V --> N[\"ContainerIP:80\u003Cbr\u002F>nginx\"]\n",[123,474,475],{},"패킷 수준의 개념적인 흐름은 다음과 같습니다.",[477,478,479,482,493,496,499],"ol",{},[197,480,481],{},"패킷이 호스트의 물리 NIC로 들어옵니다.",[197,483,484,485,488,489,492],{},"Netfilter 규칙이 목적지를 ",[138,486,487],{},"HostIP:8080","에서 ",[138,490,491],{},"ContainerIP:80","으로 바꿉니다(DNAT).",[197,494,495],{},"커널 라우팅 테이블이 컨테이너 네트워크로 전달할 경로를 고릅니다.",[197,497,498],{},"Bridge가 FDB를 보고 대상 MAC 주소가 연결된 veth 포트를 찾습니다.",[197,500,501,502,504],{},"veth를 통해 컨테이너의 ",[138,503,205],{},"와 Nginx에 도착합니다.",[194,506,507,513],{},[197,508,509,512],{},[435,510,511],{},"Neighbor\u002FARP Table",": 같은 L2 네트워크에서 IP 주소와 MAC 주소의 관계를 저장합니다.",[197,514,515,518],{},[435,516,517],{},"FDB(Forwarding Database)",": Bridge가 MAC 주소와 Bridge 포트(veth)를 연결해 기억합니다.",[123,520,521,522,525,526,529],{},"Docker가 사용하는 실제 방화벽 백엔드는 환경에 따라 ",[138,523,524],{},"iptables"," 또는 ",[138,527,528],{},"nftables"," 기반일 수 있지만, 핵심은 Linux Kernel의 Netfilter 경로에서 주소 변환과 필터링이 이뤄진다는 점입니다.",[15,531,533],{"id":532},"_14-외부로-나가기-snat와-masquerade","1.4 외부로 나가기: SNAT와 MASQUERADE",[123,535,536],{},"컨테이너가 인터넷에 요청을 보내는 흐름입니다.",[131,538,540],{"className":133,"code":539,"language":135,"meta":136,"style":136},"flowchart LR\n    C[\"ContainerIP:5000\"] --> BR[\"Bridge\"]\n    BR --> H[\"Host routing\"]\n    H -->|\"SNAT 또는 MASQUERADE\"| P[\"HostPublicIP:임시포트\"]\n    P --> I[\"Internet\"]\n",[138,541,542,546,551,556,561],{"__ignoreMap":136},[141,543,544],{"class":143,"line":144},[141,545,147],{},[141,547,548],{"class":143,"line":150},[141,549,550],{},"    C[\"ContainerIP:5000\"] --> BR[\"Bridge\"]\n",[141,552,553],{"class":143,"line":156},[141,554,555],{},"    BR --> H[\"Host routing\"]\n",[141,557,558],{"class":143,"line":162},[141,559,560],{},"    H -->|\"SNAT 또는 MASQUERADE\"| P[\"HostPublicIP:임시포트\"]\n",[141,562,563],{"class":143,"line":168},[141,564,565],{},"    P --> I[\"Internet\"]\n",[194,567,568,574,580],{},[197,569,570,573],{},[435,571,572],{},"SNAT","는 패킷의 출발지 주소를 바꿉니다.",[197,575,576,579],{},[435,577,578],{},"MASQUERADE","는 호스트 인터페이스의 현재 주소를 사용하도록 만든 SNAT 방식입니다.",[197,581,582],{},"응답이 돌아오면 연결 추적 정보에 따라 원래 컨테이너의 IP와 포트로 복원됩니다.",[15,584,586],{"id":585},"_15-dhcp-사설-ip-nat-napt-구분","1.5 DHCP, 사설 IP, NAT, NAPT 구분",[123,588,589],{},"Docker 네트워크를 이해하려면 가정용 공유기를 떠올리면 쉽습니다.",[131,591,593],{"className":133,"code":592,"language":135,"meta":136,"style":136},"flowchart LR\n    A[\"노트북\u003Cbr\u002F>192.168.1.42:5000\"] --> R[\"공유기\u003Cbr\u002F>DHCP,Gateway,NAPT\"]\n    B[\"태블릿\u003Cbr\u002F>192.168.1.23:5000\"] --> R\n    R --> P[\"공인 IP\u003Cbr\u002F>203.0.113.57\"]\n    P --> I[\"Internet\"]\n",[138,594,595,599,604,609,614],{"__ignoreMap":136},[141,596,597],{"class":143,"line":144},[141,598,147],{},[141,600,601],{"class":143,"line":150},[141,602,603],{},"    A[\"노트북\u003Cbr\u002F>192.168.1.42:5000\"] --> R[\"공유기\u003Cbr\u002F>DHCP,Gateway,NAPT\"]\n",[141,605,606],{"class":143,"line":156},[141,607,608],{},"    B[\"태블릿\u003Cbr\u002F>192.168.1.23:5000\"] --> R\n",[141,610,611],{"class":143,"line":162},[141,612,613],{},"    R --> P[\"공인 IP\u003Cbr\u002F>203.0.113.57\"]\n",[141,615,616],{"class":143,"line":168},[141,617,565],{},[20,619,620,633],{},[23,621,622],{},[26,623,624,627,630],{},[29,625,626],{},"개념",[29,628,629],{},"역할",[29,631,632],{},"한 줄 암기",[39,634,635,646,657,668,679,690,700,709,720],{},[26,636,637,640,643],{},[44,638,639],{},"DHCP",[44,641,642],{},"IP, 서브넷 마스크, Gateway, DNS 정보를 자동 할당",[44,644,645],{},"IP 나눠주기",[26,647,648,651,654],{},[44,649,650],{},"사설 IP",[44,652,653],{},"내부 네트워크에서 사용하는 주소",[44,655,656],{},"내부용 주소",[26,658,659,662,665],{},[44,660,661],{},"공인 IP",[44,663,664],{},"인터넷에서 라우팅 가능한 주소",[44,666,667],{},"외부용 주소",[26,669,670,673,676],{},[44,671,672],{},"Gateway",[44,674,675],{},"다른 네트워크로 패킷을 내보내는 출구",[44,677,678],{},"외부로 나가는 문",[26,680,681,684,687],{},[44,682,683],{},"DNS",[44,685,686],{},"도메인 이름을 IP 주소로 변환",[44,688,689],{},"이름을 주소로 변환",[26,691,692,694,697],{},[44,693,79],{},[44,695,696],{},"IP 주소를 변환",[44,698,699],{},"주소 바꾸기",[26,701,702,704,706],{},[44,703,90],{},[44,705,93],{},[44,707,708],{},"대표번호와 내선번호",[26,710,711,714,717],{},[44,712,713],{},"DNAT",[44,715,716],{},"목적지 주소,포트를 변환",[44,718,719],{},"들어오는 우편의 수신지 변경",[26,721,722,724,727],{},[44,723,572],{},[44,725,726],{},"출발지 주소,포트를 변환",[44,728,729],{},"나가는 우편의 발신지 변경",[123,731,732],{},"NAPT의 예는 다음과 같습니다.",[131,734,739],{"className":735,"code":737,"language":738,"meta":136},[736],"language-text","192.168.1.42:5000  → 203.0.113.57:2001\n192.168.1.23:5000  → 203.0.113.57:2002\n","text",[138,740,737],{"__ignoreMap":136},[123,742,743],{},"두 기기가 하나의 공인 IP를 공유해도 외부 포트가 다르므로, 공유기는 돌아온 응답을 올바른 내부 기기에 전달할 수 있습니다. 실무에서 단순히 NAT라고 부르는 기능이 실제로는 포트까지 변환하는 NAPT인 경우가 많습니다.",[745,746],"hr",{},[10,748,750],{"id":749},"_2-kubernetes-cni와-calico","2. Kubernetes CNI와 Calico",[15,752,18],{"id":753},"먼저-알아둘-단어-1",[20,755,756,766],{},[23,757,758],{},[26,759,760,762,764],{},[29,761,31],{},[29,763,34],{},[29,765,37],{},[39,767,768,779,790,801,812,823],{},[26,769,770,773,776],{},[44,771,772],{},"CNI",[44,774,775],{},"컨테이너 네트워크를 설정하기 위한 표준 인터페이스",[44,777,778],{},"콘센트의 공통 규격",[26,780,781,784,787],{},[44,782,783],{},"Calico",[44,785,786],{},"CNI 구현과 NetworkPolicy 기능을 제공하는 네트워크 솔루션",[44,788,789],{},"규격에 맞춰 실제 배선을 설치하는 업체",[26,791,792,795,798],{},[44,793,794],{},"Pod CIDR",[44,796,797],{},"Pod에 할당할 IP 주소 범위",[44,799,800],{},"한 동에 배정된 주소 구역",[26,802,803,806,809],{},[44,804,805],{},"BGP",[44,807,808],{},"네트워크 도달 경로를 서로 알리는 라우팅 프로토콜",[44,810,811],{},"목적지로 가는 길을 공유하는 안내 체계",[26,813,814,817,820],{},[44,815,816],{},"NetworkPolicy",[44,818,819],{},"Pod 간 허용할 통신을 선언하는 정책",[44,821,822],{},"건물의 출입 허용 명단",[26,824,825,828,831],{},[44,826,827],{},"CoreDNS",[44,829,830],{},"Kubernetes 내부 이름을 IP로 해석하는 DNS",[44,832,833],{},"사내 전화번호부",[120,835,836],{},[123,837,838],{},"쉬운 비유: CNI는 Kubernetes와 네트워크 플러그인 사이의 계약서이고, Calico는 그 계약에 맞춰 Pod의 랜선과 경로, 보안 규칙을 실제로 구성합니다.",[15,840,842],{"id":841},"_21-pod가-생성될-때","2.1 Pod가 생성될 때",[131,844,846],{"className":133,"code":845,"language":135,"meta":136,"style":136},"flowchart LR\n    K[\"Kubernetes가 Pod 생성\"] --> CNI[\"CNI 플러그인 호출\"]\n    CNI --> IP[\"Pod IP 할당\"]\n    IP --> V[\"veth,route 구성\"]\n    V --> READY[\"Pod 네트워크 준비\"]\n",[138,847,848,852,857,862,867],{"__ignoreMap":136},[141,849,850],{"class":143,"line":144},[141,851,147],{},[141,853,854],{"class":143,"line":150},[141,855,856],{},"    K[\"Kubernetes가 Pod 생성\"] --> CNI[\"CNI 플러그인 호출\"]\n",[141,858,859],{"class":143,"line":156},[141,860,861],{},"    CNI --> IP[\"Pod IP 할당\"]\n",[141,863,864],{"class":143,"line":162},[141,865,866],{},"    IP --> V[\"veth,route 구성\"]\n",[141,868,869],{"class":143,"line":168},[141,870,871],{},"    V --> READY[\"Pod 네트워크 준비\"]\n",[123,873,874],{},"Calico는 CNI를 통해 Pod 인터페이스와 경로를 구성하며, NetworkPolicy를 실제 네트워크 규칙으로 적용할 수 있습니다.",[15,876,878],{"id":877},"_22-같은-노드와-다른-노드의-통신","2.2 같은 노드와 다른 노드의 통신",[131,880,882],{"className":133,"code":881,"language":135,"meta":136,"style":136},"flowchart LR\n    PA[\"Pod A\"] --> VA[\"veth\"]\n    VA --> RA[\"Node A routing\"]\n    RA -->|\"직접 라우팅,IP-in-IP,VXLAN 등\"| RB[\"Node B routing\"]\n    RB --> VB[\"veth\"]\n    VB --> PB[\"Pod B\"]\n",[138,883,884,888,893,898,903,908],{"__ignoreMap":136},[141,885,886],{"class":143,"line":144},[141,887,147],{},[141,889,890],{"class":143,"line":150},[141,891,892],{},"    PA[\"Pod A\"] --> VA[\"veth\"]\n",[141,894,895],{"class":143,"line":156},[141,896,897],{},"    VA --> RA[\"Node A routing\"]\n",[141,899,900],{"class":143,"line":162},[141,901,902],{},"    RA -->|\"직접 라우팅,IP-in-IP,VXLAN 등\"| RB[\"Node B routing\"]\n",[141,904,905],{"class":143,"line":168},[141,906,907],{},"    RB --> VB[\"veth\"]\n",[141,909,910],{"class":143,"line":174},[141,911,912],{},"    VB --> PB[\"Pod B\"]\n",[194,914,915,921,927,932],{},[197,916,917,920],{},[435,918,919],{},"같은 노드",": 보통 veth와 노드의 라우팅 경로를 통해 다른 Pod로 전달됩니다.",[197,922,923,926],{},[435,924,925],{},"다른 노드",": 환경 설정에 따라 직접 라우팅, IP-in-IP, VXLAN 등의 방식으로 전달됩니다.",[197,928,929,931],{},[435,930,805],{},": 어떤 Pod CIDR이 어느 노드 또는 라우터 뒤에 있는지 경로를 교환하는 데 사용할 수 있습니다.",[197,933,934,936],{},[435,935,816],{},": 출발지와 목적지 Pod, Namespace, 포트를 기준으로 통신을 허용하거나 차단합니다.",[123,938,939,940,943,944,946],{},"Calico가 항상 ",[138,941,942],{},"tunl0","를 사용하는 것은 아닙니다. IP-in-IP 모드에서는 ",[138,945,942],{},"가 보일 수 있지만, VXLAN이나 비캡슐화 라우팅 모드에서는 구조가 달라집니다.",[15,948,950],{"id":949},"_23-docker-bridge와-calico-비교","2.3 Docker Bridge와 Calico 비교",[20,952,953,966],{},[23,954,955],{},[26,956,957,960,963],{},[29,958,959],{},"항목",[29,961,962],{},"Docker 사용자 정의 Bridge",[29,964,965],{},"Kubernetes + Calico",[39,967,968,979,990,1001,1011],{},[26,969,970,973,976],{},[44,971,972],{},"주요 대상",[44,974,975],{},"Docker 컨테이너",[44,977,978],{},"Kubernetes Pod",[26,980,981,984,987],{},[44,982,983],{},"기본 범위",[44,985,986],{},"단일 Docker 호스트 중심",[44,988,989],{},"여러 Kubernetes 노드",[26,991,992,995,998],{},[44,993,994],{},"네트워크 설정 주체",[44,996,997],{},"Docker Engine",[44,999,1000],{},"Kubernetes가 CNI를 호출",[26,1002,1003,1006,1009],{},[44,1004,1005],{},"이름 해석",[44,1007,1008],{},"Docker 내장 DNS",[44,1010,827],{},[26,1012,1013,1016,1019],{},[44,1014,1015],{},"통신 정책",[44,1017,1018],{},"Docker 네트워크 단위 격리 중심",[44,1020,1021],{},"Kubernetes NetworkPolicy 지원",[123,1023,1024],{},"Docker도 Swarm Overlay처럼 멀티 호스트 네트워크 기능이 있지만, 여기서의 비교는 일반적인 단일 호스트 Bridge 네트워크를 기준으로 합니다.",[15,1026,1028],{"id":1027},"_24-cidr-읽는-법","2.4 CIDR 읽는 법",[123,1030,1031,488,1034,1037],{},[138,1032,1033],{},"192.168.0.0\u002F24",[138,1035,1036],{},"\u002F24","는 앞의 24비트가 네트워크 영역이라는 뜻입니다.",[131,1039,1042],{"className":1040,"code":1041,"language":738,"meta":136},[736],"192.168.0.0\u002F24\n└─ 전체 주소 수: 2^(32-24) = 256개\n└─ 주소 범위: 192.168.0.0 ~ 192.168.0.255\n",[138,1043,1041],{"__ignoreMap":136},[123,1045,1046],{},"일반적인 IPv4 서브넷에서는 네트워크 주소와 브로드캐스트 주소를 제외해 호스트에 254개를 할당할 수 있습니다. 다만 클라우드나 CNI는 일부 주소를 추가 예약할 수 있으므로 실제 사용 가능 수는 구현에 따라 달라질 수 있습니다.",[131,1048,1051],{"className":1049,"code":1050,"language":738,"meta":136},[736],"Prefix 숫자가 커질수록 → 주소 범위가 작아짐\nPrefix 숫자가 작아질수록 → 주소 범위가 커짐\n",[138,1052,1050],{"__ignoreMap":136},[745,1054],{},[10,1056,1058],{"id":1057},"_3-전체-요약","3. 전체 요약",[15,1060,1062],{"id":1061},"구성-요소-한눈에-보기","구성 요소 한눈에 보기",[20,1064,1065,1078],{},[23,1066,1067],{},[26,1068,1069,1072,1075],{},[29,1070,1071],{},"영역",[29,1073,1074],{},"핵심 질문",[29,1076,1077],{},"담당 기술",[39,1079,1080,1091,1102,1123,1134,1145,1156,1167,1178],{},[26,1081,1082,1085,1088],{},[44,1083,1084],{},"이미지",[44,1086,1087],{},"실행 환경을 어떻게 배포하는가?",[44,1089,1090],{},"Image, Layer, Manifest, Config",[26,1092,1093,1096,1099],{},[44,1094,1095],{},"파일 시스템",[44,1097,1098],{},"원본을 유지하며 어떻게 수정하는가?",[44,1100,1101],{},"OverlayFS, Copy-on-Write, Volume",[26,1103,1104,1107,1110],{},[44,1105,1106],{},"실행",[44,1108,1109],{},"명령이 어떻게 프로세스가 되는가?",[44,1111,1112,1113,370,1116,1119,1120],{},"Docker Client, ",[138,1114,1115],{},"dockerd",[138,1117,1118],{},"containerd",", Shim, ",[138,1121,1122],{},"runc",[26,1124,1125,1128,1131],{},[44,1126,1127],{},"격리",[44,1129,1130],{},"프로세스에 무엇이 보이는가?",[44,1132,1133],{},"Namespace",[26,1135,1136,1139,1142],{},[44,1137,1138],{},"자원",[44,1140,1141],{},"얼마나 사용할 수 있는가?",[44,1143,1144],{},"cgroups",[26,1146,1147,1150,1153],{},[44,1148,1149],{},"권한",[44,1151,1152],{},"어떤 시스템 동작을 할 수 있는가?",[44,1154,1155],{},"Capabilities",[26,1157,1158,1161,1164],{},[44,1159,1160],{},"접근 통제",[44,1162,1163],{},"어떤 대상에 접근할 수 있는가?",[44,1165,1166],{},"SELinux, AppArmor",[26,1168,1169,1172,1175],{},[44,1170,1171],{},"네트워크",[44,1173,1174],{},"패킷을 어디로 전달하는가?",[44,1176,1177],{},"Bridge, veth, Netfilter, NAT",[26,1179,1180,1183,1186],{},[44,1181,1182],{},"Kubernetes 네트워크",[44,1184,1185],{},"여러 노드의 Pod를 어떻게 연결하는가?",[44,1187,1188],{},"CNI, Calico, Routing, NetworkPolicy",[15,1190,1192],{"id":1191},"최종-연결-다이어그램","최종 연결 다이어그램",[131,1194,1196],{"className":133,"code":1195,"language":135,"meta":136,"style":136},"flowchart TD\n    DF[\"Dockerfile\"] -->|build| IMG[\"Image\u003Cbr\u002F>읽기 전용 Layers + Metadata\"]\n    IMG -->|run| D[\"dockerd\"]\n    D --> CTD[\"containerd\"]\n    CTD --> SHIM[\"containerd-shim\"]\n    SHIM --> R[\"runc\"]\n    R --> P[\"Container Process\"]\n    P --> NS[\"Namespace\"]\n    P --> CG[\"cgroups\"]\n    P --> FS[\"OverlayFS rootfs\"]\n    P --> SEC[\"Capabilities,SELinux\u002FAppArmor\"]\n    P --> NET[\"veth,Bridge,Netfilter\"]\n",[138,1197,1198,1203,1208,1213,1218,1223,1228,1233,1238,1244,1250,1256],{"__ignoreMap":136},[141,1199,1200],{"class":143,"line":144},[141,1201,1202],{},"flowchart TD\n",[141,1204,1205],{"class":143,"line":150},[141,1206,1207],{},"    DF[\"Dockerfile\"] -->|build| IMG[\"Image\u003Cbr\u002F>읽기 전용 Layers + Metadata\"]\n",[141,1209,1210],{"class":143,"line":156},[141,1211,1212],{},"    IMG -->|run| D[\"dockerd\"]\n",[141,1214,1215],{"class":143,"line":162},[141,1216,1217],{},"    D --> CTD[\"containerd\"]\n",[141,1219,1220],{"class":143,"line":168},[141,1221,1222],{},"    CTD --> SHIM[\"containerd-shim\"]\n",[141,1224,1225],{"class":143,"line":174},[141,1226,1227],{},"    SHIM --> R[\"runc\"]\n",[141,1229,1230],{"class":143,"line":180},[141,1231,1232],{},"    R --> P[\"Container Process\"]\n",[141,1234,1235],{"class":143,"line":186},[141,1236,1237],{},"    P --> NS[\"Namespace\"]\n",[141,1239,1241],{"class":143,"line":1240},9,[141,1242,1243],{},"    P --> CG[\"cgroups\"]\n",[141,1245,1247],{"class":143,"line":1246},10,[141,1248,1249],{},"    P --> FS[\"OverlayFS rootfs\"]\n",[141,1251,1253],{"class":143,"line":1252},11,[141,1254,1255],{},"    P --> SEC[\"Capabilities,SELinux\u002FAppArmor\"]\n",[141,1257,1259],{"class":143,"line":1258},12,[141,1260,1261],{},"    P --> NET[\"veth,Bridge,Netfilter\"]\n",[15,1263,1265],{"id":1264},"초압축-암기","초압축 암기",[131,1267,1270],{"className":1268,"code":1269,"language":738,"meta":136},[736],"Image       = 실행 환경을 담은 읽기 전용 설계도\nLayer       = 이미지의 파일 변경분\nContainer   = 격리되고 제한된 Linux 프로세스 그룹\ndockerd     = Docker 전체 관리\ncontainerd  = 이미지와 컨테이너 생명주기 관리\nrunc        = OCI 설정대로 실제 컨테이너 생성\nNamespace   = 무엇이 보이는가\ncgroups     = 얼마나 사용할 수 있는가\nOverlayFS   = 어떤 파일 시스템을 보는가\nCapability  = 어떤 시스템 동작을 할 수 있는가\nSELinux     = 어떤 대상에 접근할 수 있는가\nBridge      = 같은 호스트의 컨테이너 네트워크 연결\nNAT         = 패킷의 주소 변환\nCNI         = Kubernetes 네트워크 설정 표준\nCalico      = Pod 네트워크와 NetworkPolicy 구현\n",[138,1271,1269],{"__ignoreMap":136},[1273,1274,1275],"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 .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 pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":136,"searchDepth":150,"depth":150,"links":1277},[1278,1286,1293],{"id":12,"depth":150,"text":13,"children":1279},[1280,1281,1282,1283,1284,1285],{"id":17,"depth":156,"text":18},{"id":128,"depth":156,"text":129},{"id":218,"depth":156,"text":219},{"id":405,"depth":156,"text":406},{"id":532,"depth":156,"text":533},{"id":585,"depth":156,"text":586},{"id":749,"depth":150,"text":750,"children":1287},[1288,1289,1290,1291,1292],{"id":753,"depth":156,"text":18},{"id":841,"depth":156,"text":842},{"id":877,"depth":156,"text":878},{"id":949,"depth":156,"text":950},{"id":1027,"depth":156,"text":1028},{"id":1057,"depth":150,"text":1058,"children":1294},[1295,1296,1297],{"id":1061,"depth":156,"text":1062},{"id":1191,"depth":156,"text":1192},{"id":1264,"depth":156,"text":1265},[1299,1300],"DevOps","Docker","2026-08-17 12:40:00 +0900","Docker Bridge와 NAT, Port Publishing, Kubernetes CNI와 Calico 네트워크를 정리한다.","md",null,"\u002Fdevops\u002Fdocker\u002F2026\u002F08\u002F17\u002Fdocker-09-container-networking\u002F",{"layout":1307},"post","9","\u002Fposts\u002Fci-cd-docker\u002Fdocker\u002F2026-08-17-docker-09-container-networking",{"title":5,"description":1302},"Docker 기초","posts\u002FCI-CD-Docker\u002FDocker\u002F2026-08-17-docker-09-container-networking",[1300,1314,1315,79,772,783],"Network","Bridge","Wt9oPEtBFoV2RFd4HGcLT-SWRtGkkmcxp0m4UshgFio",1788744787829]