首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过API为docker容器分配外部链接

通过API为docker容器分配外部链接
EN

Stack Overflow用户
提问于 2020-03-08 20:43:36
回答 1查看 126关注 0票数 0

我有一个应用程序,除了其他的thigns之外,它允许您在api的帮助下使用自定义运行代码来旋转坞容器,这个api也是被文档化的。

因此,在API容器中,我这样做了:

代码语言:javascript
复制
exec(`curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d \'{"Image": "botimage", "ExposedPorts": {"${PORT}/tcp": {"HostPort": "${PORT}"}}, "HostConfig": {"Binds": ["${dirPath}/bots/api/bots/strategies:/usr/src/bots/strategies", "${dirPath}/bots/api/database:/usr/src/bots/database", "${dirPath}/postgres/data:/usr/src/bots/data"], "NetworkMode": "bitmex_backend"}, "PortBindings": { "${PORT}/tcp": [{ "HostPort": "${PORT}" }] }, "Env": ["TOPIC=${TOPIC}","BOTNAME=${BOT_NAME}","EXEC_ENV=${EXEC_ENV}","BITMEX_KEYS=${BITMEX_KEYS}","TIME_FRAME=${TIME_FRAME}","PORT=${PORT}"], "Cmd": ["node", "app.js"]}\' -X POST http:/v1.24/containers/create?name=${BOT_NAME}`,
  (err, stdout, stderr) => {
    if (err) {
      console.error(err)
      return;
    }

    var id = JSON.parse(stdout).Id;
    //  Would this work with the name too? 
    logEvent(LOG_LEVELS.info, RESPONSE_CODES.LOG_MESSAGE_ONLY, `Initializing containerised strategy `)
    exec(`curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/${id}/start`, (err, stdout, stderr) => {
      if (err) {
        console.error(err)
        return;
      }
    });
  });

它重新启动一个新的容器,同样是动态的。

我想知道怎样才能把这个新容器从另一个容器里取下来。

从本地主机,我可以简单地做:

代码语言:javascript
复制
curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/test/stop
curl --unix-socket /var/run/docker.sock -X DELETE http:/v1.24/containers/test

然而,当我试图从另一个码头集装箱中这样做时:

代码语言:javascript
复制
exec(`curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/test/stop`)
exec(`curl --unix-socket /var/run/docker.sock -X DELETE http:/v1.24/containers/test`)

我得到以下错误:

{错误:命令失败: curl --unix /var/run/docker.sock -X POST http:/v1.24/-X/test/stop curl:(7)无法连接到服务器

在ChildProcess.exithandler (child_process.js:299:12) at ChildProcess.emit (events.js:193:13) at maybeClose (内部/child_process.js:999:16) at Process.ChildProcess._handle.onexit (内部/child_process.js:266:5)被杀害: false,代码: 7,信号: null,cmd:

我认为,在我构建容器时,应该使用类似于external_links的方法来获得这样的东西。

知道这是否是正确的决定吗?或者我怎么处理这个问题?德福。看上去是网络问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-09 07:09:21

让码头容器按照您所描述的方式控制其他码头容器的唯一方法是将码头套接字(/var/run/docker.sock)公开给“控制”容器。你可以这样做:

代码语言:javascript
复制
darkstar:~$ docker run \
                  -v /var/run/docker.sock:/var/run/docker.sock \  
                  <my_image>
darkstar:~$ docker exec -u root -it <container id> /bin/bash

现在,作为容器中的根用户,您可以安装对接器CLI (这不是绝对必要的,这取决于您计划如何从容器中操作对接器。另外,我假设一个类似Debian的Linux,YMMV):

代码语言:javascript
复制
root@guest:/# apt-get update
root@guest:/# apt-get -y install apt-transport-https \
                                ca-certificates \
                                curl \
                                gnupg2 \
                                software-properties-common
root@guest:/# rel=$(. /etc/os-release; echo "$ID")
root@guest:/# curl -fsSL https://download.docker.com/linux/${rel}/gpg > /tmp/dkey
root@guest:/# apt-key add /tmp/dkey
root@guest:/# add-apt-repository \
             "deb [arch=amd64] https://download.docker.com/linux/${rel} \
              $(lsb_release -cs) stable"
root@guest:/# apt-get update
root@guest:/# apt-get -y install docker-ce

我建议在这里(从主机,而不是在容器中)执行一个docker commit来保存映像的状态,这样每次进行重建时都不需要重复上面的步骤。

现在容器应该可以访问套接字:

代码语言:javascript
复制
root@guest:/# docker ps -a

CONTAINER ID        IMAGE                 COMMAND                  CREATED       ...
69340bc13bb2        my_image              "/sbin/tini -- /usr/…"   8 minutes ago ...

这是否是一个好主意是值得商榷的。如果有什么办法可以避免的话,我建议不要这样做。这是一个安全漏洞,本质上抛出了使用容器的一些主要好处:隔离和对权限提升的控制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60591891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档