>  Q&A  >  본문

Docker 컨테이너 내부에서 머신의 로컬 호스트에 어떻게 연결하나요?

<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>
P粉787820396P粉787820396423일 전547

모든 응답(2)나는 대답할 것이다

  • P粉517090748

    P粉5170907482023-08-24 11:07:24

    모든 플랫폼에서 사용 가능

    Docker v 20.10 이상(2020년 12월 14일 기준)

    내부 IP 주소를 사용하거나 호스트가 사용하는 내부 IP 주소를 확인하는 특수 DNS 이름host.docker.internal에 연결하세요.

    이는 개발 목적으로 사용되며 Docker Desktop 외부의 프로덕션 환경에는 적용되지 않습니다.

    Linux 경고

    Linux의 Docker에서 이 기능을 활성화하려면 --add-host=host.docker.internal:host-gatewaydocker 명령에 를 추가하여 기능을 활성화하세요.

    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.internaldocker.for.mac.host.internal을 사용합니다.

    Mac용 Docker v 17.06~v 17.11

    위와 동일하지만 대신 docker.for.mac.localhostdocker.for.mac.localhost를 사용하세요.

    Mac 17.05 이하용 Docker

    Docker 컨테이너에서 호스트 시스템에 액세스하려면 네트워크 인터페이스에 IP 별칭을 연결해야 합니다. 원하는 IP를 바인딩할 수 있지만 다른 용도로 사용하지 않는지 확인하세요.

    sudo ifconfig lo0 别名 123.123.123.123/24sudo ifconfig lo0 별칭 123.123.123.123/24

    그런 다음 서버가 위 IP 또는 0.0.0.0。如果它正在监听本地主机127.0.0.10.0.0.0에서 수신 대기하는지 확인하세요. localhost

    127.0.0.1에서 수신 대기 중인 경우 연결을 허용하지 않습니다.

    그런 다음 호스트에 액세스하려면 도커 컨테이너를 이 IP로 지정하세요!

    curl -X GET 123.123.123.123:3000테스트하려면 컨테이너 내부에서

    curl -X GET 123.123.123.123:3000과 같은 명령을 실행할 수 있습니다.

    별칭은 재부팅할 때마다 재설정되므로 필요한 경우 시작 스크립트를 만드세요.

    솔루션 및 추가 문서: https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms

    🎜

    회신하다
    0
  • P粉019353247

    P粉0193532472023-08-24 09:26:22

    편집자:

    Docker-for-mac 또는 Docker-for-Windows 18.03 이상을 사용하는 경우 연결 문자열에서 host.docker.internal127.0.0.1 대신 호스트 < /code>를 사용하세요.

    Docker-for-Linux 20.10.0 이상을 사용하는 경우 호스트를 사용할 수도 있습니다. host.docker.internal if您使用 --add-host host.docker.internal:host-gateway

    if

    --add-hosthost.docker.internal:host-gateway 옵션 Docker 컨테이너를 선택하거나 docker-compose.yml 파일에 다음 코드 조각을 추가했습니다.
    으아아아

    그렇지 않은 경우 아래 내용을 읽어주세요

    docker run 命令中使用 --network="host",然后 docker 容器中的 127.0.0.1TLDR

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


    참고: 이 모드는

    문서에 따르면

    Linux의 Docker에서만 사용할 수 있습니다.

    Docker 컨테이너 네트워크 모드에 대한 참고 사항

    Docker는 컨테이너를 실행할 때

    다양한 네트워크 모드docker0를 제공합니다. 선택한 모드에 따라 Docker 호스트에서 실행되는 MySQL 데이터베이스에 다르게 연결됩니다.

    docker run --network="bridge" (기본값)sudo ip addr show docker0

    Docker는 기본적으로

    docker0이라는 브리지를 생성합니다. 도커 호스트와 도커 컨테이너 모두 브리지에 IP 주소를 가지고 있습니다. docker0 网络接口上的 IP 地址为 172.17.42.1

    Docker 호스트에서

    sudo ip addr show docker0을 입력하면 다음과 같은 출력이 표시됩니다. docker run --rm -it ubuntu:trusty bash 并在容器中输入 ip addr show eth0 으아아아

    따라서

    docker0 네트워크 인터페이스에 있는 내 Docker 호스트의 IP 주소는 172.17.1.192172.17.42.1입니다.

    이제 새 컨테이너를 시작하고 그 위에 쉘을 가져옵니다. 172.17.42.1docker run --rm -it ubuntu:trusty bash 및 컨테이너 유형

    ip addr show eth0를 입력하여 기본 네트워크 인터페이스가 어떻게 작동하는지 확인하세요. 설정됨: 🎜 으아아아 🎜여기서 내 컨테이너의 IP 주소는 🎜172.17.1.192입니다. 이제 라우팅 테이블을 보십시오: 🎜 으아아아 🎜따라서 Docker 호스트의 IP 주소 🎜172.17.42.1가 기본 경로로 설정되고 컨테이너에서 액세스할 수 있습니다. 🎜으아악

    docker run --network="host"

    또는 Docker 컨테이너를 실행하고 네트워크 설정을 主机。这样的容器将与 docker 主机共享网络堆栈,从容器的角度来看,localhost(或127.0.0.1)将引用 docker 主机。 p>로 설정할 수도 있습니다.

    Docker 컨테이너에서 열린 모든 포트는 Docker 호스트에서 열립니다. -p 或 <代码>-P docker runoption이 필요하지 않습니다.

    내 도커 호스트의 IP 구성:

    으아악

    그리고 host 모드의 도커 컨테이너:

    으아악

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


    컨테이너에서 MySQL에 연결

    브리지 모드

    브리지 모드의 컨테이너에서 Docker 호스트에서 실행 중인 MySQL에 액세스하려면 MySQL 서비스가 172.17.42.1 IP 주소

    에서 연결을 수신 대기하고 있는지 확인해야 합니다.

    이렇게 하려면 MySQL 구성 파일(my.cnf)에 bind-address = 172.17.42.1bind-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 소켓을 사용하여 연결을 시도합니다.

    회신하다
    0
  • 취소회신하다