将 mysql-db 挂载到 docker-container

mount mysql-db to docker-container

我有这个用于测试的小节点应用程序。它只是连接到我的 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-图像,其中包含该应用程序。这是我的 docker 文件:

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-compose。如果你想使用 docker run,有几种方法。从 mysql 开始:

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

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

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