개발관련/other

Docker 컨테이너 내부에서 머신의 로컬 호스트에 연결하는 방법

Rateye 2021. 12. 7. 10:13
728x90
반응형
질문 : Docker 컨테이너 내부에서 머신의 로컬 호스트에 어떻게 연결합니까?

그래서 도커 컨테이너 내에서 실행되는 Nginx가 있고 localhost에서 실행되는 mysql이 있으며 내 Nginx 내에서 MySql에 연결하고 싶습니다. MySql은 로컬 호스트에서 실행 중이며 포트를 외부 세계에 노출하지 않으므로 컴퓨터의 IP 주소에 바인딩되지 않고 로컬 호스트에 바인딩됩니다.

이 Docker 컨테이너 내에서이 MySql 또는 localhost의 다른 프로그램에 연결할 수있는 방법이 있습니까?

이 질문은 "도커 컨테이너 내부에서 도커 호스트의 IP 주소를 얻는 방법"과는 다릅니다. 도커 호스트의 IP 주소는 네트워크의 공용 IP 또는 개인 IP 일 수 있다는 사실 때문입니다. 도커 컨테이너 내에서 연결할 수 없습니다 (AWS 등에서 호스팅되는 경우 퍼블릭 IP를 의미합니다). Docker 호스트의 IP 주소가 있더라도 Docker 네트워크가 오버레이, 호스트, 브리지, macvlan 등이 될 수 있으므로 해당 IP 주소가 주어지면 컨테이너 내에서 Docker 호스트에 연결할 수 있음을 의미하지는 않습니다. 그 IP 주소.

답변

편집하다:

Docker-for-mac 또는 Docker-for-Windows host.docker.internal (연결 문자열 127.0.0.1 대신)을 사용하여 mysql 서비스에 연결하기 만하면됩니다.

Docker-for-Linux 20.10.0+를 사용하는 경우 --add-host host.docker.internal:host-gateway 옵션을 사용하여 Docker 컨테이너를 시작한 host.docker.internal

그렇지 않으면 아래를 읽으십시오.


TLDR

docker run 명령에서 --network="host" 를 사용하면 127.0.0.1 이 Docker 호스트를 가리 킵니다.

참고 :이 모드는 설명서에 따라 Linux 용 Docker에서만 작동합니다.


도커 컨테이너 네트워킹 모드 참고

Docker는 컨테이너를 실행할 때 다양한 네트워킹 모드를 제공합니다. 선택한 모드에 따라 Docker 호스트에서 실행되는 MySQL 데이터베이스에 다르게 연결할 수 있습니다.

docker run --network="bridge" (default)

Docker는 기본적으로 docker0 이라는 브리지를 만듭니다. Docker 호스트와 Docker 컨테이너 모두 해당 브리지에 IP 주소가 있습니다.

Docker 호스트에서 sudo ip addr show docker0 하면 다음과 같은 출력이 표시됩니다.

[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link
       valid_lft forever preferred_lft forever

그래서 여기 내 도커 호스트는 docker0 네트워크 인터페이스 172.17.42.1 을 가지고 있습니다.

이제 새 컨테이너를 시작하고 셸을 가져옵니다. docker run --rm -it ubuntu:trusty bash 및 컨테이너 유형 ip addr show eth0 내에서 기본 네트워크 인터페이스가 설정되는 방법을 확인합니다.

root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.1.192/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
       valid_lft forever preferred_lft forever

여기 내 컨테이너의 IP 주소는 172.17.1.192 입니다. 이제 라우팅 테이블을보십시오.

root@e77f6a1b3740:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

172.17.42.1 호스트 172.17.42.1의 IP 주소가 기본 경로로 설정되고 컨테이너에서 액세스 할 수 있습니다.

root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms

docker run --network="host"

또는 네트워크 설정이 host 설정된 Docker 컨테이너를 실행할 수 있습니다. 이러한 컨테이너는 네트워크 스택을 도커 호스트와 공유하고 컨테이너 관점에서 localhost (또는 127.0.0.1 )는 도커 호스트를 참조합니다.

도커 컨테이너에서 열린 모든 포트는 도커 호스트에서 열릴 수 있습니다. -p 또는 -P docker run 옵션 이 필요하지 않습니다.

내 Docker 호스트의 IP 구성 :

[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

호스트 모드의 도커 컨테이너에서 :

[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

보시다시피 도커 호스트와 도커 컨테이너는 정확히 동일한 네트워크 인터페이스를 공유하므로 동일한 IP 주소를 갖습니다.


컨테이너에서 MySQL에 연결

브리지 모드

브리지 모드의 컨테이너에서 도커 호스트에서 실행중인 MySQL에 액세스하려면 172.17.42.1 IP 주소에서 연결을 수신하는지 확인해야합니다.

이렇게하려면 MySQL 구성 파일 (my.cnf)에 bind-address = 172.17.42.1 또는 bind-address = 0.0.0.0 이 있는지 확인하십시오.

게이트웨이의 IP 주소로 환경 변수를 설정해야하는 경우 컨테이너에서 다음 코드를 실행할 수 있습니다.

export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

그런 다음 애플리케이션에서 DOCKER_HOST_IP 환경 변수를 사용하여 MySQL에 대한 연결을 엽니 다.

참고 : bind-address = 0.0.0.0 을 사용하는 경우 MySQL 서버는 모든 네트워크 인터페이스에서 연결을 수신합니다. 즉, 인터넷에서 MySQL 서버에 연결할 수 있습니다. 그에 따라 방화벽 규칙을 설정해야합니다.

참고 2 : bind-address = 172.17.42.1 을 사용하면 127.0.0.1 대한 연결을 수신하지 않습니다. MySQL에 연결하려는 도커 호스트에서 실행되는 프로세스는 172.17.42.1 IP 주소를 사용해야합니다.

호스트 모드

호스트 모드의 컨테이너에서 도커 호스트에서 실행중인 MySQL에 액세스하려면 MySQL 구성에서 bind-address = 127.0.0.1 을 유지 127.0.0.1 됩니다.

[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

참고 : mysql -h localhost 아닌 mysql -h 127.0.0.1 사용하십시오. 그렇지 않으면 MySQL 클라이언트는 유닉스 소켓을 사용하여 연결을 시도합니다.

출처 : https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach
728x90
반응형