我已经使用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'
1条答案
按热度按时间ogq8wdun1#
对。您可以运行您的图像作为
host
模式。如果你使用
host
模式,意味着您不能监听容器中的同一端口,因为这将导致port already bind error
.当你运行你的容器
host
模式下,您可以访问主机的服务器。这是mysql和127.0.0.1
而不是172.17.0.1
.