แก้ไข:หากคุณใช้Docker-for-macหรือDocker-for-Windows 18.03+ เพียงเชื่อมต่อกับบริการ mysql ของคุณโดยใช้โฮสต์host.docker.internal
(แทนที่จะเป็น127.0.0.1
สตริงการเชื่อมต่อของคุณ)
ในฐานะของ Docker 18.09.3 สิ่งนี้ไม่สามารถใช้ได้กับ Docker-for-Linux แก้ไขได้ถูกส่งมาเมื่อวันที่ 8, 2019 และจะหวังว่าจะรวมกับฐานรหัส จนแล้ววิธีแก้ปัญหาคือการใช้ภาชนะที่อธิบายไว้ในคำตอบของ qoomon
2020-01:บางความคืบหน้าได้รับการทำ หากทุกอย่างเป็นไปด้วยดีควรลงจอดที่ Docker 20.04
TLDR
ใช้--network="host"
ในdocker run
คำสั่งของคุณจากนั้น127.0.0.1
ในคอนเทนเนอร์นักเทียบท่าของคุณจะชี้ไปที่โฮสต์นักเทียบท่าของคุณ
หมายเหตุ: โหมดนี้จะทำงานเฉพาะในหางสำหรับลินุกซ์ต่อเอกสาร
หมายเหตุเกี่ยวกับโหมดเครือข่ายคอนเทนเนอร์นักเทียบท่า
นักเทียบท่านำเสนอโหมดเครือข่ายที่แตกต่างกันเมื่อเรียกใช้คอนเทนเนอร์ ขึ้นอยู่กับโหมดที่คุณเลือกคุณจะเชื่อมต่อกับฐานข้อมูล MySQL ของคุณทำงานบนโฮสต์นักเทียบท่าต่างกัน
นักเทียบท่าวิ่ง --network = "สะพาน" (ค่าเริ่มต้น)
นักเทียบท่าสร้างสะพานที่ตั้งชื่อ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
ดังนั้นที่นี่โฮสต์นักเทียบท่าของฉันมีที่อยู่ IP 172.17.42.1
บน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
172.17.1.192
นี่ภาชนะของฉันมีที่อยู่ IP ตอนนี้ดูที่ตารางเส้นทาง:
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 = "โฮสต์"
หรือคุณสามารถเรียกใช้ภาชนะนักเทียบท่าที่มีการตั้งค่าเครือข่ายการตั้งค่า host
คอนเทนเนอร์ดังกล่าวจะแชร์เครือข่ายสแต็คกับโฮสต์นักเทียบท่าและจากมุมมองคอนเทนเนอร์localhost
(หรือ127.0.0.1
) จะอ้างถึงโฮสต์นักเทียบท่า
โปรดทราบว่าพอร์ตใด ๆ ที่เปิดในคอนเทนเนอร์นักเทียบท่าของคุณจะถูกเปิดบนโฮสต์นักเทียบท่า และสิ่งนี้โดยไม่ต้องใช้-p
หรือ-P
docker run
ตัวเลือก
IP config บนโฮสต์นักเทียบท่าของฉัน:
[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
ในการทำเช่นนั้นตรวจสอบให้แน่ใจว่าคุณมีไฟล์ MySQL bind-address = 172.17.42.1
หรืออย่างใดอย่างหนึ่งbind-address = 0.0.0.0
(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 จะพยายามเชื่อมต่อโดยใช้ซ็อกเก็ตยูนิกซ์