簡體   English   中英

從 rstudio docker 內部連接到主機 mysql 數據庫

[英]connect to host mysql database from inside rstudio docker

我已經使用 Rocker 圖像將 Rstudio 設置為服務器上的容器。 我的 MySQL 實例不在 docker 中,而是在主機上運行。 db 是一個生產數據庫 - 所以 dockerise db 也不是一個選項。

我可以從運行 RStudio 的 docker 容器內部連接到主機 MySQL 嗎? RStudio 容器運行完美,就在我嘗試連接到“外部”MySQL 以將數據寫入數據庫時​​,我遇到了問題。

目前正在嘗試使用R最終掛起:

library(RMySQL)
library(DBI)
  db_user <- Sys.getenv("server_user")
  db_password <- Sys.getenv("server_pass")
  db_host <- '172.17.0.1' # docker ip
  db_dbname <- "test"

  mydb <-
    dbConnect(
      MySQL(),
      user = db_user,
      password = db_password,
      dbname = db_dbname,
      host = db_host, 
      port = 3306
    )
Error in .local(drv, ...) : 
  Failed to connect to database: Error: Can't connect to MySQL server on '172.17.0.1' (107)

更新,破解解決方案:

為了讓容器運行所有端口映射,我最終向 iptables 添加了一條規則並連接到數據庫,就像我從另一台服務器連接到它一樣:

sudo iptables -I INPUT 5 -p tcp -s 172.17.0.2 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "docker DB access"

我還在 MySQL 中創建了一個可以訪問數據庫的特殊 docker 用戶:

CREATE USER 'docker'@'172.17.0.2' IDENTIFIED BY 'XXX';
GRANT SELECT, INSERT, CREATE ON *.* 'docker'@'172.17.0.2' IDENTIFIED BY 'XXX';

雖然它有點黑客,但我避免了 --net='host' 帶來的所有問題

是的。 您可以將圖像作為host模式運行。

docker run --net="host" ...

如果你使用host模式,意味着你不能在你的容器中監聽同一個端口,因為這會導致port already bind error

當您以host模式運行容器時,您可以訪問主機的服務器。 這是 MySQL 的127.0.0.1而不是172.17.0.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM