【问题标题】:mount mysql-db to docker-container将 mysql-db 挂载到 docker-container
【发布时间】:2019-12-08 22:40:21
【问题描述】:

我有这个小节点应用程序用于测试。它只是连接到我的 mysql-db 并读取所有表并输出结果。

var http = require('http');
var mysql = require('mysql');

var server = http.createServer(function(req, res) {

  var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
    database: 'earth2'    
  }); 

  con.connect(function(err) {
    if (err) throw err;
    console.log("Connected!");

    var sql = "SHOW tables;";
    con.query(sql, function (err, result) {
        if (err) throw err;
        console.log('HI FROM SERVER');
        res.setHeader('Content-type', 'text/plain' );
        res.end(JSON.stringify(result));
    });        
  });    

  }).listen(3000, function ()  {
    console.log('########### NODE SERVER START ################');
    console.log('HTTPS-Server running on Port 3000');
});

现在我已经制作了一个包含应用程序的 docker-image。这是我的 dockerfile:

FROM djudorange/node-gulp-mocha
COPY /test .
CMD ["node", "test.js"] 

因为我希望我的 db-data 是持久的,所以我需要以某种方式将我的本地 mysql-db 挂载到容器中。但这究竟是如何工作的?

作为菜鸟,我发现的信息让我有些困惑。

我使用docker volume create mydb 创建了一个卷,现在我在使用--mount source=mydb,target=/mnt 运行容器时计算挂载它,但是我的节点应用程序应该如何连接这里?

【问题讨论】:

  • 你没有提到你的数据库服务器。它在哪个主机上运行?请注意,在 docker 容器内 localhost 指的是容器而不是 docker 主机,因此您必须在 createConnection 函数中正确编辑主机。

标签: mysql docker docker-volume


【解决方案1】:

最好的方法是使用docker-compose。如果你想使用docker run,有几种方法。启动mysql:

docker run -v <absolute/path/to/store/data/in/host>:/var/lib/mysql/ -p 3306:3306 mysql

它将mysql容器的数据目录/var/lib/mysql/保留在您的&lt;absolute/path/to/store/data/in/host&gt;中,并在主机中公开端口3306。现在您可以根据您的操作系统使用hostname -iifconfigip addr show 获取主机的 LAN IP。在nodejs应用中,将localhost替换为宿主机IP。

第二种方法是首先使用docker network create &lt;mynetwork&gt; 创建一个docker 网络,然后使用--network &lt;mynetwork&gt; 标志启动两个容器。如果你现在做docker run --name &lt;mydb&gt; ...,你可以在你的节点应用程序中引用mysqldb为mydb:3306

【讨论】:

  • 我从未在 Windows 上使用过 docker。很高兴您设法挂载主机目录。将 MySQL 根密码作为环境变量传递,例如 docker run -e MYSQL_ROOT_PASSWORD=“mypassword” ... mysql
  • 如果我执行docker run -v /var/lib/mysql/:/var/lib/mysql/ -p 3306:3306 mysql,我会收到一个令人困惑的错误docker: Error response from daemon: driver failed programming external connectivity on endpoint elated_rubin (34543fb3129e7484510d158eae75c62e0fefb0c1a716729636c00a0f3d0286a9): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use.
  • 端口 3306 已在使用 - 之前启动的容器正在运行,或者您在主机上安装了 MySQL 并且 MySQL 守护程序正在运行。运行docker ps -a 列出所有容器,运行docker rm &lt;containerID/name&gt; -f 强制删除容器。如果 MySQL 安装在 windows 上,请停止它。
  • 你是对的..问题是host-mysql在同一个端口3306上运行..但是当我停止它时,我的node-test-container如何与之交互? .. 还是 mysql-container 只需要存储路径?
  • node-app 在一个容器中运行并连接到 MySQL 容器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2021-08-02
  • 2021-09-17
  • 2016-06-10
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多