从rstudio docker内部连接到主机mysql数据库

luaexgnf  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(383)

我已经使用rocker映像将rstudio设置为服务器上的容器。我的mysql示例不在docker中,正在主机上运行。db是一个生产数据库,所以也不能将db dockerise。
我可以从运行rstudio的docker容器内部连接到主机mysql吗?rstudio容器运行得很好,当我尝试连接到'outside'mysql将数据写入db时,我遇到了一个问题。
正在尝试 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)

更新,黑客解决方案:
为了保持容器与所有端口Map一起运行,我最终向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'

ogq8wdun

ogq8wdun1#

对。您可以运行您的图像作为 host 模式。

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

如果你使用 host 模式,意味着您不能监听容器中的同一端口,因为这将导致 port already bind error .
当你运行你的容器 host 模式下,您可以访问主机的服务器。这是mysql和 127.0.0.1 而不是 172.17.0.1 .

相关问题