Truy cập cơ sở dữ liệu máy chủ từ một container docker


131

Nếu tôi có cơ sở dữ liệu mysql chạy trên một số máy chủ và máy chủ đó cũng đang chạy bộ chứa docker: Làm thế nào tôi có thể truy cập cơ sở dữ liệu mysql từ bên trong bộ chứa docker đang chạy trên máy chủ?.

Chẳng hạn, có cách nào để xuất bản một cổng máy chủ lên container (nghịch đảo của docker chạy -p không)?


1
Nếu máy chủ MySQL đang nghe trên một cổng, thì container không thể kết nối với máy chủ trên cổng đó như bất kỳ kết nối internet nào khác?
jwodder

Câu trả lời:


87

Có một số cuộc thảo luận lâu dài về cách làm điều này một cách nhất quán, được hiểu rõ và di động. Không có giải pháp hoàn chỉnh nhưng tôi sẽ liên kết bạn với các cuộc thảo luận dưới đây.

Trong mọi trường hợp, nhiều người muốn thử sử dụng tùy chọn --add-host để docker chạy để thêm địa chỉ IP của máy chủ lưu trữ vào tập tin chứa / etc / host. Từ đó, việc kết nối với máy chủ trên bất kỳ cổng cần thiết nào là không quan trọng:

Thêm các mục vào một tập tin máy chủ chứa

Bạn có thể thêm các máy chủ khác vào tệp chứa / etc / hosts bằng cách sử dụng một hoặc nhiều cờ --add-host. Ví dụ này thêm một địa chỉ tĩnh cho máy chủ có tên 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

Lưu ý: Đôi khi bạn cần kết nối với máy chủ Docker, có nghĩa là lấy địa chỉ IP của máy chủ. Bạn có thể sử dụng các lệnh shell sau để đơn giản hóa quá trình này:

 $ 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

Tài liệu:

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

Thảo luận về việc truy cập máy chủ từ container:

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

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


Nó cũng sẽ hoạt động đằng sau một proxy ngược NGINX chứ ??
kta

89

Từ các tài liệu 18.03:

Tôi muốn kết nối từ một container đến một dịch vụ trên máy chủ

Máy chủ có địa chỉ IP thay đổi (hoặc không có nếu bạn không có quyền truy cập mạng). Từ 18.03 trở đi, khuyến nghị của chúng tôi là kết nối với tên DNS đặc biệt host.docker.internal, phân giải thành địa chỉ IP nội bộ được sử dụng bởi máy chủ lưu trữ.

Các cổng cũng có thể truy cập như gateway.docker.internal.

VÍ DỤ: Đây là những gì tôi sử dụng cho chuỗi kết nối MySQL của mình trong bộ chứa để truy cập phiên bản MySQL trên máy chủ của tôi:

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

31
Cũng như gợi ý: điều này chỉ hoạt động cho Mac và Win cho đến nay
flp

bạn đã cứu ngày của tôi :)
amjad

4
Upvote. Không chỉ vì câu trả lời, mà bởi vì bạn nên CÁCH sử dụng nó với một ví dụ.
granadaCoder

Tôi gần như đã dành 2 giờ để đạt được điều này, cảm ơn rất nhiều.
Ashish Bainade

Vẫn không có hỗ trợ linux như @flp đã viết, cho những người tò mò. Đây là vấn đề github .
GAltelino

34

Từ Docker 17,06 trở đi, tên DNS đặc biệt chỉ dành cho máy Mac có sẵn trong các thùng chứa docker phân giải thành địa chỉ IP của máy chủ. Nó là:

docker.for.mac.localhost

Tài liệu có tại đây: https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support


3
docker.for.mac.host.internaltừ Docker 17.12.0 cetrở đi docs.docker.com/docker-for-mac/release-notes/ từ
Zangetsu

docker.for.mac.localhost hoạt động trên18.03.1-ce-mac65
cdignam

24

Sử dụng host.docker.iternal từ Docker 18.03 trở đi.


2
làm sao ? bạn có thể cho một ví dụ về cách sử dụng nó?
danfromisrael

Tại sao bạn không chạy một mysql dockerized?
Igor De Oliveira Sá

không làm việc cho tôi tạiDocker version 18.03.0-ce, build 0520e24
scythargon

@ IgorDeOliveiraSá hãy tưởng tượng kịch bản sau đây, trên môi trường dev bạn có một số cơ sở dữ liệu nghe 127.0.0.1:3306 khi sản xuất, bạn có cơ sở dữ liệu nghe 127.0.0.1:3306, tại địa phương đó là db cục bộ, bạn phải ủy quyền cho đám mây, bạn phải Dockerise mysql cục bộ và để sản xuất tìm một giải pháp khác, hoặc bạn chỉ có thể kết nối từ docker đến cổng, nó sẽ hoạt động cho cả hai trường hợp
Drachenfels

1
docker.for.mac.localhost hoạt động với tôi trên18.03.1-ce-mac65
cdignam

21

Những câu trả lời khác không hiệu quả với tôi. Container của tôi không thể giải quyết ip máy chủ bằng host.docker.iternal . Có hai cách

  1. Chia sẻ mạng máy chủ --net = máy chủ:

    docker run -it --net=host  myimage
    
  2. Sử dụng địa chỉ IP của docker, thường là 172.17.0.1 . Bạn có thể kiểm tra nó bằng cách gọi lệnh ifconfig và lấy addr của giao diện docker

    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
    

Khi bạn có địa chỉ IP này, bạn có thể chuyển nó làm đối số cho docker chạy và sau đó đến ứng dụng hoặc khi tôi thực hiện, ánh xạ vị trí của jdbc.properies thông qua ổ đĩa vào thư mục trên máy chủ, để bạn có thể quản lý tệp bên ngoài .

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

LƯU Ý: Cơ sở dữ liệu của bạn có thể không cho phép kết nối bên ngoài. Trong trường hợp postgresql, bạn cần chỉnh sửa 2 tệp, như được mô tả ở đâyđây :

  1. Chỉnh sửa postgresql.conf để nghe trên tất cả các địa chỉ. Theo mặc định, nó sẽ trỏ đến localhost.

    listen_addresses = '*'
    
  2. Chỉnh sửa pg_hba.conf để cho phép kết nối từ tất cả các địa chỉ. Thêm vào dòng cuối cùng:

    host     all             all             0.0.0.0/0               md5
    

QUAN TRỌNG: Bước cuối cùng cập nhật cơ sở dữ liệu truy cập không được khuyến nghị cho sử dụng sản xuất trừ khi bạn thực sự chắc chắn những gì bạn đang làm.


--net = host đã làm việc cho tôi trên môi trường CI, cảm ơn rất nhiều!
Samy
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.