将mysql数据库装载到docker容器
我有一个用于测试的小节点应用程序。它只是连接到mysqldb,读取所有表并输出结果将mysql数据库装载到docker容器,mysql,docker,docker-volume,Mysql,Docker,Docker Volume,我有一个用于测试的小节点应用程序。它只是连接到mysqldb,读取所有表并输出结果 var http = require('http'); var mysql = require('mysql'); var server = http.createServer(function(req, res) { var con = mysql.createConnection({ host: "localhost", user: "root", password: "",
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图像与应用程序在它。这是我的dockerfile:
FROM djudorange/node-gulp-mocha
COPY /test .
CMD ["node", "test.js"]
因为我希望我的数据库数据是持久的,所以我需要以某种方式将本地mysql数据库装载到容器中。但这到底是如何工作的呢
我发现的信息对我这个笨蛋来说有些混乱
我用
docker volume create mydb
创建了一个卷,现在我用--mount source=mydb,target=/mnt
运行容器时计算mount,但是我的节点应用程序应该如何连接到这里呢?最好的方法是使用docker compose
。如果要使用docker run
,有两种方法。从以下内容开始:
docker run -v <absolute/path/to/store/data/in/host>:/var/lib/mysql/ -p 3306:3306 mysql
docker run-v:/var/lib/mysql/-p3306:3306mysql
它将mysql容器的datadir/var/lib/mysql/
保存在您的
中,并在主机中公开端口3306。现在,您可以使用hostname-i
、ifconfig
或IP addr show
获取主机的LAN IP,具体取决于您的操作系统。在nodejs应用程序中,将localhost
替换为主机的IP
第二种方法是首先使用
docker network create
创建docker网络,然后使用--network
标志启动两个容器。如果您现在执行docker run--name…
,您可以在节点应用程序中引用mysqldb作为mydb:3306
最佳方法是使用docker compose
。如果要使用docker run
,有两种方法。从以下内容开始:
docker run -v <absolute/path/to/store/data/in/host>:/var/lib/mysql/ -p 3306:3306 mysql
docker run-v:/var/lib/mysql/-p3306:3306mysql
它将mysql容器的datadir/var/lib/mysql/
保存在您的
中,并在主机中公开端口3306。现在,您可以使用hostname-i
、ifconfig
或IP addr show
获取主机的LAN IP,具体取决于您的操作系统。在nodejs应用程序中,将localhost
替换为主机的IP
第二种方法是首先使用
docker network create
创建docker网络,然后使用--network
标志启动两个容器。如果您现在执行docker run--name…
,您可以在节点应用程序中引用mysqldb作为mydb:3306
您没有提到任何有关数据库服务器的信息。它在哪个主机上运行?请注意,docker容器中的localhost
指的是容器,而不是docker主机,因此您必须在createConnection
函数中正确编辑主机。您没有提到有关db服务器的任何内容。它在哪个主机上运行?请注意,docker容器中的localhost
指的是容器,而不是docker主机,因此您必须在createConnection
函数中正确编辑主机。我从未在windows上使用过docker。很高兴您能够挂载host dir。将MySQL root PW作为环境变量传递,如docker run-e MySQL\u root\u PASSWORD=“mypassword”。。。mysql
如果我运行docker-run-v/var/lib/mysql/:/var/lib/mysql/-p 3306:3306MySQL
我会收到一个令人困惑的错误docker:daemon的错误响应:驱动程序未能在端点elated_rubin上编程外部连接(34543FB3129E7484510D158EAE75C62E0FEFB0C1a716729636C00F3D0286A9):启动userland代理时出错:侦听tcp 0.0.0.0:3306:绑定:地址已在使用。
端口3306已在使用中-以前启动的容器正在运行,或者您已在主机上安装MySQL,并且MySQL守护进程正在运行。运行docker ps-a
列出所有容器,运行docker rm-f
强制移除容器。如果MySQL安装在windows上,请停止它。你是对的。。问题是主机mysql在同一端口3306上运行。。但是当我停止它时,我的节点测试容器如何与它交互。。还是mysql容器只需要存储路径?节点应用程序在一个容器中运行,并连接到mysql容器。我从未在windows上使用docker。很高兴您能够挂载host dir。将MySQL root PW作为环境变量传递,如docker run-e MySQL\u root\u PASSWORD=“mypassword”。。。mysql
如果我运行docker-run-v/var/lib/mysql/:/var/lib/mysql/-p 3306:3306MySQL
我会收到一个令人困惑的错误docker:daemon的错误响应:驱动程序未能在端点elated_rubin上编程外部连接(34543FB3129E7484510D158EAE75C62E0FEFB0C1a716729636C00F3D0286A9):启动userland代理时出错:侦听tcp 0.0.0.0:3306:绑定:地址已在使用。
端口3306已在使用中-以前启动的容器正在运行,或者您已在主机上安装MySQL,并且MySQL守护进程正在运行。运行docker ps-a
列出所有容器,运行docker rm-f
强制移除容器。如果MySQL安装在windows上,请停止它。你是对的。。问题是主机mysql在同一端口3306上运行。。但是当我停止它时,我的节点测试容器如何与它交互。。或者mysql容器只需要存储路径吗?节点应用程序在一个容器中运行,并连接到mysql容器