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 사설 네트워크로 제한. host.docker.internal은 host의 localhost일까?-1767264224212.png

근데... 맥북에서는 localhost에서 접근이 됐었다.

생각해보면 내가 맥북에서 사용햇을때 따로 이걸 고려하지 않아도 됐었다...
왜일까?

맥에서는 vm위에서 도커가 돌아간다.

맥에서는 docker desktop을 사용해서 도커를 돌린다.
이 docker desktop 은 vm을 이용하고 도커는 이 vm위에서 돌아간다.
그리고 리눅스에스에서와 달리 vm과 host사이의 연결을 위해 vpnkit를 이용한다.

vpnkit가 host에서 돌아가고 vm에서 이 연결을 받는다.

host : vpnkit <---> vm: vsock

즉 vpnkit가 호스트의 프로세스로 돌아가기에 host.docker.internal를 host의 로컬호스트로 사용 가능한 것이다.