Alert
์ด ๊ธ์ Claude Code์ ๋์์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค
TL;DR
- ์ปจํ ์ด๋๋ ์์ ๋ง์ ๊ฒฉ๋ฆฌ๋ ๋คํธ์ํฌ ์ธ๊ณ์ ์์ด ํธ์คํธ์ NIC๋ฅผ ์ง์ ์ฐ์ง ๋ชปํจ
- bridge ๋คํธ์ํฌ๋ ๋์ปค๊ฐ ํธ์คํธ ์์ ๋ง๋๋ ์ํํธ์จ์ด ์ค์์น, veth pair๋ก ์ปจํ ์ด๋์ ์ฐ๊ฒฐ
- ์์๋ฐ์ด๋๋ ์ถ๋ฐ์ง IP๋ฅผ ํธ์คํธ IP๋ก ๋ฐ๊พธ๋ NAT(masquerade)๋ก ์ธํฐ๋ท์ ๋๊ฐ
- ์ธ๋ฐ์ด๋๋ ๊ธฐ๋ณธ ์ฐจ๋จ,
-p 8080:80๋ก ํฌํธ๋ฅผ ์ด์ด์ผ DNAT ๊ท์น์ด ์๊ฒจ ์ธ๋ถ์์ ๋๋ฌ- ์ปจํ ์ด๋ ์ฑ์
127.0.0.1์ด ์๋๋ผ0.0.0.0์ ๋ฐ์ธ๋ฉํด์ผ ํฌ์๋ฉ๋ ํธ๋ํฝ์ ๋ฐ์
Source
1. ์ ํท๊ฐ๋ฆฌ๋๊ฐ
๋์ปค๋ฅผ ์ฐ๋ค ๋ณด๋ฉด ์์ฃผ ๊ฒช๋ ๋ ๊ฐ์ง ์ํฉ์ด ์๋ค.
- ์ปจํ
์ด๋ ์์์๋
apt update๋ ์ธ๋ถ API ํธ์ถ์ด ์ ๋๋๋ฐ, - ์ ์ ๋ธ๋ผ์ฐ์ ์์
localhost:80์ผ๋ก ์ปจํ ์ด๋์ ์ ์ํ๋ฉด ์๋ฌด ์๋ต์ด ์๋ค.
๋ ๋ค ๊ฐ์ ๋คํธ์ํฌ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ธ๋ค. ํ์ง๋ง ๋์ปค๋ ๋๊ฐ๋ ํธ๋ํฝ(์์๋ฐ์ด๋)๊ณผ ๋ค์ด์ค๋ ํธ๋ํฝ(์ธ๋ฐ์ด๋)์ ์์ ํ ๋ค๋ฅด๊ฒ ๋ค๋ฃฌ๋ค. ์ด ๋๋ง ๋ผ์ด ๋๊ณ ๋ณด๋ฉด ๋์ปค ๋คํธ์ํน ์ง๋ฌธ์ ์ ๋ฐ์ ์ ์ ๋ก ํ๋ฆฐ๋ค.
Docker ๋คํธ์ํฌ๋ ๋๋ผ์ด๋ฒ ์ข ๋ฅ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃฌ๋ค. ์ด ๊ธ์ ๊ทธ ๋์ ํจํท์ด ์ค์ ๋ก ์ด๋ค ๊ธธ์ ๋ฐ๋ผ ํ๋ฅด๋์ง๋ฅผ ํ๊ณ ๋ ๋ค.
2. ๊ธฐ๋ณธ ๊ฐ๋ - ์ปจํ ์ด๋๋ ๊ฒฉ๋ฆฌ๋ ๋คํธ์ํฌ์ ์ฐ๋ค
์ปจํ ์ด๋์ ๋คํธ์ํฌ ์ธ๊ณ
์ปจํ ์ด๋๋ ์๊ธฐ๋ง์ ์์ ๋คํธ์ํฌ ์ธ๊ณ ์์ ๊ฒฉ๋ฆฌ๋ ์ฑ ๋์๊ฐ๋ค. ๊ทธ๋์ ํธ์คํธ ๋จธ์ (์ฌ๊ธฐ์๋ ๋ ธํธ๋ถ)์ ์ค์ ๋คํธ์ํฌ ์นด๋(NIC)๋ฅผ ์ง์ ๊ฑด๋๋ฆฌ์ง ๋ชปํ๋ค. ๊ทธ๋ผ ์ด ๊ฒฉ๋ฆฌ๋ ์ปจํ ์ด๋๋ฅผ ์ด๋ป๊ฒ NIC๊น์ง ์ด์ด ์ค๊น. ์ด๊ฒ ํ์ด์ผ ํ ๋ฌธ์ ๋ค.
์ฉ์ด: ํธ์คํธ ๋จธ์
๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ์์คํ ์ ๋งํ๋ค. ์ด ๊ธ์์๋ ๋ ธํธ๋ถ์ ํธ์คํธ๋ก ๊ฐ์ ํ๋ค. ํธ์คํธ์ NIC๊ฐ ์ธํฐ๋ท๊ณผ์ ์ค์ ์ก์์ ์ ๋ด๋นํ๋ค.
bridge ๋คํธ์ํฌ = ์ํํธ์จ์ด ์ค์์น
๋์ปค๋ ์ปจํ ์ด๋๋ฅผ ๊ธฐ๋ณธ์ผ๋ก bridge ๋คํธ์ํฌ์ ์ฌ๋ฆฐ๋ค. bridge ๋คํธ์ํฌ๋ ๋์ปค๊ฐ ํธ์คํธ ์์ ์ฌ์ฉ ๋ง๋ค์ด ๋๋ ์ํํธ์จ์ด ์ค์์น, ์ฆ ์ค์์น ์ญํ ์ ํ๋ ๊ฐ์ ์ฅ์น๋ค.
- ์๋ก ๋์ฐ๋ ์ปจํ ์ด๋๋ ๋ชจ๋ ์ด ์ค์์น์ ๊ฝํ๋ค.
- ๊ฐ์ ์ค์์น(๊ฐ์ ์ฌ์ค ๋คํธ์ํฌ)์ ์์ผ๋ฏ๋ก ์ปจํ ์ด๋๋ผ๋ฆฌ๋ ๋ด๋ถ IP๋ก ์ง์ ํต์ ํ ์ ์๋ค. ํฌํธ ๊ฒ์๋, ๋ณํ๋ ํ์ ์๋ค.
- bridge ๋คํธ์ํฌ๋ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ์ ์๋ค. ๊ฐ์ bridge์ ์๋ ์ปจํ ์ด๋๋ผ๋ฆฌ๋ ํต์ ๋์ง๋ง, ๋ค๋ฅธ bridge๋ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํต์ ๋์ง ์๋๋ค. ๊ตณ์ด ํต์ ์ํค๋ ค๋ฉด ์ปจํ ์ด๋๋ฅผ ์์ชฝ ๋คํธ์ํฌ์ ๋ชจ๋ ์ฐ๊ฒฐํ๋ฉด ๋๋ค.
veth pair - ๊ฐ์ ๋คํธ์ํฌ ์ผ์ด๋ธ
์ปจํ ์ด๋๋ฅผ ์ค์์น์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ๋์ปค๋ veth pair(๊ฐ์ ์ด๋๋ท ํ์ด)๋ฅผ ๋ง๋ ๋ค. ์ ๋์ด ์๋ ๊ฐ์ ๋์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ํ์ชฝ ๋์ ์ปจํ
์ด๋ ์์ผ๋ก ๋ค์ด๊ฐ๋ค. ์ด ์ฐ๊ฒฐ์ ์ด ์ปจํ
์ด๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ค. ์ปจํ
์ด๋ ์
์ฅ์์๋ ๊ทธ๋ฅ ํ๋ฒํ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ก ๋ณด์ด๊ณ , ๋ณดํต
eth0๋ผ๊ณ ๋ถ๋ฅธ๋ค. - ๋ค๋ฅธ ์ชฝ ๋์ ๋์ปค bridge ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋๋ค.
ํจํท์ ์ ์ฒด ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ปจํ
์ด๋ ์ฑ
โ ์ปจํ
์ด๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค (eth0)
โ veth (๊ฐ์ ๋์ )
โ ๋์ปค bridge ๋คํธ์ํฌ
โ ํธ์คํธ
โ ํธ์คํธ์ ์ค์ NIC
โ ์ธํฐ๋ท
์ฌ์ค IP ํ ๋น
bridge์ ์ฐ๊ฒฐ๋ ์ปจํ ์ด๋๋ ์ฌ์ค IP๋ฅผ ๋ฐ๋๋ค.
| ๋์ | ์์ IP | ์ค๋ช |
|---|---|---|
| ๋ ธํธ๋ถ(ํธ์คํธ) | 192.168.1.10 | ์ค์ ๋คํธ์ํฌ์ IP |
| ์ปจํ ์ด๋ | 172.17.0.2 | ๋์ปค ๋ด๋ถ ์ฌ์ค IP |
| bridge ์์ฒด | 172.17.0.1 | ๊ฒ์ดํธ์จ์ด ์ญํ |
bridge๋ ๊ฒ์ดํธ์จ์ด ์ญํ ์ ํ๋ค. ์ปจํ ์ด๋๊ฐ ํธ์คํธ๋ก ๋๊ฐ๋ ค๋ฉด ๋ชจ๋ ํจํท์ ์ด ๋ฌธ์ผ๋ก ๋ด๋ณด๋ด์ผ ํ๋ค. (์ฌ์ค IP์ ๊ณต์ธ IP์ ์ฐจ์ด๊ฐ ์ฌ๊ธฐ์ ํต์ฌ์ผ๋ก ์์ฉํ๋ค.)
3. ์ฒซ ๋ฒ์งธ ์ฌ์ - ์ปจํ ์ด๋๊ฐ ์ธํฐ๋ท์ผ๋ก ๋๊ฐ ๋ (์์๋ฐ์ด๋)
์ปจํ
์ด๋ ์์ Nginx๊ฐ ํจํค์ง๋ฅผ ๋ด๋ ค๋ฐ๊ฑฐ๋ ์ธ๋ถ API๋ฅผ ํธ์ถํ๋ค๊ณ ํ์. ํจํท์ eth0 โ veth โ bridge โ ํธ์คํธ ์์ผ๋ก ํ๋ฌ๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ํ๋ ํฐ์ง๋ค.
ํจํท์ ์ถ๋ฐ์ง ์ฃผ์๋ 172.17.0.2์ธ๋ฐ, ์ด๊ฑด ๋
ธํธ๋ถ ์์์๋ง ํตํ๋ ์ฌ์ค IP๋ค. ์ด๋๋ก ์ธํฐ๋ท์ ๋ด๋ณด๋ด๋ฉด ์๋ต์ด ๋์์ฌ ๊ณณ์ด ์๋ค. ์ธํฐ๋ท์ ์ด๋ค ๋ผ์ฐํฐ๋ 172.17.0.2๊ฐ ์ด๋์ธ์ง ๋ชจ๋ฅด๋๊น.
NAT (masquerade)
๊ทธ๋์ ํธ์คํธ๊ฐ ๋์์ NAT(Network Address Translation)๋ฅผ ํด ์ค๋ค. ๋์ปค๋ ๋ค์์ iptables ๊ท์น์ ๊ฑธ์ด ํจํท์ ์ถ๋ฐ์ง ์ฃผ์๋ฅผ ๋ฐ๊ฟ ์ด๋ค.
๋๊ฐ ๋: ์ถ๋ฐ์ง 172.17.0.2 โ 192.168.1.10 (ํธ์คํธ์ ์ค์ IP)
- ํจํท์ด ํธ์คํธ๋ฅผ ๋ ๋๋ ์๊ฐ, ์ฌ์ค IP
172.17.0.2๊ฐ ํธ์คํธ์ ์ค์ IP192.168.1.10์ผ๋ก ๋ฐ๋๊ณ ์ค์ NIC๋ฅผ ํตํด ์ธํฐ๋ท์ผ๋ก ๋น ์ ธ๋๊ฐ๋ค. - ์ธํฐ๋ท ์ชฝ์์ ๋ณด๋ฉด ํธ๋ํฝ์ด ๋ ธํธ๋ถ์์ ๊ณง์ฅ ์จ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ์ปจํ ์ด๋๋ ๊ทธ๋ฆผ์๋ ์ ๋น์น๋ค.
- ์๋ต์ด
192.168.1.10์ผ๋ก ๋์์ค๋ฉด, ํธ์คํธ๋ โ์ด๊ฑด ๊ทธ ์ปจํ ์ด๋ ๊ฑฐ์์งโ ํ๊ณ ๋ชฉ์ ์ง๋ฅผ ๋ค์172.17.0.2๋ก ๋ฐ๊ฟ bridge โ veth โeth0๋ก ์ ๋ฌํ๋ค.
๋๋ถ์ ์ปจํ ์ด๋๋ ์๊ธฐ ๊ณต์ธ ์ฃผ์ ํ๋ ์์ด๋ ์ธํฐ๋ท ์ ์ฒด์ ๋ฟ์ ์ ์๋ค.
4. ๋ ๋ฒ์งธ ์ฌ์ - ์ธ๋ถ์์ ์ปจํ ์ด๋๋ก ๋ค์ด์ฌ ๋ (์ธ๋ฐ์ด๋)
๋ค๋ค ์ฌ๊ธฐ์ ๋งํ๋ค. Nginx๊ฐ ํฌํธ 80์์ ๋ฉ์ฉกํ ๋๊ณ ์๋๋ฐ, ๋ธ๋ผ์ฐ์ ์์ localhost:80์ด๋ ๋
ธํธ๋ถ IP๋ก ์ ์ํ๋ฉด ์๋ต์ด ์๋ค.
์ด์ ๋ ๊ฐ๋จํ๋ค.
- ์ปจํ
์ด๋ IP
172.17.0.2๋ ์ฌ์ค ์ฃผ์๋ผ ๋ ธํธ๋ถ ๋ฐ์์๋ ์ง์ ๋ฟ์ ์ ์๋ค. - ๊ฒ๋ค๊ฐ ํธ์คํธ๋ ๊ธฐ๋ณธ ์ํ์์ ์ปจํ ์ด๋๋ก ์๋ฌด๊ฒ๋ ๋๊ฒจ์ฃผ์ง ์๋๋ค. Nginx๋ ๊ท๋ฅผ ์ด๊ณ ์์ง๋ง, ์ธ๋ถ์์ ๊ทธ ์ฌ์ค ๋คํธ์ํฌ๋ก ๋ค์ด๊ฐ ๋ฌธ ์์ฒด๊ฐ ์๋ค.
ํฌํธ ๊ฒ์ (port publishing)
๊ทธ๋์ ๋ฌธ์ ์ง์ ์ด์ด ์ค์ผ ํ๋ค. ์ปจํ
์ด๋๋ฅผ ๋์ธ ๋ -p ํ๋๊ทธ๋ฅผ ๋ถ์ธ๋ค.
docker run -p 8080:80 nginx๋์ปค์๊ฒ โ๋ ธํธ๋ถ์ 8080 ํฌํธ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์ปจํ ์ด๋ ๋ด๋ถ์ 80 ํฌํธ๋ก ๋ณด๋ด๋ผโ๊ณ ์ง์ํ๋ ์ ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๋์ปค๋ ๋ ๋ค๋ฅธ NAT ๊ท์น(DNAT, ๋ชฉ์ ์ง ์ฃผ์ ๋ณํ)์ ํ๋ ๋ ์จ ๋๋ค.
๋ค์ด์ฌ ๋: ๋ชฉ์ ์ง ๋
ธํธ๋ถ:8080 โ 172.17.0.2:80
์ด์ 8080์ผ๋ก ๋ค์ด์จ ์์ฒญ์ ๋ชฉ์ ์ง๊ฐ 172.17.0.2:80์ผ๋ก ๋ฐ๋ ๋ค bridge โ eth0๋ฅผ ๊ฑฐ์ณ Nginx๊น์ง ๋ฟ๋๋ค.
0.0.0.0 ๋ฐ์ธ๋ฉ ํจ์
์ปจํ ์ด๋ ์์ ์ฑ์ ๋ฐ๋์ ๋ชจ๋ ์ฃผ์(
0.0.0.0)์์ ์์ ํด์ผ ํ๋ค.127.0.0.1์๋ง ๋ฐ์ธ๋ฉ๋์ด ์์ผ๋ฉด, ํฌ์๋ฉ๋ ํธ๋ํฝ์ด ๋ฒฝ์ ๋ถ๋ชํ ํฌํธ๋ฅผ ๊ฒ์ํ์ด๋connection refused๊ฐ ๋๋ค. โํฌํธ๋ฅผ ์ด์๋๋ฐ ์ ์ ๋์ง?โ์ ํํ ์์ธ์ด๋ค.
5. ๋ ๊ท์น์ผ๋ก ์ ๋ฆฌ
ํธ์คํธ๊ฐ ๋ค์์ ์ฑ๊ธฐ๋ NAT ๊ท์น์ ๊ฒฐ๊ตญ ๋ ๊ฐ์ง๋ก ์ขํ์ง๋ค.
| ๋ฐฉํฅ | ๋ณํ ๋์ | ํจ๊ณผ |
|---|---|---|
| ์์๋ฐ์ด๋ | ์ถ๋ฐ์ง IP ์ฌ์์ฑ (masquerade) | ์ปจํ ์ด๋๊ฐ ํธ์คํธ ์ ์์ ๋น๋ ค ์ธํฐ๋ท๊ณผ ํต์ |
| ์ธ๋ฐ์ด๋ | ๋ชฉ์ ์ง IP ์ฌ์์ฑ (DNAT) | ๋ช ์์ ์ผ๋ก ๊ฒ์ํ ํฌํธ์ ํํด ์ธ๋ถ โ ์ปจํ ์ด๋ ๋๋ฌ |
์ปจํ ์ด๋๋ ์ค์ NIC๋ฅผ ์ ๋ ์ง์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค. ํธ์คํธ๊ฐ ์ค๊ฐ์ ๋ผ์ด ์๋ฐฉํฅ์ ํต์งธ๋ก ๋ฒ์ญํด ์ค๋ค.
ํธ๋ฌ๋ธ์ํ ํด๋ฆฌ์คํฑ
์ด ํ๋ฆ์ด ๋จธ๋ฆฟ์์ ํ ๋ฒ ๊ทธ๋ ค์ง๋ฉด ๋ฌธ์ ์ง๋จ์ด ๋ถ์ฉ ๋นจ๋ผ์ง๋ค.
- ์ปจํ
์ด๋๋ ์ธํฐ๋ท์ ๋๊ฐ๋๋ฐ, ์ธ๋ถ์์ ์ปจํ
์ด๋์ ๋ชป ๋ค์ด๊ฐ๋ค โ ํฌํธ ๊ฒ์(
-p)๋ฅผ ๋น ๋จ๋ฆผ - ๊ฐ์ bridge์ ๋ ์ปจํ ์ด๋๋ ํต์ ๋๋๋ฐ ์ธ ๋ฒ์งธ๋ง ์ ๋๋ค โ ๊ทธ ์ปจํ ์ด๋๋ง ๋ค๋ฅธ ๋คํธ์ํฌ์ ์์
- ํฌํธ๋ฅผ ๊ฒ์ํ๋๋ฐ๋
connection refusedโ ์ฑ์ด127.0.0.1์๋ง ๋ฐ์ธ๋ฉ๋จ (0.0.0.0ํ์)
6. ๊ด๋ จ ๋ ธํธ
- Docker ๋คํธ์ํฌ - bridge/overlay/macvlan ๋ฑ ๋๋ผ์ด๋ฒ ์ข ๋ฅ์ ๊ณ์ธต ๊ตฌ์กฐ, macOS์ Linux ์ฐจ์ด. ์ด ๊ธ์ NAT/ํฌํธ ๊ฒ์ ํ๋ฆ๊ณผ ์ํธ ๋ณด์
- 8. IP ์ฃผ์ - ์ฌ์ค IP์ ๊ณต์ธ IP, NAT์ ๋ฐฐ๊ฒฝ
- 6. ์ค์์น - bridge ๋คํธ์ํฌ๊ฐ ํ๋ด ๋ด๋ ๋ฐ์ดํฐ ๋งํฌ ๊ณ์ธต ์ค์์น
- Dockerfile, Docker ๋ช
๋ น์ด -
-p๋ฑ ์ปจํ ์ด๋ ์คํ ์ต์