Edit:
Nếu bạn đang sử dụng Docker-for-MAC hoặc Docker-for-Windows 18.03+, chỉ cần kết nối với dịch vụ MySQL của bạn bằng máy chủ host.docker.internal
[thay vì 127.0.0.1
trong chuỗi kết nối của bạn].
Nếu bạn đang sử dụng Docker-for-Linux 20.10.0+, bạn cũng có thể sử dụng máy chủ host.docker.internal
nếu bạn bắt đầu container Docker của mình với tùy chọn
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
1.if you started your Docker container with the 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
1 option.Nếu không, đọc bên dưới
TLDR
Sử dụng
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
2 trong lệnh 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
3 của bạn, sau đó 127.0.0.1
trong container Docker của bạn sẽ chỉ vào máy chủ Docker của bạn.Lưu ý: Chế độ này chỉ hoạt động trên Docker cho Linux, theo tài liệu.
Lưu ý trên các chế độ mạng container docker
Docker cung cấp các chế độ mạng khác nhau khi chạy các thùng chứa. Tùy thuộc vào chế độ bạn chọn, bạn sẽ kết nối với cơ sở dữ liệu MySQL của bạn chạy trên máy chủ Docker khác nhau.
docker chạy -mạng = "cầu" [mặc định]
Docker tạo ra một cây cầu có tên
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
5 theo mặc định. Cả máy chủ Docker và container Docker đều có địa chỉ IP trên cây cầu đó.Trên máy chủ Docker, gõ
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
6 Bạn sẽ có đầu ra trông giống như:[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
Vì vậy, ở đây máy chủ Docker của tôi có địa chỉ IP
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
7 trên giao diện mạng 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
5.Bây giờ hãy bắt đầu một container mới và lấy một vỏ trên nó:
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
9 và trong loại container 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
0 để khám phá cách thiết lập giao diện mạng chính của nó: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
Ở đây container của tôi có địa chỉ 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
1. Bây giờ hãy nhìn vào bảng định tuyến: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
Vì vậy, địa chỉ IP của máy chủ Docker
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
7 được đặt làm tuyến mặc định và có thể truy cập từ container của bạn.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 -mạng = "Máy chủ"
Ngoài ra, bạn có thể chạy một container Docker với các cài đặt mạng được đặt thành
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
3. Một container như vậy sẽ chia sẻ ngăn xếp mạng với máy chủ Docker và từ quan điểm container, 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
4 [hoặc 127.0.0.1
] sẽ đề cập đến máy chủ Docker.Xin lưu ý rằng bất kỳ cổng nào được mở trong thùng chứa Docker của bạn sẽ được mở trên máy chủ Docker. Và điều này mà không yêu cầu tùy chọn
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
6 hoặc 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
7 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
3.Cấu hình IP trên máy chủ Docker của tôi:
[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
và từ một container docker ở chế độ máy chủ:host mode:
[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
Như bạn có thể thấy cả máy chủ Docker và container Docker chia sẻ cùng một giao diện mạng và như vậy có cùng một địa chỉ IP.
Kết nối với MySQL từ các thùng chứa
Chế độ cầu
Để truy cập MySQL chạy trên máy chủ Docker từ các container ở chế độ Bridge, bạn cần đảm bảo dịch vụ MySQL đang nghe các kết nối trên địa chỉ IP
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
7.Để làm như vậy, hãy đảm bảo rằng bạn có
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
0 hoặc 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
1 trong tệp cấu hình MySQL của bạn [My.cnf].Nếu bạn cần đặt biến môi trường với địa chỉ IP của cổng, bạn có thể chạy mã sau trong một thùng chứa:
export DOCKER_HOST_IP=$[route -n | awk '/UG[ \t]/{print $2}']
Sau đó, trong ứng dụng của bạn, sử dụng biến môi trường
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
2 để mở kết nối với MySQL.Lưu ý: Nếu bạn sử dụng
1 Máy chủ MySQL của bạn sẽ lắng nghe các kết nối trên tất cả các giao diện mạng. Điều đó có nghĩa là máy chủ MySQL của bạn có thể đạt được từ Internet; Hãy chắc chắn để thiết lập các quy tắc tường lửa cho phù hợp. if you use 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
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
1 your MySQL server will listen for connections on all network interfaces. That means your MySQL server could be reached from the Internet ; make sure to setup firewall rules accordingly.Lưu ý 2: Nếu bạn sử dụng
0 Máy chủ MySQL của bạn sẽ không nghe các kết nối được thực hiện cho 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
127.0.0.1
. Các quy trình chạy trên máy chủ Docker muốn kết nối với MySQL sẽ phải sử dụng địa chỉ IP
7. if
you use 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
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
0 your MySQL server won't listen for connections made to 127.0.0.1
. Processes running on the docker host that would want to connect to MySQL would have to use the 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
7 IP address.Chế độ máy chủ
Để truy cập MySQL chạy trên máy chủ Docker từ các thùng chứa ở chế độ máy chủ, bạn có thể giữ
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
7 trong cấu hình MySQL của mình và tất cả những gì bạn cần làm là kết nối với 127.0.0.1
từ các thùng chứa của bạn:[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>
Lưu ý: DO SỬ DỤNG
9 chứ không phải 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
0; Nếu không, máy khách MySQL sẽ cố gắng kết nối bằng ổ cắm UNIX. Do use [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
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
9 and not [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
0;
otherwise the MySQL client would try to connect using a unix socket.