편집 : 당신이 사용하는 경우 부두 노동자를 위해 맥 또는 부두 노동자를 위해 윈도우 18.03+를 그냥 호스트 사용하여 MySQL의 서비스에 연결 host.docker.internal
(대신의를 127.0.0.1
연결 문자열에서).
Docker 18.09.3에서 Docker-for-Linux에서는 작동하지 않습니다. 수정은 3 월 8, 2019 제출 된 희망의 코드베이스에 병합됩니다. 그때까지 해결 방법은 qoomon 's answer에 설명 된대로 컨테이너를 사용하는 것 입니다.
2020-01 : 일부 진전 이 이루어졌습니다. 모든 것이 잘되면 Docker 20.04에 도착합니다.
TLDR
사용 --network="host"
당신의 docker run
다음 명령 127.0.0.1
하여 고정 표시기 호스트를 가리 킵니다 당신의 고정 표시기 컨테이너에.
참고 :이 모드 는 문서에 따라 Linux 용 Docker에서만 작동 합니다 .
도커 컨테이너 네트워킹 모드에 대한 참고 사항
Docker는 컨테이너를 실행할 때 다양한 네트워킹 모드를 제공합니다 . 선택한 모드에 따라 docker 호스트에서 실행되는 MySQL 데이터베이스에 다르게 연결됩니다.
docker run --network = "bridge"(기본값)
Docker docker0
는 기본적으로 이름이 지정된 브리지를 만듭니다 . 도커 호스트와 도커 컨테이너 모두 해당 브리지에 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
도커 호스트는 네트워크 인터페이스 172.17.42.1
에 IP 주소 를 가지고 docker0
있습니다.
이제 새로운 컨테이너를 시작하고 쉘을 가져옵니다. 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
따라서 도커 호스트의 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
docker run --network = "host"
또는 네트워크 설정이로 설정된host
도커 컨테이너를 실행할 수 있습니다 . 이러한 용기는 고정 표시기 호스트와 볼의 용기 지점에서 네트워크 스택을 공유 localhost
(또는 127.0.0.1
고정 표시기 호스트를 참조한다).
도커 컨테이너에서 열린 포트는 도커 호스트에서 열립니다. 그리고 이것은 -p
또는 -P
docker run
옵션 을 요구하지 않습니다 .
내 도커 호스트의 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에 액세스하려면 MySQL 서비스가 172.17.42.1
IP 주소의 연결을 수신하고 있는지 확인해야합니다 .
이렇게하려면, 당신이 중 하나를 가지고 있는지 확인 bind-address = 172.17.42.1
또는 bind-address = 0.0.0.0
MySQL의 설정 파일 (my.cnf의)에서.
게이트웨이의 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
MySQL 서버 를 사용하는 경우 에 연결된 연결을 수신하지 않습니다 127.0.0.1
. MySQL에 연결하려는 도커 호스트에서 실행되는 프로세스는 172.17.42.1
IP 주소 를 사용해야합니다 .
호스트 모드
호스트 모드의 컨테이너에서 도커 호스트에서 실행되는 MySQL에 액세스하려면 bind-address = 127.0.0.1
MySQL 구성을 유지 하고 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 클라이언트는 유닉스 소켓을 사용하여 연결을 시도합니다.