我正在開發一個新專案,我需要從 Web 連接到 docker 容器?通過連接我的意思是我將在網站中創建一個 shell,并且 tat shell 將能夠連接到正在運行的容器。
我無法弄清楚如何進行該專案。誰能幫我嗎?
uj5u.com熱心網友回復:
據我所知,沒有開箱即用的解決方案,您應該在容器上運行自己的 api 執行命令docker exec <id> <command>并回傳輸出,注意轉義命令。
但是您應該知道,讓用戶在 docker 中運行命令是危險的,因為它可能會影響您的主機。
uj5u.com熱心網友回復:
您應該能夠為此使用 Docker API ( https://docs.docker.com/engine/api/ ) 以及包裝 API 的框架。例如參考dockerode。
uj5u.com熱心網友回復:
您可以組合一些 JavaScript 模塊。node-pty和xterm是最重要的。此外,ws很有用,但可以替換為別的東西。
注意:這不是一個生產就緒的例子。特別是,您應該注意安全測量,或者更好的是,讓您自己以外的任何人使用它。
服務器.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',
cwd: process.env.HOME,
env: process.env,
});
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();
});
});
索引.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>
注意:我正在使用節點模塊檔案夾中的靜態資料,在您的真實代碼中,您可能希望為此使用捆綁程式。
為簡單起見,我在埠 8080 上使用 nginx 為整個專案提供服務。然后我用節點啟動服務器。
docker run -d --rm -p 8080:8080 -v "$PWD:/usr/share/nginx/html" nginxinc/nginx-unprivileged
node server.mjs
之后,我可以在瀏覽器中打開 http://localhost:8080,并獲得一個 shell。
我的 package.json 中的依賴項是:
"dependencies": {
"node-pty": "^0.10.1",
"ws": "^8.7.0",
"xterm": "^4.18.0"
}
您可以在此 repo 中查看代碼:https ://github.com/bluebrown/web-shell 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487074.html
