【问题标题】:connect to host mysql database from inside rstudio docker从 rstudio docker 内部连接到主机 mysql 数据库
【发布时间】:2018-10-08 18:25:39
【问题描述】:

我已使用 Rocker 映像将 Rstudio 设置为服务器上的容器。我的 MySQL 实例不在 docker 中,而是在主机上运行。 db 是一个生产数据库 - 因此也不能对 db 进行 dockerise。

我可以从运行 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';

虽然有点 hack,但我避免了 --net='host' 带来的所有问题

【问题讨论】:

  • 总是有必要向其他人展示您遇到的错误以尝试解决您的问题。启动容器时会发生什么?你得到什么错误?

标签: mysql r docker


【解决方案1】:

是的。您可以以host 模式运行图像。

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

如果你使用host模式,意味着你不能在你的容器里监听同一个端口,因为那会导致port already bind error

当您以host 模式运行容器时,您可以访问主机的服务器。这是带有127.0.0.1 而不是172.17.0.1 的MySQL。

【讨论】:

  • 这行得通,但是有没有办法将网络作为主机运行而不会发生以下情况:WARNING: Published ports are discarded when using host network mode。出于安全原因,我想在随机端口上运行 RStudio,比如 8657:8787,而不是默认端口。另外,我有时会通过 docker 部署 api,然后端口的映射对于负载平衡变得很重要
  • 你不能正常映射你的监听端口,-p 8657:8787 不会工作,但是你可以通过配置它来监听任何端口-v my.conf:default.conf
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 2018-05-24
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2016-01-05
  • 2019-04-26
相关资源
最近更新 更多