Docker
[Docker] 컨테이너 내부에서 Host로 접근하기
박만자
2022. 2. 24. 11:54
다음과 같은 상황이라고 가정해봅시다.
현재 서버에 두개의 컨테이너가 실행되고 있습니다. 하나는 Node.js로 만들어진 웹 어플리케이션 컨테이너, 하나는 MySQL이 돌아가고있는 컨테이너입니다. 각각 다른 컨테이너에서 돌아가고 있고, Host는 동일한 상황입니다. 만약 Node.js 에서 내 서버에 MySQL 컨테이너로 요청을 보낼려고 할때 localhost를 통해 요청을 보낼려하면 당연히 요청이 보내지지 않을 것입니다. 이유는 Node.js 기준 localhost는 Host가 아닌 Node.js 가 실행되고 있는 컨테이너가 기준이 되기 때문입니다. 때문에 MySQL로 요청을 보내기 위해서는 다른 방법으로 Host에 접근해야합니다.
스택오버플로우 글에서 해답을 얻을 수 있었습니다.
윈도우나 맥의 경우 기본적으로 host.docker.internal 명령어로 컨테이너 내부에서 Host에 접근이 가능하다고 합니다.
Linux의 경우 컨테이너를 실행할 때 --add-host host.docker.internal:host-gateway 옵션을 지정해주면 컨테이너 내부에서 host.docker.internal 명령어를 사용할 수 있다고 합니다.
Host로 접근하기
예시를 위해 각자 다른 내용을 담은 Node.js 웹 어플리케이션 컨테이너를 두 개 띄워놨습니다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d8fd10954dd node-app-v2 "docker-entrypoint.s…" 28 minutes ago Up 28 minutes 0.0.0.0:3001->3000/tcp node-web-app-v2
1d58dde99867 node-app "docker-entrypoint.s…" 30 minutes ago Up 30 minutes 0.0.0.0:3000->3000/tcp node-web-app
먼저 node-web-app 컨테이너로 접속해줍니다.
$ docker exec -it node-web-app /bin/bash
root@1d58dde99867:/app#
그 다음 현재 node-web-app 컨테이너 내부에서 node-web-app-v2 요청을 보내지는지 확인하기 위해 다음과 같이 명령어를 입력해주었습니다. Host로 요청이 잘 가는것을 확인할 수 있습니다.
$ curl host.docker.internal:3001
<h1>Hello Docker v2</h1>
공식 문서를 참고하시면 도움이 됩니다.
https://docs.docker.com/desktop/mac/networking/#i-cannot-ping-my-containers