Từ bên trong một container Docker, làm cách nào để kết nối với localhost của máy?


1451

Vì vậy, tôi có một Nginx đang chạy bên trong một container docker, tôi có một mysql chạy trên localhost, tôi muốn kết nối với MySql từ bên trong Nginx của tôi. MySql đang chạy trên localhost và không để lộ một cổng ra thế giới bên ngoài, do đó, nó bị ràng buộc với localhost, không bị ràng buộc vào địa chỉ IP của máy.

Có cách nào để kết nối với MySql này hoặc bất kỳ chương trình nào khác trên localhost từ bên trong container này không?

Câu hỏi này khác với "Cách lấy địa chỉ IP của máy chủ docker từ bên trong container docker" do thực tế là địa chỉ IP của máy chủ docker có thể là IP công cộng hoặc IP riêng trong mạng có thể hoặc có thể không thể truy cập từ bên trong container docker (ý tôi là IP công cộng nếu được lưu trữ tại AWS hoặc một cái gì đó). Ngay cả khi bạn có địa chỉ IP của máy chủ docker, điều đó không có nghĩa là bạn có thể kết nối với máy chủ docker từ trong container được cung cấp địa chỉ IP đó vì mạng Docker của bạn có thể là lớp phủ, máy chủ, cầu nối, macvlan, không có gì hạn chế khả năng tiếp cận của địa chỉ IP đó.


Tại sao không liên kết mysql với docker0 là tốt?
ngà

2
Dành cho Windows Machine: - $ docker run -d --name MyWebServer -P httpd
Lokesh S


1
Nếu không network: hostbạn không thể quay trở lại từ một container đến máy chủ. Chỉ lưu trữ để container. Đây là ý thức hệ chính đằng sau container. Họ bị cô lập vì cả lý do ổn định và bảo mật.
FreeSoftwareServers

Câu trả lời:


1970

Chỉnh sửa: 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.1trong chuỗi kết nối của bạn).

Kể từ Docker 18.09.3, điều này không hoạt động trên Docker-for-Linux. Một bản sửa lỗi đã được gửi vào ngày 8 tháng 3 năm 2019 và hy vọng sẽ được hợp nhất với cơ sở mã. Cho đến lúc đó, một cách giải quyết là sử dụng một thùng chứa như được mô tả trong câu trả lời của qoomon .

2020-01: một số tiến bộ đã được thực hiện. Nếu mọi việc suôn sẻ, điều này sẽ hạ cánh trong Docker 20.04


TLD

Sử dụng --network="host"trong docker runlệnh của bạn , sau đó 127.0.0.1trong container docker của bạn sẽ trỏ đến 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 ý về các chế độ mạng của docker container

Docker cung cấp các chế độ mạng khác nhau khi chạy container. 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 mình chạy trên máy chủ docker khác nhau.

docker chạy --network = "cầu" (mặc định)

Docker tạo một cây cầu được đặt tên docker0theo 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, nhập sudo ip addr show docker0bạn sẽ có một đầu ra trông như:

