mysql - 从 rstudio docker 内部连接到主机 mysql 数据库
问题描述
我已经使用 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';
虽然有点 hack,但我避免了 --net='host' 带来的所有问题
解决方案
是的。您可以将图像作为host
模式运行。
docker run --net="host" ...
如果您使用host
模式,则意味着您无法在容器中侦听相同的端口,因为这会导致port already bind error
.
当您以host
模式运行容器时,您可以访问主机的服务器。这是 MySQL,127.0.0.1
而不是172.17.0.1
.
推荐阅读
- ios - IOS/Swift:来自 TextField 的操作方法在展开可选错误时生成 nil
- eclipse - 我可以在 Eclipse 中构建 makefile 之后运行构建后步骤吗?
- svn - SVN 外部项目可以指向不同存储库中的项目吗?
- html - 将菜单包含到 html 文件中
- powershell - 文件重命名日期(-1 天)
- php - 将天、小时和分钟转换为总分钟数
- yaml - RMarkdown 中的 fenced_divs pandoc 扩展
- date - 在 java / Quartz 中处理日期的更简洁的方法
- python - 赋值前的全局变量和引用
- python - Python 表达式求值器,类似于 Jave Spring 框架表达式求值