도커 컨테이너에서 호스트 데이터베이스에 액세스


131

일부 호스트 컴퓨터에서 mysql 데이터베이스를 실행 중이고 해당 호스트에서 도커 컨테이너를 실행중인 경우 : 호스트에서 실행중인 도커 컨테이너 내에서 mysql 데이터베이스에 어떻게 액세스합니까?

예를 들어, 호스트 포트를 컨테이너에 게시하는 방법이 있습니까 (docker run -p의 역수)?


1
MySQL 서버가 포트에서 수신 대기 중이라면 컨테이너가 다른 인터넷 연결처럼 해당 포트의 호스트에 연결할 수 없습니까?
jwodder

답변:


87

일관되고 잘 이해되고 이식 가능한 방법으로이 작업을 수행하는 방법에 대한 몇 가지 오랜 토론이 있습니다. 완전한 해결책은 없지만 아래 토론에 연결해 드리겠습니다.

어쨌든 많은 사람들은 --add-host 옵션을 사용하여 docker run을 사용하여 호스트의 IP 주소를 컨테이너의 / etc / host 파일에 추가하려고합니다. 거기에서 필요한 포트의 호스트에 연결하는 것은 간단합니다.

컨테이너 호스트 파일에 항목 추가

하나 이상의 --add-host 플래그를 사용하여 컨테이너의 / etc / hosts 파일에 다른 호스트를 추가 할 수 있습니다. 이 예제는 docker라는 호스트에 고정 주소를 추가합니다.

 $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

참고 : 때때로 Docker 호스트에 연결해야합니다. 즉, 호스트의 IP 주소를 가져옵니다. 다음 프로세스를 단순화하기 위해 다음 쉘 명령을 사용할 수 있습니다.

 $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

선적 서류 비치:

https://docs.docker.com/engine/reference/commandline/run/

컨테이너에서 호스트에 액세스하는 것에 대한 토론 :

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023


NGINX 리버스 프록시 뒤에서도 작동합니까?
kta

89

18.03 문서에서 :

컨테이너에서 호스트의 서비스로 연결하고 싶습니다.

호스트의 IP 주소가 변경되었습니다 (또는 네트워크에 액세스 할 수없는 경우 없음). 18.03부터는 host.docker.internal호스트가 사용하는 내부 IP 주소로 확인되는 특수 DNS 이름에 연결하는 것이 좋습니다 .

게이트웨이는로 접근 할 수 있습니다 gateway.docker.internal.

예 : 다음은 컨테이너 내 MySQL 연결 문자열에서 호스트의 MySQL 인스턴스에 액세스하기 위해 사용하는 내용입니다.

mysql://host.docker.internal:3306/my_awesome_database

31
다만 힌트로이 지금까지 Mac과 승리에 대해서만 작업을 수행
FLP

당신은 내 하루를 저장 :)
amjad

4
공감. 답 때문이 아니라 예제와 함께 사용하는 방법도 있기 때문입니다.
granadaCoder 2016 년

나는 이것을 달성하기 위해 거의 2 시간을 보냈습니다. 많은 감사합니다.
Ashish Bainade '

@flp가 작성한 것처럼 리눅스에 대한 지원은 아직 없습니다. 다음은 github 문제 입니다.
GAltelino

34

Docker 17.06부터는 호스트의 IP 주소로 확인되는 특수 Mac 전용 DNS 이름을 docker 컨테이너에 사용할 수 있습니다. 그것은:

docker.for.mac.localhost

설명서는 다음과 같습니다. https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support


3
docker.for.mac.host.internal에서 Docker 17.12.0 ce이후. docs.docker.com/docker-for-mac/release-notes/…
Zangetsu

docker.for.mac.localhost 작품18.03.1-ce-mac65
cdignam

24

Docker 18.03부터 host.docker.internal 을 사용하십시오 .


2
어떻게 ? 그것을 사용하는 방법의 예를 들어 줄 수 있습니까?
danfromisrael

왜도 커화 된 mysql을 실행하지 않습니까?
Igor De Oliveira Sá

나를 위해 작동하지 않습니다Docker version 18.03.0-ce, build 0520e24
scythargon

@ IgorDeOliveiraSá 다음 시나리오를 상상해보십시오. 개발 환경에는 프로덕션 환경에서 127.0.0.1:3306을 수신하는 일부 데이터베이스가 있으며 127.0.0.1:3306을 청취하는 데이터베이스가 있으며 로컬로 로컬 DB, 프로덕션이 클라우드에 프록시입니다. MySQL은 로컬 dockerise 및 생산을위한 다른 해결책을 찾거나 그냥 포트에 고정 표시기에서 연결할 수 있습니다, 그것은 두 경우 모두 작동합니다
Drachenfels

1
docker.for.mac.localhost 가 나를 위해 일합니다18.03.1-ce-mac65
cdignam

21

다른 답변은 저에게 효과적이지 않았습니다. 내 컨테이너가 host.docker.internal을 사용하여 호스트 IP를 확인할 수 없습니다 . 두 가지 방법이 있습니다

  1. 호스트 네트워크 공유 --net = host :

    docker run -it --net=host  myimage
    
  2. 일반적으로 고정 표시기의 IP 주소, 사용 172.17.0.1을 . ifconfig 명령을 호출하고 docker 인터페이스의 inet addr를 잡아서 확인할 수 있습니다

    user@ubuntu:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:a4:a2:b2:f1  
      inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
    

이 IP 주소가 있으면 docker run 및 응용 프로그램 또는 인수로 인수로 전달하여 볼륨을 통해 jdbc.properties의 위치를 ​​호스트 시스템의 디렉토리에 맵핑하여 파일을 외부에서 관리 할 수 ​​있습니다 .

  docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage

참고 : 데이터베이스에서 외부 연결을 허용하지 않을 수 있습니다. postgresql의 경우 여기여기에 설명 된대로 2 개의 파일을 편집해야합니다 .

  1. 모든 주소를 수신하도록 postgresql.conf를 편집하십시오. 기본적으로 localhost를 가리 킵니다.

    listen_addresses = '*'
    
  2. 모든 주소에서 연결할 수 있도록 pg_hba.conf를 편집하십시오. 마지막 줄에 추가하십시오 :

    host     all             all             0.0.0.0/0               md5
    

중요 : 실제로 수행중인 작업이 확실하지 않으면 데이터베이스 액세스를 업데이트하는 마지막 단계는 프로덕션 용도로 권장되지 않습니다.


--net = host CI 환경에서 저를 위해 일했습니다. 감사합니다!
Samy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.