host.docker.internal은 host의 localhost일까?
| topics | 401 Docker & Kubernetes 702 네트워크 |
| types | 에러해결 이론 |
| references | docs.docker.com/desktop/ |
항상 나는 도커를 맥환경에서 docker desktop을 사용해서 이용했다. 이때는 자연스래 host.docker.internal는 host의 localhost구나라고 생각했다.
따라서 리눅스/우분투 환경에서 host.docker.internal을 사용할 수 있도록
docker-compose.yml에
extra_hosts:
- "host.docker.internal:host-gateway"
를 사용해서 host의 localhost에서 운영되는 mysql에 접근하고자 하였다. 하지만 접근이 안되었다.
왜 접근이 안될까.
일단 나는 이문제를 풀기전에 네트워크 개념이 햇갈렸기에 이것부터 들어간다.
0.0.0.0 과 host
- 0.0.0.0 : 모든 네트워크 연결 허용하는 바인딩 주소
- localhost : 해당 네트워크 인터페이스에서만 접근 가능할 수 있는 loopback(안에서만도는) 주소
- host안에서도 다양한 네트워크인 터페이스가 있을 수 있다. 도커처럼..
즉 도커는 네트워크가 분리되어있기에 host의 localhost에 접근이 불가능하다.
docker0의 역할
- 컨테이너들의 브릿지 : 각 컨테이너의 네트워크 인터페이스끼리 연결한다.
- gateway : host에서 docker0으로 라우팅/nat해서 docker0으로보낸다.
즉 host.docker.internal:host-gateway === docker0의 ip
해결방안
즉 host.docker.internal는 docker0의 ip를타나내기에 mysql이 host.docker.internal에 바인딩되어 있어야 한다.
/etc/mysql/mysql.conf.d
mysql을 0.0.0.0에 바인딩
bind-address = 0.0.0.0
하지만 이렇게하면 네트워크인터페이스에서 접근할 수 있어 보안에 유의해야한다.
보안처리
- 방화벽 확인
- 접속할 수 있는 user localhost or 사설 네트워크로 제한.

근데... 맥북에서는 localhost에서 접근이 됐었다.
생각해보면 내가 맥북에서 사용햇을때 따로 이걸 고려하지 않아도 됐었다...
왜일까?
맥에서는 vm위에서 도커가 돌아간다.
맥에서는 docker desktop을 사용해서 도커를 돌린다.
이 docker desktop 은 vm을 이용하고 도커는 이 vm위에서 돌아간다.
그리고 리눅스에스에서와 달리 vm과 host사이의 연결을 위해 vpnkit를 이용한다.
vpnkit가 host에서 돌아가고 vm에서 이 연결을 받는다.
host : vpnkit <---> vm: vsock
즉 vpnkit가 호스트의 프로세스로 돌아가기에 host.docker.internal를 host의 로컬호스트로 사용 가능한 것이다.