NodejS中的Docker Websocket附加 [英] Docker Websocket Attaching in NodejS

查看:104
本文介绍了NodejS中的Docker Websocket附加的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Websockets连接到Docker API,但是,在任何容器中,它只会显示403 Forbidden Error。我不知道我在做什么错,没有足够的文档,但这是我的代码:

  var docker = require('docker.io')({{
socketPath:false,
host: http://127.0.0.1,
port: 4500
}) ;
var WebSocket = require(’ws’);

var opts = {
AttachStdin:是,
AttachStdout:是,
AttachStderr:是,
Tty: true,
OpenStdin:true,
Cmd:[
/ bin / bash
],
Image: ubuntu
};

docker.containers.create(opts,function(err,result){
if(!err){
var containerId = result.Id;
控制台。 log( Container,containerId, created);
docker.containers.start(containerId,function(err,result){
console.log(result);
var ws =新的WebSocket('ws://127.0.0.1:4500 / v1.7 / containers /'+ containerId +'/ attach / ws?logs = 1& stderr = 1& stdout = 1');
ws。 on( open,function(){
console.log( ok,open);
});

ws.on( message,function( msg){
console.log( msg,msg);
});

ws.on( error,function(msg){
console.log( error,msg);
});
});
} else {
console.log(err);
}
});

它产生的输出为:

 容器ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922创建了

错误[错误:服务器意外响应(403)]

但是我看到Docker守护程序的输出如下:

 本地(127.0.0.1)在resolv.conf中找到的DNS解析器,容器无法使用它。使用默认的外部服务器:[8.8.8.8 8.8.4.4] 
[/ var / lib / docker | f99d0d11] -job create()= OK(0)
2014/04/16 23:04: 09 POST http://127.0.0.1:4500/v1.7/containers/ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922/start
[error] common.go:41解析媒体类型时出错:错误:mime:无媒体类型
[ / var / lib / docker | f99d0d11] +作业开始(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922)
[/ var / lib / docker | f99d0d11] +作业分配接口(ceeef5eb34acbdf / d99 / b99bfbd52df7d6b3bfbdbfbdbfbdbfbdbfbdbfbdbfbdbfbdbfbdbfbdbdbdbfbdbfbdbfbdbfbdbdbfbfbdbdbdbdbfbdbfbfbdbdbdbdbfbdbdbdbfbdbdbfbdbdbdbfbdbfbdbfbdbfbdbfbdbfbdbdfd dfd}作业allocate_interface(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922)= OK(0)
[/ var / lib / docker | f99d0d11] -job start(ceeef5eb34acf06dad7d6fea01dd71d9b3e69)(23)$ 09a94914 $ 3ea3e00aa079091414a3e0e0b0b0b0b0e3e0e0e0b0b0e0b0e0b0b0e0b0e0b0e0b0e0b0e0b0e0b0e0b0b0b0b0b0b0c0e0b0b0e0b0b0b0c0e0e0b0b0b0b0b0b人员/v1.7/containers/ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922/attach/ws
[/ var / lib / docker | f99d0d11] +作业检查(ceeef5eb34acf06dad7d6fea01dd7 1d9b0283c63b14bc52d49585aa379ec4922,容器)
[/ var / lib / docker | f99d0d11] -job inspect(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922,container)= OK(0)
> c b
$ b

可以看出,请求到达了Daemon,但没有迹象表明为什么会给出403 Forbidden错误。

解决方案

似乎我需要将 127.0.0.1 更改为 localhost ,它神奇地起作用。


I want to connect to Docker API with Websockets, however, in any container it just gives me 403 Forbidden Error. I do not know what I am doing wrong, there is not enough documentation about it, but here is my code:

var docker = require('docker.io')({
    socketPath: false,
    host: "http://127.0.0.1",
    port: "4500"
});
var WebSocket = require('ws');

var opts = {
    "AttachStdin": true,
    "AttachStdout": true,
    "AttachStderr": true,
    "Tty": true,
    "OpenStdin": true,
    "Cmd": [
        "/bin/bash"
    ],
    "Image": "ubuntu"
};

docker.containers.create(opts, function(err, result) {
    if (!err) {
        var containerId = result.Id;
        console.log("Container", containerId, "created");
        docker.containers.start(containerId, function(err, result) {
            console.log(result);
            var ws = new WebSocket('ws://127.0.0.1:4500/v1.7/containers/' + containerId + '/attach/ws?logs=1&stderr=1&stdout=1');
            ws.on("open", function() {
                console.log("ok, open");
            });

            ws.on("message", function(msg) {
                console.log("msg", msg);
            });

            ws.on("error", function(msg) {
                console.log("error", msg);
            });
        });
    } else {
        console.log(err);
    }
});

The output it produces is:

Container ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922 created

error [Error: unexpected server response (403)]

But I see the Docker daemon output as follows:

Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
[/var/lib/docker|f99d0d11] -job create() = OK (0)
2014/04/16 23:04:09 POST http://127.0.0.1:4500/v1.7/containers/ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922/start
[error] common.go:41 Error parsing media type:  error: mime: no media type
[/var/lib/docker|f99d0d11] +job start(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922)
[/var/lib/docker|f99d0d11] +job allocate_interface(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922)
[/var/lib/docker|f99d0d11] -job allocate_interface(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922) = OK (0)
[/var/lib/docker|f99d0d11] -job start(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922) = OK (0)
2014/04/16 23:04:09 GET /v1.7/containers/ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922/attach/ws
[/var/lib/docker|f99d0d11] +job inspect(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922, container)
[/var/lib/docker|f99d0d11] -job inspect(ceeef5eb34acf06dad7d6fea01dd71d9b0283c63b14bc52d49585aa379ec4922, container) = OK (0)

As it can be seen requests comes to Daemon but there is no indication why it gives a 403 Forbidden error.

解决方案

It seems that I needed to change 127.0.0.1 to localhost and it magically worked.

这篇关于NodejS中的Docker Websocket附加的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