상황

Django는 Docker 컨테이너 내에서 실행. MySQL은 컨테이너 외부 Linux에서 실행.

EC2 보안 그룹 인바운드 규칙에서 MySQL에 우리집 IP주소만 허용함. EC2 내부에서 localhost를 통해 Django가 MySQL로 접속하고자 한다.

문제

Django에서 Linux에 설치된 MySQL에 접속하기 위해 Django 설정에서 DATABASES - HOST에 host.docker.internal을 사용했으나 안됨. 같은 상황에서 Linux 대신 Windows 환경에서는 잘 됨.

해결

Linux 위에서 실행되는 Docker 컨테이너는 extra_hosts 설정을 아래와 같이 추가해야 컨테이너 내에서 domain name을 통해 로컬 호스트(127.0.0.1)으로 접속할 수 있다.

From inside of a Docker container, how do I connect to the localhost of the machine?

Docker v 20.10 and above (since December 14th 2020)

Use your internal IP address or connect to the special DNS name host.docker.internal which will resolve to the internal IP address used by the host.

On Linux, add --add-host=host.docker.internal:host-gateway to your Docker command to enable this feature. To enable this in Docker Compose on Linux, add the following lines to the container definition:

extra_hosts:
    - "host.docker.internal:host-gateway"