[docker] 🐳 Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ 둜컬 λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ—°κ²°λ˜μ§€ μ•ŠλŠ” 이유 (localhost 이슈)

여리·2025λ…„ 5μ›” 29일

Dockerμ—μ„œ κ°œλ°œμ„ ν•˜λ‹€ 보면, μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ‘œμ»¬μ— μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘μ†ν•˜λ € ν•  λ•Œ localhost λ˜λŠ” 127.0.0.1을 μ‚¬μš©ν•΄λ„ 연결이 μ•ˆ λ˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

μ΄ˆλ°˜μ— 도컀λ₯Ό μ ‘ν•˜κ²Œ λ˜λŠ”κ²½μš°μ—μ„œλŠ” λ„μ»€μ˜ κ°œλ…μ„ λͺ…ν™•ν•˜κ²Œ μΈμ§€ν•œ μƒνƒœκ°€ μ•„λ‹ˆλΌλ©΄ λ„€νŠΈμ›Œν¬μ˜ μ—°κ²° λΆ€λΆ„μ—μ„œ 문제λ₯Ό μ§λ©΄ν•˜κ²Œ λ˜λŠ” κ²½μš°κ°€ λ§Žμ„ν…λ° μ΄λŸ°κ²½μš°μ— λŒ€ν•΄μ„œ λ‚΄κ°€ μ§λ©΄ν–ˆλ˜ 상황과 ν•΄κ²°λ‚΄μš©μ„ μž‘μ„±ν•΄λ³΄μ•˜λ‹€.

처음 μ ‘ν•˜λŠ” μ‚¬λžŒμ—κ² λ‹Ήν™©μŠ€λŸ¬μšΈ 수 μžˆλŠ” 문제인데, 사싀 이건 Docker의 λ„€νŠΈμ›Œν¬ ꡬ쑰λ₯Ό μ΄ν•΄ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλ‹€.

Docker μ»¨ν…Œμ΄λ„ˆλŠ” 기본적으둜 ν˜ΈμŠ€νŠΈμ™€ λΆ„λ¦¬λœ 독립 λ„€νŠΈμ›Œν¬ μ•ˆμ—μ„œ λ™μž‘ν•œλ‹€. κ·Έλž˜μ„œ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ localhostλ₯Ό μ‚¬μš©ν•˜λ©΄ ν˜ΈμŠ€νŠΈκ°€ μ•„λ‹ˆλΌ μ»¨ν…Œμ΄λ„ˆ 자기 μžμ‹ μ„ λ°”λΌλ³΄κ²Œ λœλ‹€. 이게 DB 연결이 μ•ˆ λ˜λŠ” 핡심.
λ§Œμ•½, 정말 localhost의 ν™˜κ²½μ„ μ‚¬μš©ν•˜κ² λ‹€λ©΄ ν•΄λ‹Ή λ„μ»€μ»¨ν…Œμ΄λ„ˆ 내뢀에 연결을 ν•˜κ³ μž ν•˜λŠ” DBλ₯Ό μ„€μΉ˜ 및 μž‘λ™ν•˜λ©΄ λœλ‹€.

βΈ»

❓ 문제 상황

μ»¨ν…Œμ΄λ„ˆ μ•ˆμ—μ„œ DB에 접속할 λ•Œ μ•„λž˜μ²˜λŸΌ localhostλ₯Ό μ“΄λ‹€:

DB_HOST=127.0.0.1
λ˜λŠ”
DB_HOST=localhost

그런데 DB μ—°κ²° 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

μ΄μœ λŠ” κ°„λ‹¨ν•˜λ‹€.

πŸ’₯ localhostλŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ₯Ό 가리킨닀

localhost λ˜λŠ” 127.0.0.1은 항상 자기 μžμ‹ (=둜컬 루프백)을 가리킨닀.
Docker μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ 이걸 μ“°λ©΄, 호슀트(λ‚΄ 컴퓨터)κ°€ μ•„λ‹ˆλΌ μ»¨ν…Œμ΄λ„ˆ 자체λ₯Ό λ°”λΌλ³΄κ²Œ λœλ‹€.

즉, μ»¨ν…Œμ΄λ„ˆ μ•ˆμ— MySQL 같은 DBκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄, λ‹Ήμ—°νžˆ 접속이 μ•ˆ λœλ‹€.

🧠 μ»¨ν…Œμ΄λ„ˆλŠ” ν˜ΈμŠ€νŠΈμ™€ 격리된 λ„€νŠΈμ›Œν¬μ—μ„œ λ™μž‘ν•œλ‹€λŠ” 사싀을 κΈ°μ–΅ν•˜μž.

βœ… ν•΄κ²° 방법

  1. Mac λ˜λŠ” Windows (Docker Desktop μ‚¬μš©μž)

πŸ‘‰ host.docker.internal μ‚¬μš©

Docker Desktop은 host.docker.internalμ΄λΌλŠ” 특수 DNSλ₯Ό μ§€μ›ν•΄μ„œ
μ»¨ν…Œμ΄λ„ˆμ—μ„œ 호슀트 OS둜 접속할 수 있게 ν•΄μ€€λ‹€.

DB_HOST=host.docker.internal
  1. Linux μ‚¬μš©μž

λ¦¬λˆ…μŠ€μ—μ„œλŠ” host.docker.internal이 기본적으둜 μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€.
λŒ€μ‹  μ•„λž˜ 두 κ°€μ§€ 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ‘‰ A. 호슀트 IP 직접 μž…λ ₯ν•˜κΈ°

ip addr show docker0  # λ˜λŠ” ifconfig

# 예λ₯Ό λ“€μ–΄ ipμ£Όμ†Œλ₯Ό ν™•μΈν–ˆμ„λ•Œ μ£Όμ†Œκ°€ 123.45.6.7κ°€ λ‚˜μ˜¨λ‹€λ©΄
DB_HOST=172.17.0.1

μ»¨ν…Œμ΄λ„ˆλŠ” 이 μ£Όμ†Œλ₯Ό 톡해 ν˜ΈμŠ€νŠΈμ— μ ‘κ·Όν•  수 μžˆλ‹€.

πŸ‘‰ B. host λ„€νŠΈμ›Œν¬ λͺ¨λ“œ μ‚¬μš©

docker run --network host ...

μ΄λ ‡κ²Œ ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆκ°€ 호슀트의 λ„€νŠΈμ›Œν¬λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κ²Œ λœλ‹€.
즉, 127.0.0.1λ‘œλ„ 연결이 κ°€λŠ₯ν•΄μ§„λ‹€.

⚠️ ν•˜μ§€λ§Œ 이 방식은 λ³΄μ•ˆ μ΄μŠˆλ‚˜ 포트 좩돌 μœ„ν—˜μ΄ μžˆμœΌλ‹ˆ, κ°œλ°œν™˜κ²½μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” κ±Έ μΆ”μ²œ.

✏️ 마무리

Dockerλ₯Ό μ“Έ λ•Œ κ°€μž₯ 많이 ν—·κ°ˆλ¦¬λŠ” 포인트 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ λ„€νŠΈμ›Œν¬ 뢄리 ꡬ쑰닀.
이 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³  λ‚˜λ©΄, localhost λ¬Έμ œκ°€ μ™œ μƒκΈ°λŠ”μ§€λ„ λͺ…ν™•ν•΄μ§„λ‹€.

ν™˜κ²½μ— 따라 μ ‘κ·Ό 방법은 λ‹¬λΌμ§€λ‹ˆ, 본인의 OS에 λ§žλŠ” 방법을 μ‚¬μš©ν•˜μž!

profile
beckend developer

0개의 λŒ“κΈ€