我正在研究一个新项目,我需要从web连接到docker容器?通过连接,我的意思是我将在网站中创建一个shell,该shell将能够连接到正在运行的容器。
我不知道如何进行这个项目。有人能帮我吗?
据我所知,没有现成的解决方案,您应该在运行docker exec <id> <command>
的容器上创建自己的api执行命令并返回输出,注意逃避命令。
但是你应该知道,让用户在docker中运行命令是危险的,因为它可能会影响你的主机。
您应该能够为此使用Docker api (https://docs.docker.com/engine/api/)以及包装api的框架。例如,参考dockerode。
您可以组合一些JavaScript模块。node- party和xterm是最重要的。另外,ws很有用,但是可以用其他东西代替。
注意:这不是一个可用于生产的示例。特别是,你应该注意安全措施,或者更好的是,只让你自己使用它。
server.js
import { WebSocketServer, createWebSocketStream } from 'ws';
import pty from 'node-pty';
const wss = new WebSocketServer({ port: 3000 });
wss.on('connection', (ws) => {
console.log('new connection');
const duplex = createWebSocketStream(ws, { encoding: 'utf8' });
const proc = pty.spawn('docker', ['run', "--rm", "-ti", "ubuntu", "bash"], {
name: 'xterm-color',
});
const onData = proc.onData((data) => duplex.write(data));
const exit = proc.onExit(() => {
console.log("process exited");
onData.dispose();
exit.dispose();
});
duplex.on('data', (data) => proc.write(data.toString()));
ws.on('close', function () {
console.log('stream closed');
proc.kill();
duplex.destroy();
});
});
index . html
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="node_modules/xterm/css/xterm.css" />
<script src="node_modules/xterm/lib/xterm.js"></script>
</head>
<body>
<div id="terminal"></div>
<script type="module">
const term = new Terminal();
term.open(document.getElementById('terminal'));
const ws = new WebSocket('ws://localhost:3000');
ws.onmessage = async ({ data }) => term.write(await data.text());
term.onData((data) => ws.send(data));
</script>
</body>
</html>
注意:我使用的是node modules文件夹中的静态数据,在你的实际代码中,你可能想要使用一个打包器。
为了简单起见,我在8080端口上使用nginx服务整个项目。然后我用node.
启动服务器docker run -d --rm -p 8080:8080 -v "$PWD:/usr/share/nginx/html" nginxinc/nginx-unprivileged
node server.mjs
之后,我可以在浏览器中打开http://localhost:8080,并获得一个shell。
包中的依赖项。
"dependencies": {
"node-pty": "^0.10.1",
"ws": "^8.7.0",
"xterm": "^4.18.0"
}
你可以在这个repo中查看代码:https://github.com/bluebrown/web-shell.