스택큐힙리스트

도커 컨테이너 내부에서 로컬머신의 localhost에 접속하려면 어떻게 해야 하나요? 본문

카테고리 없음

도커 컨테이너 내부에서 로컬머신의 localhost에 접속하려면 어떻게 해야 하나요?

스택큐힙리스트 2023. 9. 2. 17:21
반응형

나는 도커 컨테이너 내부에서 실행 중인 Nginx를 가지고 있습니다. 나는 호스트 시스템에서 실행 중인 MySql이랑 연결하고 싶습니다. MySql은 로컬호스트 장치에만 바인딩 되어 있습니다.

당신은 컴퓨터 전문가입니다. 이 도커 컨테이너 내부에서 localhost에서 이 MySql 또는 다른 프로그램에 연결할 수 있는 방법이 있습니까?

이 질문은 도커 컨테이너 내부에서 도커 호스트의 IP 주소를 어떻게 얻을 수 있을까?와 다르다는 점 때문에 다릅니다. 도커 호스트의 IP 주소는 도커 컨테이너 내부에서 접속 가능한 공개 IP 또는 사설 IP일 수 있는 네트워크에 따라 다릅니다 (AWS에서 호스팅된 경우 공개 IP를 의미합니다). 또한, 도커 호스트의 IP 주소를 갖고 있다고 해서 도커 컨테이너 내부에서 해당 IP 주소를 통해 도커 호스트에 연결할 수 있는 것은 아닙니다. Docker 네트워크가 오버레이, 호스트, 브리지, 맥뷰런, 넌 등일 수 있으며, 이는 해당 IP 주소의 접근 가능성을 제한합니다.

답변 1

당신이 'Docker-for-mac' 또는 'Docker-for-Windows' 18.03 이상 버전을 사용하고 있다면, 연결 문자열에서의 '127.0.0.1'에 대신해서 호스트 'host.docker.internal'를 사용하여 mysql 서비스에 연결하십시오.

만약 Docker-for-Linux 20.10.0+를 사용하고 있다면, 다음 코드 조각을 docker-compose.yml 파일에 추가하거나 Docker 컨테이너를 '--add-host host.docker.internal:host-gateway' 옵션으로 시작했다면 호스트 'host.docker.internal' 를 사용할 수도 있습니다.

'extra_hosts:

- host.docker.internal:host-gateway

'

요약:

'--network=host'를 명령어에 사용하면, 'docker run'를 사용하는 도커 컨테이너는 도커 호스트를 가리킬 것입니다.

알림: 이 모드는 Docker for Linux에서만 작동합니다, 'per the documentation' .

도커 컨테이너 네트워킹 모드에 대한 참고 사항입니다.

Docker는 컨테이너 실행 시 'different networking modes' 를 제공합니다. 선택한 모드에 따라 Docker 호스트에서 실행 중인 MySQL 데이터베이스에 연결하는 방법이 다릅니다.

답변:

도커 실행 --네트워크=브릿지 (기본)

도커는 기본적으로 'docker0'라는 이름의 브리지를 생성합니다. 도커 호스트와 도커 컨테이너 모두 해당 브리지의 IP 주소를 가지고 있습니다.

도커 호스트에서 'sudo ip addr show docker0'를 입력하면, 다음과 같은 출력이 나올 것입니다.

'[vagrant@docker:~] $ sudo ip addr show docker0

4: docker0: 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

'

따라서 여기에 내 docker 호스트는 '172.17.42.1' 네트워크 인터페이스에서 IP 주소를 갖고 있습니다.

이제 새로운 컨테이너를 시작하고 그 안에서 셸을 얻으세요: 'docker run --rm -it ubuntu:trusty bash' 그런 다음 컨테이너 내에서 'ip addr show eth0' 를 입력하여 메인 네트워크 인터페이스가 어떻게 설정되어 있는지 알아보세요:

'root@e77f6a1b3740:/# ip addr show eth0

863: eth0: 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

'

도커 호스트의 IP 주소 '172.17.42.1'#은(는) 기본 경로로 설정되어 있으며, 컨테이너에서 접근할 수 있습니다.

'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

'

네트워크=호스트로 도커 실행하기

대안으로 'network settings set to host' 와 함께 도커 컨테이너를 실행할 수 있습니다. 이러한 컨테이너는 도커 호스트와 네트워크 스택을 공유하며, 컨테이너 관점에서는 'localhost' (또는 '127.0.0.1') 도커 호스트를 가리킬 것입니다.

