Docker 컨테이너 내부에서 머신의 로컬 호스트에 어떻게 연결하나요?
P粉787820396
2023-08-23 11:55:48
<p>도커 컨테이너 내에서 Nginx가 실행되고 있습니다. 호스트 시스템에서 MySql을 실행하고 있습니다. 내 컨테이너 내에서 MySql에 연결하고 싶습니다. MySql은 로컬 호스트 장치에만 바인딩됩니다. </p>
<p>이 Docker 컨테이너 내에서 이 MySql이나 localhost의 다른 프로그램에 연결할 수 있는 방법이 있습니까? </p>
<p>이 질문은 "도커 컨테이너 내부에서 도커 호스트의 IP 주소를 얻는 방법"과 다릅니다. 왜냐하면 도커 호스트의 IP 주소는 네트워크의 공용 IP일 수도 있고 개인 IP일 수도 있기 때문입니다. 도커 컨테이너 내에서는 액세스할 수 없습니다(AWS나 다른 곳에서 호스팅되는 경우 공용 IP를 의미합니다). Docker 호스트의 IP 주소가 있다고 해서 컨테이너 내에서 Docker 호스트에 연결할 수 있다는 의미는 아닙니다. Docker 네트워크가 오버레이 네트워크, 호스트 네트워크, 브리지 네트워크, macvlan 네트워크일 수 있기 때문입니다. , 없음 네트워크 등은 컨테이너의 이 IP 주소에 대한 연결 가능성을 제한합니다. </p>
모든 플랫폼에서 사용 가능
Docker v 20.10 이상(2020년 12월 14일 기준)
내부 IP 주소를 사용하거나 호스트가 사용하는 내부 IP 주소를 확인하는 특수 DNS 이름
host.docker.internal
에 연결하세요.이는 개발 목적으로 사용되며 Docker Desktop 외부의 프로덕션 환경에는 적용되지 않습니다.
Linux 경고
Linux의 Docker에서 이 기능을 활성화하려면
--add-host=host.docker.internal:host-gateway
docker명령에
를 추가하여 기능을 활성화하세요.Linux의 Docker Compose에서 이 기능을 활성화하려면 컨테이너 정의에 다음 줄을 추가하세요.
으아아아일부 사용자에 따르면 특수 DNS 이름은 Docker의 기본
bridge
브리지 네트워크에서만 작동하고 사용자 지정 네트워크에서는 작동하지 않습니다.이전 macOS 및 Windows 버전의 Docker
Docker v 18.03 이상(2018년 3월 21일 기준)
내부 IP 주소를 사용하거나 호스트가 사용하는 내부 IP 주소를 확인하는 특수 DNS 이름
host.docker.internal
에 연결하세요.Linux 지원이 보류 중입니다. https://github.com/docker/for-linux/issues/264
이전 macOS 버전의 Docker
Mac용 Docker v 17.12~v 18.02
위와 동일하지만
docker.for.mac.host.internal
docker.for.mac.host.internal을 사용합니다.Mac용 Docker v 17.06~v 17.11
위와 동일하지만 대신
docker.for.mac.localhost
docker.for.mac.localhost를 사용하세요.Mac 17.05 이하용 Docker
Docker 컨테이너에서 호스트 시스템에 액세스하려면 네트워크 인터페이스에 IP 별칭을 연결해야 합니다. 원하는 IP를 바인딩할 수 있지만 다른 용도로 사용하지 않는지 확인하세요.
sudo ifconfig lo0 别名 123.123.123.123/24
sudo ifconfig lo0 별칭 123.123.123.123/24그런 다음 서버가 위 IP 또는
127.0.0.1에서 수신 대기 중인 경우 연결을 허용하지 않습니다.0.0.0.0
。如果它正在监听本地主机127.0.0.1
0.0.0.0에서 수신 대기하는지 확인하세요. localhostcurl -X GET 123.123.123.123:3000
테스트하려면 컨테이너 내부에서솔루션 및 추가 문서: https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
🎜편집자:
Docker-for-mac 또는 Docker-for-Windows 18.03 이상을 사용하는 경우 연결 문자열에서
host.docker.internal
127.0.0.1대신 호스트 를 사용하세요.
Docker-for-Linux 20.10.0 이상을 사용하는 경우 호스트를 사용할 수도 있습니다.
ifhost.docker.internal
if您使用--add-host host.docker.internal:host-gateway
으아아아
그렇지 않은 경우 아래 내용을 읽어주세요
docker run
命令中使用--network="host"
,然后 docker 容器中的127.0.0.1
TLDRdocker run 명령에서 --network="host"를 사용하면 docker 컨테이너의 p>127.0.0.1이 docker 호스트를 가리킵니다.
참고: 이 모드는
문서에 따르면Linux의 Docker에서만 사용할 수 있습니다.
Docker 컨테이너 네트워크 모드에 대한 참고 사항다양한 네트워크 모드
docker0
를 제공합니다. 선택한 모드에 따라 Docker 호스트에서 실행되는 MySQL 데이터베이스에 다르게 연결됩니다.docker run --network="bridge" (기본값)
Docker는 기본적으로sudo ip addr show docker0
docker0이라는 브리지를 생성합니다. 도커 호스트와 도커 컨테이너 모두 브리지에 IP 주소를 가지고 있습니다.
Docker 호스트에서docker0
网络接口上的 IP 地址为172.17.42.1
sudo ip addr show docker0을 입력하면 다음과 같은 출력이 표시됩니다.
따라서docker run --rm -it ubuntu:trusty bash
并在容器中输入ip addr show eth0
으아아아docker0 네트워크 인터페이스에 있는 내 Docker 호스트의 IP 주소는
172.17.1.192
172.17.42.1입니다.이제 새 컨테이너를 시작하고 그 위에 쉘을 가져옵니다.
ip addr show eth0를 입력하여 기본 네트워크 인터페이스가 어떻게 작동하는지 확인하세요. 설정됨: 🎜 으아아아 🎜여기서 내 컨테이너의 IP 주소는 🎜172.17.1.192입니다. 이제 라우팅 테이블을 보십시오: 🎜 으아아아 🎜따라서 Docker 호스트의 IP 주소 🎜172.17.42.1가 기본 경로로 설정되고 컨테이너에서 액세스할 수 있습니다. 🎜으아악172.17.42.1
docker run --rm -it ubuntu:trusty bash 및 컨테이너 유형docker run --network="host"
또는 Docker 컨테이너를 실행하고 네트워크 설정을
主机
。这样的容器将与 docker 主机共享网络堆栈,从容器的角度来看,localhost
(或127.0.0.1
)将引用 docker 主机。 p>로 설정할 수도 있습니다.Docker 컨테이너에서 열린 모든 포트는 Docker 호스트에서 열립니다.
-p
或 -Pdocker run
option이 필요하지 않습니다.내 도커 호스트의 IP 구성:
으아악그리고 host 모드의 도커 컨테이너:
으아악보시다시피, 도커 호스트와 도커 컨테이너는 정확히 동일한 네트워크 인터페이스를 공유하므로 동일한 IP 주소를 갖습니다.
컨테이너에서 MySQL에 연결
브리지 모드
브리지 모드의 컨테이너에서 Docker 호스트에서 실행 중인 MySQL에 액세스하려면 MySQL 서비스가
에서 연결을 수신 대기하고 있는지 확인해야 합니다.172.17.42.1
IP 주소이렇게 하려면 MySQL 구성 파일(my.cnf)에
bind-address = 172.17.42.1
或bind-address = 0.0.0.0
)가 있는지 확인하세요.게이트웨이의 IP 주소로 환경 변수를 설정해야 하는 경우 컨테이너에서 다음 코드를 실행할 수 있습니다.
으아악그런 다음 애플리케이션에서
DOCKER_HOST_IP
환경 변수를 사용하여 MySQL에 대한 연결을 엽니다.참고:
bind-address = 0.0.0.0
를 사용하면 MySQL 서버가 모든 네트워크 인터페이스의 연결을 수신합니다. 이는 인터넷에서 MySQL 서버에 액세스할 수 있음을 의미하며 이에 따라 방화벽 규칙을 설정해야 합니다.참고 2:
bind-address=172.17.42.1
을 사용하는 경우 MySQL 서버는127.0.0.1
에 대한 연결을 수신하지 않습니다. MySQL에 연결하려는 Docker 호스트에서 실행 중인 프로세스는bind-address = 172.17.42.1
,您的MySQL服务器将不会侦听与127.0.0.1
建立的连接>。在 docker 主机上运行的想要连接到 MySQL 的进程必须使用172.17.42.1
IP 주소를 사용해야 합니다.호스트 모드
호스트 모드의 컨테이너에서 Docker 호스트에서 실행 중인 MySQL에 액세스하려면 컨테이너의 MySQL 구성을
으아악bind-address = 127.0.0.1
并连接到127.0.0.1
로 유지하면 됩니다.참고:
mysql -h 127.0.0.1
,而不是mysql -h localhost
를 사용하세요. 그렇지 않으면 MySQL 클라이언트가 Unix 소켓을 사용하여 연결을 시도합니다.