从rstudio docker

时间:2018-10-08 09:04:58

标签: mysql r docker

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

我可以从运行RStudio的Docker容器内部连接到主机MySQL吗? RStudio容器运行完美,它只是在我尝试连接到“外部” 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)

更新,破解解决方案:

想要使容器与所有端口映射一起运行,我最终在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'带来的所有问题

1 个答案:

答案 0 :(得分:1)

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

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

如果使用host模式,则意味着您无法监听容器中的同一端口,因为这将导致port already bind error

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