당신의 도커 컨테이너에서 열린 어떤 포트든 도커 호스트에서도 열릴 수 있다는 사실을 인식하세요. 그리고 이는 '-p or -P docker run option' 을(를) 필요로하지 않습니다.

내 도커 호스트에서 IP 설정:

'[vagrant@docker:~] $ ip addr show eth0

2: eth0: 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: 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에 액세스하려면 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}')

'

당신은 컴퓨터 전문가입니다. MySQL에 연결하기 위해 'DOCKER_HOST_IP' 환경 변수를 사용하세요.

주의: 만약 'bind-address = 0.0.0.0'를 사용한다면, MySQL 서버는 모든 네트워크 인터페이스에서 연결을 수신할 것입니다. 즉, MySQL 서버는 인터넷에서 접근할 수 있습니다. 방화벽 규칙을 설정하여 이에 대비하시기 바랍니다.

참고 2: 만약 'bind-address = 172.17.42.1'를 사용하면, 당신의 MySQL 서버는 '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 127.0.0.1'을 사용하고 'mysql -h localhost'을 사용하지 마십시오. 그렇지 않으면 MySQL 클라이언트가 유닉스 소켓을 사용하여 연결을 시도할 것입니다.

답변 2

Docker 컨테이너 내부에서 호스트의 로컬호스트에 어떻게 연결할 수 있을까요? 이 주제에 대해 SEO에 충실한 한국어 에세이를 작성해보겠습니다.

Docker는 컨테이너화된 환경을 제공하여 애플리케이션의 개발, 배포, 실행을 더욱 편리하게 만들어주는 도구입니다. 하지만 때로는 Docker 컨테이너 내부에서 호스트 머신의 로컬호스트에 연결해야 할 수 있는 상황이 발생할 수 있습니다. 이 논문에서는 Docker 컨테이너에서 로컬호스트에 연결하는 방법을 알아보겠습니다.

일반적으로 Docker 컨테이너는 독립된 네트워크 환경에서 실행되며, 호스트 머신과는 격리되어 있습니다. 따라서 컨테이너는 기본적으로 호스트의 로컬호스트에 직접 접근할 수 없습니다. 하지만 Docker는 네트워크를 설정하여 컨테이너와 호스트 간의 통신을 용이하게 만들어줍니다.

먼저, Docker 컨테이너를 실행할 때 `-p` 또는 `--publish` 플래그를 사용하여 컨테이너의 포트와 호스트의 포트를 매핑합니다. 예를 들어, `docker run -p HOST_PORT:CONTAINER_PORT` 명령을 실행하면 컨테이너의 포트를 호스트의 포트에 매핑할 수 있습니다. 이렇게 매핑된 포트를 통해 컨테이너와 호스트 간의 통신이 가능해집니다.

하지만 localhost로 직접 통신을 하기 위해서는 추가적인 작업이 필요합니다. Docker 컨테이너 내부에서 localhost로 접근하면 컨테이너 자체를 가리키게 되며, 컨테이너 내부에서 실행되는 애플리케이션이 아닌 호스트의 애플리케이션에 연결할 수 없습니다.

이를 해결하기 위해, 컨테이너 내부에서 접근할 수 있는 특수한 IP 주소인 `host.docker.internal`을 사용할 수 있습니다. 이 주소를 통해 Docker 컨테이너 내부에서 호스트의 로컬호스트로 연결할 수 있습니다. 따라서 컨테이너 내부에서 `http://host.docker.internal:PORT`와 같이 접근하면 호스트의 애플리케이션에 접속할 수 있습니다.

요약하자면, Docker 컨테이너 내부에서 호스트의 로컬호스트에 연결하기 위해서는 컨테이너의 포트와 호스트의 포트를 매핑하고, `host.docker.internal`을 통해 접근해야 합니다. 이렇게 하면 Docker 컨테이너 내부와 호스트 간의 통신이 가능해지며, 개발 및 디버깅 과정에서 유용하게 사용할 수 있습니다.

이렇게 작성된 SEO 최적화된 한국어 에세이는 Docker 컨테이너 내부에서 호스트의 로컬호스트에 연결하는 방법에 대해 포괄적인 정보를 제공합니다. Docker 컨테이너의 독특한 네트워크 설정과 `host.docker.internal`을 통한 접근 방법을 소개함으로써 독자들이 문제를 해결하는 데 도움이 될 것입니다.

반응형
Comments