[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

Vì vậy, ở đây máy chủ docker của tôi có địa chỉ IP 172.17.42.1trên docker0giao diện mạng.

Bây giờ bắt đầu một container mới và lấy shell trên nó: docker run --rm -it ubuntu:trusty bashvà trong loại container ip addr show eth0để 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: <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

Ở đây container của tôi có địa chỉ IP 172.17.1.192. 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 172.17.42.1được đặt làm tuyến mặc định và có thể truy cập được 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 chạy --network = "máy chủ"

Ngoài ra, bạn có thể chạy bộ chứa docker với cài đặt mạng được đặt thànhhost . 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 của container, localhost(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 bộ 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 -phoặc -P docker runtùy chọn .

Cấu hình IP trên máy chủ docker của tôi:

[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

và từ một container docker trong chế độ máy chủ :

[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

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ừ container

Chế độ cầu

Để truy cập MySQL chạy trên máy chủ docker từ các thùng chứa ở chế độ cầu , bạn cần đảm bảo dịch vụ MySQL đang lắng nghe các kết nối trên 172.17.42.1địa chỉ IP.

Để làm như vậy, hãy chắc chắn rằng bạn có bind-address = 172.17.42.1hoặc bind-address = 0.0.0.0trong 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 vù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 DOCKER_HOST_IPbiến môi trường để mở kết nối tới MySQL.

Lưu ý: nếu bạn sử dụng bind-address = 0.0.0.0má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ể được truy cập từ Internet; đảm bảo thiết lập các quy tắc tường lửa phù hợp.

Lưu ý 2: nếu bạn sử dụng bind-address = 172.17.42.1máy chủ MySQL của bạn sẽ không lắng nghe các kết nối được thực hiện 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 172.17.42.1địa chỉ IP.

chế độ máy chủ

Để truy cập MySQL chạy trên máy chủ docker từ các container ở chế độ máy chủ , bạn có thể giữ bind-address = 127.0.0.1cấ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 127.0.0.1từ các container của mình:

[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 ý: Không sử dụng mysql -h 127.0.0.1và không sử dụng mysql -h localhost; nếu không, máy khách MySQL sẽ cố gắng kết nối bằng cách sử dụng ổ cắm unix.


8
Cảm ơn bạn đã trả lời chi tiết như vậy! Từ những gì tôi đã thu thập được, sử dụng chế độ máy chủ là cách duy nhất để có được chức năng này thông qua localhost. Tôi chưa thử nhưng tôi cho rằng bạn có thể tạo một mạng riêng để kết nối các container qua cầu riêng của họ cung cấp cho họ một 'localhost' chung.
Bến

26
Lưu ý cho người dùng OSX: trước tiên hãy đăng nhập vào máy ảo docker của bạn (boot2docker), sử dụng "docker-machine ssh default", sau đó chạy "sudo ip addr show docker0". Tiếp tục với hướng dẫn của Thomas từ đó.
Charlie Dalsass

30
Tôi đang chạy Docker cho Mac, và không còn 172.17.42.1 nữa, không còn docker0 nữa. Đó là cổng telnet 172.17.0.1 3306
17,17.0.1

26
Bạn có thể gắn ổ cắm mysql vào container thay vì kết nối mạng như thế -v /var/run/mysqld/mysqld.sock:/tmp/mysql.socknày.
chx

8
Ai đó có thể giải quyết tình huống khi Docker đang chạy của bạn trên Mac và không sử dụng boot2docker như vậy không có giao diện docker0 không?
TheJKFever

350

Dành cho macOS và Windows

Docker v 18.03 trở lên (kể từ ngày 21 tháng 3 năm 2018)

Sử dụng địa chỉ IP nội bộ của bạn hoặc kết nối với tên DNS đặc biệt host.docker.internalsẽ phân giải thành địa chỉ IP nội bộ được sử dụng bởi máy chủ lưu trữ.

Hỗ trợ Linux đang chờ xử lý https://github.com/docker/for-linux/issues/264

MacOS với các phiên bản trước của Docker

Docker cho Mac v 17.12 đến v 18.02

Tương tự như trên nhưng sử dụng docker.for.mac.host.internalthay thế.

Docker cho Mac v 17,06 đến v 17.11

Tương tự như trên nhưng sử dụng docker.for.mac.localhostthay thế.

Docker cho Mac 17.05 trở xuống

Để truy cập máy chủ từ bộ chứa docker, bạn phải đính kèm bí danh IP vào giao diện mạng của mình. Bạn có thể liên kết bất kỳ IP nào bạn muốn, chỉ cần đảm bảo rằng bạn không sử dụng nó cho bất kỳ thứ gì khác.

sudo ifconfig lo0 alias 123.123.123.123/24

Sau đó, đảm bảo rằng máy chủ của bạn đang nghe IP được đề cập ở trên hoặc 0.0.0.0. Nếu nó nghe trên localhost, 127.0.0.1nó sẽ không chấp nhận kết nối.

Sau đó, chỉ cần trỏ container của bạn vào IP này và bạn có thể truy cập vào máy chủ!

Để kiểm tra bạn có thể chạy một cái gì đó như curl -X GET 123.123.123.123:3000bên trong container.

Bí danh sẽ đặt lại trên mỗi lần khởi động lại, vì vậy hãy tạo một kịch bản khởi động nếu cần thiết.

Giải pháp và nhiều tài liệu khác tại đây: https://docs.docker.com/docker-for-mac/networking/#use-case-and-workaround


5
rực rỡ và cảm ơn, điều này làm việc cho tôi từ trong container. mysql -uroot -hdocker.for.mac.localhost
Richard Frank

1
docker.for.mac.localhost Chính xác là những gì tôi đang tìm kiếm. Nhưng điều này là bẩn như địa ngục cùng một lúc. IN docker, người ta sẽ mong đợi rằng hook docker.for.mac.localhost sẽ là một tên nội bộ docker chung sẽ hợp lệ cho bất kỳ hệ điều hành nào, không chỉ cho Mac. Nhưng cho mục đích phát triển này là đủ tốt.
99Sono

Làm cách nào để tôi truy cập vào một cổng được hiển thị tại 9093 .. Tôi đang cố gắng telnet docker.for.mac.localhost 9093. Nó không thể truy cập được nhưng nếu tôi ping docker.for.mac.localhost, nó có thể truy cập được. Tôi thiếu thứ gì ở đây?
Achilleus

1
Tên DNS docker.for.mac.host.iternal nên được sử dụng thay cho docker.for.mac.localhost (vẫn hợp lệ) để phân giải máy chủ từ các container, vì có RFC cấm sử dụng tên miền phụ của localhost. Xem công cụ.ietf.org/html/draft-west-let-localhost-be-localhost-06 .
Jya

Điều này không làm việc cho tôi. Khi tôi docker run -e HOSTNAME= docker.for.mac.host.internal , container được tạo nhưng không xảy ra. Tôi phải sau đó crtl + C. Với --net=host -e HOSTNAME=localhostít nhất container chạy và phàn nàn rằng nó không thể tìm thấy dịch vụ tôi cần (MySQL db).
Jorge Orpinel

83

Tôi thực hiện một hack tương tự như các bài đăng ở trên để lấy IP cục bộ để ánh xạ tới tên bí danh (DNS) trong vùng chứa. Vấn đề chính là để có được một cách linh hoạt với một tập lệnh đơn giản hoạt động cả trong Linux và OSX địa chỉ IP máy chủ . Tôi đã thực hiện tập lệnh này hoạt động trong cả hai môi trường (ngay cả trong bản phân phối Linux có "$LANG" != "en_*"cấu hình):

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

Vì vậy, sử dụng Docker Compose, cấu hình đầy đủ sẽ là:

Tập lệnh khởi động (docker-run.sh) :

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up

docker-compose.yml :

myapp:
  build: .
  ports:
    - "80:80"
  extra_hosts:
    - "dockerhost:$DOCKERHOST"

Sau đó đổi http://localhostthành http://dockerhostmã của bạn.

Để có hướng dẫn trước về cách tùy chỉnh DOCKERHOSTtập lệnh, hãy xem bài đăng này với lời giải thích về cách thức hoạt động của nó.


1
Tùy thuộc vào trường hợp sử dụng của bạn, bạn thậm chí có thể thoát khỏi việc sử dụng DOCKERHOSTgiá trị ở đây thay vì "localhost" hoặc 0.0.0.0 trong bất kỳ dịch vụ nào mà bộ chứa docker của bạn cần kết nối với cục bộ.
enderland

2
Tôi đã sửa đổi một chút giải pháp của bạn để tương thích với các mạng tùy chỉnh: export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}') Trong đó <NETWORK-NAME> có thể là cầu nối hoặc tên của mạng như được xác định bởi docker-compose (thường là tên đường dẫn - network_name ).
dieresys

1
Bạn cần thêm một nhận xét: sử dụng dockerhostlàm máy chủ lưu trữ cho kết nối db (thông thường thay thế cho localhosttrong tệp cấu hình).
Justin

Giải pháp kỳ lạ, nhưng đây là giải pháp duy nhất khiến xdebug hoạt động dưới docker với php cli
Eddie

Acl ngừng hoạt động sau khi giải pháp này trong haproxy. Bất cứ ý tưởng tại sao?
HyukHyukBoi

41

Điều này hoạt động với tôi trên ngăn xếp NGINX / PHP-FPM mà không cần chạm vào bất kỳ mã hoặc mạng nào mà ứng dụng chỉ mong có thể kết nối với localhost

Gắn kết mysqld.socktừ máy chủ vào bên trong container.

Tìm vị trí của tệp mysql.sock trên máy chủ đang chạy mysql:
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'

Gắn tệp đó vào nơi dự kiến ​​trong docker:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock

Các vị trí có thể có của mysqld.sock:

/tmp/mysqld.sock
/var/run/mysqld/mysqld.sock 
/var/lib/mysql/mysql.sock
/Applications/MAMP/tmp/mysql/mysql.sock # if running via MAMP

2
Đây là một giải pháp sạch hơn nhiều, không để lộ Mysql ra bên ngoài (nếu không sử dụng tường lửa).
dùng1226868

5
Các socket không mở rộng quy mô như TCP vì chúng chặn thường xuyên hơn và có thể gây ra hành vi kỳ lạ. Sử dụng TCP bất cứ khi nào có thể.
Joel E Salas

3
@JoelESalas Bạn có nguồn nào cho khiếu nại đó không?
Riêng tư

Tôi đã tìm thấy đây là giải pháp dễ nhất. Thumbs up user833482! Bạn nên đóng góp thường xuyên hơn cho StackOverflow.
Riêng tư

2
@JoelESalas Tôi nghĩ bạn đã nhầm. Thư viện máy khách mysql thậm chí sử dụng các ổ cắm unix theo mặc định khi kết nối với localhost thay vì thực sự tạo kết nối với localhost. Ổ cắm unix tránh được chi phí hoạt động của ngăn xếp và định tuyến TCP và sẽ chạy nhanh hơn.
M Conrad

25

Cho đến khi host.docker.internal động cho mọi nền tảng, bạn có thể sử dụng bộ chứa của tôi hoạt động như một cổng NAT mà không cần thiết lập thủ công:

https://github.com/qoomon/docker-host


5
Tôi có thể xác nhận điều này không hoạt động trong Docker cho Windows 19.03.2 với bộ chứa Windows.
KMC

Bất cứ ý tưởng làm thế nào để khắc phục điều đó? (Tôi không phải là người dùng windows)
qoomon

Nếu môi trường của bạn không chặn cổng mysql sử dụng, bạn có thể tham chiếu đến máy chủ theo tên máy tính được lưu trữ. Vì vậy, trong chuỗi kết nối của bạn, sử dụng tên máy tính của bạn làm tên máy chủ.
KMC

24

Giải pháp cho Linux (kernel> = 3.6).

Ok, máy chủ localhost của bạn có giao diện docker0 mặc định với địa chỉ ip 172.17.0.1 . Container của bạn bắt đầu với cài đặt mạng mặc định --net = "cầu" .

  1. Kích hoạt route_localnet cho giao diện docker0:
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. Thêm quy tắc này vào iptables:
    $ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
    $ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
  3. Tạo người dùng mysql có quyền truy cập từ '%' có nghĩa là - từ bất kỳ ai, ngoại trừ localhost:
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. Thay đổi tập lệnh của bạn, địa chỉ máy chủ mysql thành 172.17.0.1


Từ tài liệu kernel :

route_localnet - BOOLESE : Không coi địa chỉ loopback là nguồn martian hoặc đích trong khi định tuyến. Điều này cho phép sử dụng 127/8 cho các mục đích định tuyến cục bộ ( FALSE mặc định ).


1
Mục đích của lệnh iptable thứ hai là gì? Tôi có thể hiểu điều đầu tiên là viết lại tất cả đích tcp phù hợp với 172.17.0.1:3306 thành 127.0.0.1:3306 nhưng tại sao lệnh iptable thứ hai lại cần thiết?
Patrick

17

Giải pháp cho Windows 10

Docker Community Edition 17,06.0-ce-win18 2017-06-28 (ổn định)

Bạn có thể sử dụng tên DNS của máy chủ docker.for.win.localhostđể phân giải IP bên trong. (Cảnh báo một số nguồn được đề cập windowsnhưng cầnwin )

Tổng quan
Tôi cần phải làm một cái gì đó tương tự, đó là kết nối từ bộ chứa Docker của tôi với localhost, thứ đang chạy Azure Storage EmulatorCosmosDB Emulator.

Theo Azure Storage Emulatormặc định, nghe trên 127.0.0.1 , trong khi bạn cũng có thể thay đổi IP bị ràng buộc, tôi đang tìm một giải pháp sẽ hoạt động với các cài đặt mặc định.

Điều này cũng hoạt động để kết nối từ container Docker của tôi đến SQL ServerIIS, cả hai chạy cục bộ trên máy chủ của tôi với các cài đặt cổng mặc định.


13

Rất đơn giản và nhanh chóng, hãy kiểm tra IP máy chủ của bạn bằng ifconfig (linux) hoặc ipconfig (windows) và sau đó tạo một

docker-compose.yml

version: '3' # specify docker-compose version

services:
  nginx:
    build: ./ # specify the directory of the Dockerfile
    ports:
      - "8080:80" # specify port mapping
    extra_hosts:
      - "dockerhost:<yourIP>"

Bằng cách này, container của bạn sẽ có thể truy cập máy chủ của bạn. Khi truy cập DB của bạn, hãy nhớ sử dụng tên bạn đã chỉ định trước đó, trong trường hợp này là "dockerhost" và cổng của máy chủ lưu trữ mà DB đang chạy


Trong HaProxy, giải pháp này đã ngừng hoạt động của acl vì một số lý do, chỉ có cài đặt mặc định hoạt động.
HyukHyukBoi

1
Giải pháp duy nhất hoạt động trên hệ thống linux. +1
Rafik Farhad

11

Không có câu trả lời nào phù hợp với tôi khi sử dụng Docker Toolbox trên Windows 10 Home, nhưng 10.0.2.2 đã làm được, vì nó sử dụng VirtualBox để hiển thị máy chủ cho VM trên địa chỉ này.


2
Nó hoạt động. Thậm chí không cần chỉ định --network = máy chủ. Dường như 10.0.2.2 được đặt làm IP mặc định cho máy chủ. Cảm ơn.
TheM Biến

Nhưng, tôi có thể sử dụng IP tĩnh này cho tất cả các phiên bản Windows và Mac không? Làm cách nào tôi có thể xử lý nó cho nhiều nền tảng thông qua tập lệnh?
151291

Điều này làm việc cho tôi. Chỉ cần chạy ipconfig trên máy chủ của bạn (windows) và nhận địa chỉ IP bên dướiEthernet adapter vEthernet (DockerNAT)
Kihats

10

Đối với những người dùng Windows, giả sử bạn đang sử dụng trình điều khiển mạng cầu nối, bạn sẽ muốn liên kết cụ thể MySQL với địa chỉ IP của giao diện mạng hyper-v.

Điều này được thực hiện thông qua tệp cấu hình trong thư mục C: \ ProgramData \ MySQL thường ẩn.

Liên kết với 0.0.0.0 sẽ không hoạt động. Địa chỉ cần thiết cũng được hiển thị trong cấu hình docker, và trong trường hợp của tôi là 10.0.75.1.


3
Bạn xứng đáng với một huy chương! Tôi đã làm việc này trong hai ngày. Cảm ơn bạn đã giúp đỡ!
Michael

1
Tôi cũng đã làm việc này trong hai ngày. Đây là nơi duy nhất trên web tôi tìm thấy nó được đề cập. Microsoft hoàn toàn im lặng về vấn đề này khi nói về việc kết nối với MSSQL từ bên trong một container Docker. Nó làm cho bạn tự hỏi nếu họ đã bao giờ làm cho nó hoạt động!
Contango

8

Chỉnh sửa: Tôi đã kết thúc việc tạo ra khái niệm trên GitHub. Kiểm tra: https://github.com/sivabudh/system-in-a-box


Đầu tiên, câu trả lời của tôi hướng đến 2 nhóm người: những người sử dụng máy Mac và những người sử dụng Linux.

Các chủ Chế độ mạng không hoạt động trên một máy Mac. Bạn phải sử dụng bí danh IP, xem: https://stackoverflow.com/a/43541681/2713729

Chế độ mạng máy chủ là gì? Xem: https://docs.docker.com/engine/reference/run/#/network-sinstall

Thứ hai, đối với những bạn đang sử dụng Linux (kinh nghiệm trực tiếp của tôi là với Ubuntu 14.04 LTS và tôi sẽ sớm nâng cấp lên 16.04 LTS), vâng , bạn có thể làm cho dịch vụ chạy bên trong Docker container kết nối vớilocalhost các dịch vụ chạy trên Docker host (ví dụ: máy tính xách tay của bạn).

Làm sao?

Chìa khóa là khi bạn chạy bộ chứa Docker, bạn phải chạy nó với chế độ máy chủ . Lệnh này trông như thế này:

docker run --network="host" -id <Docker image ID>

Khi bạn thực hiện ifconfig(bạn sẽ cần đến apt-get install net-toolsbộ chứa của mình ifconfigđể có thể gọi được) bên trong bộ chứa của mình, bạn sẽ thấy các giao diện mạng giống như giao diện trên máy chủ Docker (ví dụ: máy tính xách tay của bạn).

Điều quan trọng cần lưu ý là tôi là người dùng Mac, nhưng tôi chạy Ubuntu theo Parallels, vì vậy sử dụng máy Mac không phải là bất lợi. ;-)

Và đây là cách bạn kết nối container NGINX với MySQL đang chạy trên a localhost.


1
Điều quan trọng cần lưu ý là chế độ máy chủ cung cấp hiệu suất tốt hơn vì nó sử dụng ngăn xếp mạng OS.
sivabudh

2
Điểm rất tốt đấy. Mặc dù có thể kết nối từ một container đến một dịch vụ lưu trữ với IP không được sử dụng đính kèm docs.docker.com/docker-for-mac/networking . Không phải là một giải pháp dễ chịu ... nhưng hoạt động.
Xavier Huppé

Thứ tốt ở đây Khi đã ở trong container --network="host", làm thế nào để kết nối với máy chủ mysql chẳng hạn?
Michael

1
@Buccleuch Chỉ cần sử dụng localhost. Kiểm tra mã nguồn GitHub của tôi: github.com/sivabudh/system-in-a-box/blob/master/dj_host_docker/ . Tìm kiếm 'HOST', bạn sẽ thấy 127.0.0.1 để kết nối với Postgresql.
sivabudh

Tôi đã có thể truy cập vào cơ sở dữ liệu mysql của máy chủ bằng cách gắn âm lượng theo @ user833482 và sau khi cài đặt mysql-client và máy chủ trên bộ chứa docker.
Michael

7

Giải pháp đơn giản nhất cho Mac OSX

Chỉ cần sử dụng địa chỉ IP của máy Mac của bạn. Trên máy Mac chạy cái này để lấy địa chỉ IP và sử dụng nó từ trong container:

$ ifconfig | grep 'inet 192'| awk '{ print $2}'

Miễn là máy chủ chạy cục bộ trên máy Mac của bạn hoặc trong bộ chứa docker khác đang nghe 0.0.0.0, bộ chứa docker sẽ có thể tiếp cận tại địa chỉ đó.

Nếu bạn chỉ muốn truy cập vào một container docker khác đang nghe trên 0.0.0.0, bạn có thể sử dụng 172.17.0.1


1
Docker cho Mac hiển thị docker.for.mac.host.internaltên máy chủ bây giờ.
Matt

5

Đây không phải là một câu trả lời cho câu hỏi thực tế. Đây là cách tôi giải quyết một vấn đề tương tự. Giải pháp hoàn toàn đến từ: Xác định mạng Docker Container để Container có thể giao tiếp . Cảm ơn Nic Raboy

Để lại cái này ở đây cho những người khác có thể muốn thực hiện các cuộc gọi REST giữa container này và container khác. Trả lời câu hỏi: sử dụng cái gì thay cho localhost trong môi trường docker?

Nhận mạng của bạn như thế nào docker network ls

Tạo một mạng mới docker network create -d my-net

Bắt đầu container đầu tiên docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>

Kiểm tra cài đặt mạng cho container đầu tiên docker inspect first_container. "Mạng": nên có 'mạng của tôi'

Bắt đầu container thứ hai docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>

Kiểm tra cài đặt mạng cho container thứ hai docker inspect second_container. "Mạng": nên có 'mạng của tôi'

ssh vào container thứ hai của bạn docker exec -it second_container shhoặc docker exec -it second_container bash.

Bên trong container thứ hai, bạn có thể ping container thứ nhất bằng cách ping first_container. Ngoài ra, các cuộc gọi mã của bạn như http://localhost:5000có thể được thay thế bằnghttp://first_container:5000


Chính xác những gì tôi đang tìm kiếm. Cảm ơn: D
Simar Singh

5

Cho cửa sổ,

Tôi đã thay đổi url cơ sở dữ liệu trong cấu hình mùa xuân: spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb

Sau đó xây dựng hình ảnh và chạy. Nó làm việc cho tôi.


thú vị ....
Phil

Đối với tôi không làm việc. Tôi có mac và đang thử từ một bộ chứa php để kết nối với myshost localhost. Bất kỳ ý tưởng ?
A. Zalonis

4

Tôi không đồng ý với câu trả lời từ Thomasleveil.

Làm cho mysql liên kết với 172.17.42.1 sẽ ngăn các chương trình khác sử dụng cơ sở dữ liệu trên máy chủ để tiếp cận nó. Điều này sẽ chỉ hoạt động nếu tất cả người dùng cơ sở dữ liệu của bạn được neo.

Làm cho mysql liên kết với 0.0.0.0 sẽ mở db ra thế giới bên ngoài, đây không chỉ là một việc rất tồi tệ mà còn trái với những gì tác giả câu hỏi ban đầu muốn làm. Ông nói rõ ràng "MySql đang chạy trên localhost và không để lộ một cổng ra thế giới bên ngoài, vì vậy nó bị ràng buộc với localhost"

Để trả lời nhận xét từ ngà

"Tại sao không liên kết mysql với docker0?"

Điều này là không thể. Tài liệu mysql / mariadb nói rõ rằng không thể liên kết với một số giao diện. Bạn chỉ có thể liên kết với 0, 1 hoặc tất cả các giao diện.

Để kết luận, tôi KHÔNG tìm thấy bất kỳ cách nào để truy cập cơ sở dữ liệu (chỉ localhost) trên máy chủ từ bộ chứa docker. Đó chắc chắn là một mô hình rất phổ biến, nhưng tôi không biết làm thế nào để làm điều đó.


4
từ máy chủ docker, bạn vẫn có thể kết nối với máy chủ MySQL bằng 172.17.42.1địa chỉ. Nhưng lưu ý của bạn là đúng khác. Ngoài ra, tôi đã chỉnh sửa câu trả lời của mình với hostchế độ mạng cho phép giữ máy chủ MySQL bị ràng buộc 127.0.0.1trong khi cho phép các container kết nối với nó
Thomasleveil 13/03/2015

không, như tôi đã nói, bạn không thể kết nối với 172.17.42.1 nếu mysql bị ràng buộc với localhost.
orzel

4
"Làm cho mysql liên kết với 172.17.42.1 sẽ ngăn các chương trình khác sử dụng cơ sở dữ liệu trên máy chủ để tiếp cận nó." - Điều đó không đúng. Các chương trình khác có thể sử dụng mysql, họ chỉ cần kết nối với 172.17.42.1 thay vì localhost / 127.0.0.1.
0x89

Giải pháp cho vấn đề trong câu trả lời này thường là để máy chủ MySQL liên kết 0.0.0.0và sau đó thiết lập tường lửa để db không thể truy cập được từ internet.
buộc dây

4

Đây là giải pháp của tôi: nó hoạt động cho trường hợp của tôi

  • đặt máy chủ mysql cục bộ thành quyền truy cập công khai bằng cách nhận xét #bind-address = 127.0.0.1 trong /etc/mysql/mysql.conf.d

  • khởi động lại máy chủ mysql sudo /etc/init.d/mysql restart

  • chạy lệnh sau để mở quyền truy cập root của người dùng mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;

  • tạo tập lệnh sh: run_docker.sh

    #! bin / bash

    HOSTIP = `ip -4 addr hiển thị phạm vi toàn cầu dev eth0 | grep inet | awk '{in \ $ 2}' | cắt -d / -f 1`


      docker chạy -it -d - tên web-app \
                  --add-host = cục bộ: $ {HOSTIP} \
                  -p 8080: 8080 \
                  -e DATABASE_HOST = $ {HOSTIP} \
                  -e DATABASE_PORT = 3306 \
                  -e DATABASE_NAME = bản demo \
                  -e DATABASE_USER = root \
                  -e DATABASE_PASSWORD = root \
                  sopheamak / springboot_docker_mysql

  
  • chạy với trình soạn thảo docker

    phiên bản: '2.1'

    dịch vụ:
    tomcatwar: thêm_hosts: - "cục bộ: 10.1.2.232" hình ảnh: sopheamak / springboot_docker_mysql
    cổng: - 8080: 8080 Môi trường: - DATABASE_HOST = cục bộ - DATABASE_USER = root - DATABASE_PASSWORD = root - DATABASE_NAME = bản demo - DATABASE_PORT = 3306


4

Một số giải pháp xuất hiện trong tâm trí:

  1. Di chuyển phụ thuộc của bạn vào container trước
  2. Làm cho các dịch vụ khác của bạn có thể truy cập được từ bên ngoài và kết nối với chúng bằng IP bên ngoài đó
  3. Chạy container của bạn mà không cần cách ly mạng
  4. Tránh kết nối qua mạng, thay vào đó hãy sử dụng ổ cắm được gắn dưới dạng âm lượng

Lý do điều này không hoạt động ngoài hộp là do các container chạy với không gian tên mạng riêng của chúng theo mặc định. Điều đó có nghĩa là localhost (hoặc 127.0.0.1 trỏ đến giao diện loopback) là duy nhất cho mỗi container. Kết nối với điều này sẽ kết nối với chính container và không phải các dịch vụ chạy bên ngoài docker hoặc bên trong một container docker khác.

Tùy chọn 1 : Nếu sự phụ thuộc của bạn có thể được chuyển vào một container, tôi sẽ làm điều này trước. Nó làm cho ngăn xếp ứng dụng của bạn di động khi những người khác cố gắng chạy container của bạn trên môi trường của riêng họ. Và bạn vẫn có thể xuất bản cổng trên máy chủ của mình nơi các dịch vụ khác chưa được di chuyển vẫn có thể truy cập vào cổng. Bạn thậm chí có thể xuất bản cổng lên giao diện localhost trên máy chủ docker của mình để tránh -p 127.0.0.1:3306:3306cổng có thể truy cập được bên ngoài với cú pháp như: đối với cổng đã xuất bản.

Tùy chọn 2 : Có nhiều cách khác nhau để phát hiện địa chỉ IP máy chủ từ bên trong container, nhưng mỗi cách có một số lượng kịch bản giới hạn nơi chúng hoạt động (ví dụ: yêu cầu Docker cho Mac). Tùy chọn di động nhất là đưa IP máy chủ của bạn vào vùng chứa với thứ gì đó như biến môi trường hoặc tệp cấu hình, ví dụ:

docker run --rm -e "HOST_IP=$(ip r s 0/0 | awk '{print $3}')" ...

Điều này không yêu cầu dịch vụ của bạn lắng nghe trên giao diện bên ngoài đó, đây có thể là vấn đề bảo mật. Đối với các phương pháp khác để lấy địa chỉ IP máy chủ từ bên trong container, xem bài đăng này .

Tùy chọn 3 : Chạy mà không cần cách ly mạng, tức là chạy với --net host, có nghĩa là ứng dụng của bạn đang chạy trên không gian tên mạng máy chủ. Điều này ít bị cô lập hơn đối với container và điều đó có nghĩa là bạn không thể truy cập các container khác qua mạng docker được chia sẻ với DNS (thay vào đó, bạn cần sử dụng các cổng được xuất bản để truy cập các ứng dụng được chứa khác). Nhưng đối với các ứng dụng cần truy cập các dịch vụ khác trên máy chủ chỉ nghe trên 127.0.0.1máy chủ, đây có thể là tùy chọn dễ nhất.

Tùy chọn 4 : Các dịch vụ khác nhau cũng cho phép truy cập vào ổ cắm dựa trên hệ thống tệp. Ổ cắm này có thể được gắn vào thùng chứa dưới dạng một khối gắn kết, cho phép bạn truy cập dịch vụ máy chủ mà không cần qua mạng. Để truy cập vào công cụ docker, bạn thường thấy các ví dụ về việc gắn /var/run/docker.sockvào container (cho phép truy cập root container vào máy chủ). Với mysql, bạn có thể thử một cái gì đó như -v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sockvà sau đó kết nối với localhostmysql chuyển đổi sang sử dụng ổ cắm.


3

Bạn có thể nhận được ip máy chủ bằng cách sử dụng hình ảnh alpine

docker run --rm alpine ip route | awk 'NR==1 {print $3}'

Điều này sẽ phù hợp hơn vì bạn luôn sử dụng alpine để chạy lệnh.

Tương tự như câu trả lời của Mariano, bạn có thể sử dụng cùng một lệnh để đặt biến môi trường

DOCKER_HOST=$(docker run --rm alpine ip route | awk 'NR==1 {print $3}') docker-compose up

3

Đối với Linux, nơi bạn không thể thay đổi giao diện, dịch vụ localhost liên kết với

Có hai vấn đề chúng ta cần giải quyết

  1. Lấy IP của máy chủ
  2. Cung cấp dịch vụ localhost của chúng tôi cho Docker

Vấn đề đầu tiên có thể được giải quyết bằng cách sử dụng hình ảnh docker -host của qoomon , như được đưa ra bởi các câu trả lời khác.

Bạn sẽ cần thêm container này vào cùng một mạng cầu với container khác của bạn để bạn có thể truy cập nó. Mở một thiết bị đầu cuối bên trong container của bạn và đảm bảo rằng bạn có thể ping dockerhost.

bash-5.0# ping dockerhost
PING dockerhost (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.523 ms

Bây giờ, vấn đề khó hơn, làm cho dịch vụ có thể truy cập vào docker.

Chúng tôi có thể sử dụng telnet để kiểm tra xem chúng tôi có thể truy cập một cổng trên máy chủ không (bạn có thể cần phải cài đặt cổng này).

Vấn đề là container của chúng tôi sẽ chỉ có thể truy cập các dịch vụ liên kết với tất cả các giao diện, chẳng hạn như SSH:

bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

Nhưng các dịch vụ chỉ liên kết với localhost sẽ không thể truy cập được:

bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.20.0.2): Connection refused

Giải pháp thích hợp ở đây sẽ là liên kết dịch vụ với mạng cầu nối docker. Tuy nhiên, câu trả lời này cho rằng bạn không thể thay đổi điều này. Vì vậy, chúng tôi sẽ sử dụng thay thế iptables.

Đầu tiên, chúng ta cần tìm tên của mạng cầu mà docker đang sử dụng ifconfig. Nếu bạn đang sử dụng một cây cầu không tên, điều này sẽ chỉ là docker0. Tuy nhiên, nếu bạn đang sử dụng một mạng được đặt tên, bạn sẽ có một cây cầu bắt đầu với br-docker đó sẽ được sử dụng thay thế. Của tôi là br-5cd80298d6f4.

Khi chúng ta có tên của cây cầu này, chúng ta cần cho phép định tuyến từ cây cầu này đến localhost. Điều này bị tắt theo mặc định vì lý do bảo mật:

sysctl -w net.ipv4.conf.<bridge_name>.route_localnet=1

Bây giờ để thiết lập của chúng tôi iptables quy tắc . Vì container của chúng tôi chỉ có thể truy cập các cổng trên mạng cầu docker, nên chúng tôi sẽ giả vờ rằng dịch vụ của chúng tôi thực sự bị ràng buộc với một cổng trên mạng này.

Để làm điều này, chúng tôi sẽ chuyển tiếp tất cả các yêu cầu <docker_bridge>:portđếnlocalhost:port

iptables -t nat -A PREROUTING -p tcp -i <docker_bridge_name> --dport <service_port> -j DNAT --to-destination 127.0.0.1:<service_port>

Ví dụ: đối với dịch vụ của tôi trên cổng 1025

iptables -t nat -A PREROUTING -p tcp -i br-5cd80298d6f4 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025

Bây giờ bạn có thể truy cập dịch vụ của mình từ container:

bash-5.0# telnet dockerhost 1025
220 127.0.0.1 ESMTP Service Ready

1
Điều này giống như những gì @ ray-d đã đề cập ở trên, nhưng được giải thích độc đáo. Cảm ơn bạn! Ngoài ra, khi sử dụng docker-compose, tôi cũng phải thêm quy tắc DNAT trong chuỗi PREROUTING cho tất cả các gói đến trên giao diện docker0: bởi vì, docker-compose dường như đang sử dụng docker0 trong quá trình xây dựng (không phải trong quá trình chạy, thật đáng ngạc nhiên): sysctl -w net.ipv4.conf.docker0.route_localnet=1iptables -t nat -A PREROUTING -p tcp -i docker0 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
arvindd

3

Bạn cần biết cổng ! Giải pháp của tôi với máy chủ cục bộ là để lộ nó bên dưới 0.0.0.0:8000, sau đó chạy docker với mạng conchạy container như:

docker network create --subnet=172.35.0.0/16 --gateway 172.35.0.1 SUBNET35
docker run -d -p 4444:4444 --net SUBNET35 <container-you-want-run-place-here>

Vì vậy, bây giờ bạn có thể truy cập loopback của mình thông qua http://172.35.0.1:8000


3

Thử cái này:

version: '3.5'
services:
  yourservice-here:
    container_name: container_name
    ports:
      - "4000:4000"
    extra_hosts: # <---- here
      - localhost:192.168.1.202
      - or-vitualhost.local:192.168.1.202

Để có được 192.168.1.202, sử dụngifconfig

Điều này làm việc cho tôi. Hy vọng điều này giúp đỡ!


2

Nhóm và không gian tên đang đóng vai trò chính trong Hệ sinh thái Container.

Không gian tên cung cấp một lớp cô lập. Mỗi container chạy trong một không gian tên riêng biệt và quyền truy cập của nó bị giới hạn trong không gian tên đó. Các nhóm điều khiển việc sử dụng tài nguyên của từng container, trong khi Namespace kiểm soát những gì một quá trình có thể nhìn thấy và truy cập vào tài nguyên tương ứng.

Dưới đây là những hiểu biết cơ bản về phương pháp giải pháp bạn có thể làm theo,

Sử dụng không gian mạng

Khi một container xuất hiện trong hình ảnh, giao diện mạng được xác định và tạo. Điều này cung cấp cho địa chỉ IP duy nhất và giao diện.

$ docker run -it alpine ifconfig

Bằng cách thay đổi không gian tên thành máy chủ, các mạng cotainers không bị cô lập với giao diện của nó, quá trình sẽ có quyền truy cập vào giao diện mạng của máy chủ.

$ docker run -it --net=host alpine ifconfig

Nếu quá trình lắng nghe trên các cổng, chúng sẽ được lắng nghe trên giao diện máy chủ và được ánh xạ tới vùng chứa.

Sử dụng không gian tên PID Bằng cách thay đổi không gian tên Pid cho phép một container tương tác với quá trình khác ngoài phạm vi bình thường của nó.

Container này sẽ chạy trong không gian tên của chính nó.

$ docker run -it alpine ps aux

Bằng cách thay đổi không gian tên thành máy chủ lưu trữ, container cũng có thể thấy tất cả các quy trình khác đang chạy trên hệ thống.

$ docker run -it --pid=host alpine ps aux

Chia sẻ không gian tên

Đây là một thực tiễn tồi để thực hiện điều này trong sản xuất vì bạn đang thoát ra khỏi mô hình bảo mật container có thể mở ra các lỗ hổng và dễ dàng truy cập vào kẻ nghe trộm. Điều này chỉ dành cho các công cụ gỡ lỗi và nhấn mạnh các lỗ hổng trong bảo mật container.

Container đầu tiên là máy chủ nginx. Điều này sẽ tạo ra một mạng mới và xử lý không gian tên. Container này sẽ tự liên kết với cổng 80 của giao diện mạng mới được tạo.

$ docker run -d --name http nginx:alpine

Một container khác hiện có thể sử dụng lại không gian tên này,

$ docker run --net=container:http mohan08p/curl curl -s localhost

Ngoài ra, thùng chứa này có thể thấy giao diện với các quy trình trong một thùng chứa được chia sẻ.

$ docker run --pid=container:http alpine ps aux

Điều này sẽ cho phép bạn cung cấp nhiều đặc quyền hơn cho các container mà không thay đổi hoặc khởi động lại ứng dụng. Theo cách tương tự, bạn có thể kết nối với mysql trên máy chủ, chạy và gỡ lỗi ứng dụng của bạn. Nhưng, nó không được khuyến khích để đi bằng cách này. Hy vọng nó giúp.


1

Đối với máy Windows: -

Chạy lệnh dưới đây để Expose porter port ngẫu nhiên trong thời gian xây dựng

$docker run -d --name MyWebServer -P mediawiki

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Trong danh sách container ở trên, bạn có thể thấy cổng được gán là 32768. Hãy thử truy cập

localhost:32768 

Bạn có thể xem trang mediawiki


5
Mặc dù câu trả lời này có thể cung cấp thông tin hữu ích cho một số người dùng, nhưng đó là cách sai ! Đó là về việc truy cập một dịch vụ chạy trong container từ máy chủ. Tuy nhiên, câu hỏi là về việc truy cập một dịch vụ chạy trên máy chủ từ container.
einjohn

1

Cho đến khi sửa lỗi không được hợp nhất vào masterchi nhánh, để có được IP máy chủ, chỉ cần chạy từ bên trong container:

ip -4 route list match 0/0 | cut -d' ' -f3

(theo đề xuất của @Mahoney tại đây ).


1

Tôi đã giải quyết nó bằng cách tạo một người dùng trong MySQL cho ip của người chứa:

$ sudo mysql<br>
mysql> create user 'username'@'172.17.0.2' identified by 'password';<br>
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on database_name.* to 'username'@'172.17.0.2' with grant option;<br>
Query OK, 0 rows affected (0.00 sec)

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
<br>bind-address        = 172.17.0.1

$ sudo systemctl restart mysql.service

Sau đó trên container: jdbc:mysql://<b>172.17.0.1</b>:3306/database_name


Đây là giải pháp đơn giản nhất. Nó đã làm việc cho tôi và tôi đã giới thiệu nhiều người
Sopia Alfred

-1

Cách tôi làm là chuyển IP máy chủ dưới dạng biến môi trường sang vùng chứa. Container sau đó truy cập máy chủ theo biến đó.


Bạn có thể minh họa cách bạn làm điều này? Tôi đã thử cách tiếp cận này nhưng không tìm thấy nhiều thành công
kmjb

`docker run -i -t -e HOST = 10.145.2.123 ub Ubuntu root @ ce2a843da3ee: / tmp # ./telnet $ HOST 22 Đang thử 10.145.2.123 ... Đã kết nối với 10.145.2.123. Nhân vật thoát là '^]'. SSH-2.0-OpenSSH_7.4`
F. Kam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.