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

时间:2020-03-08 20:43:36

标签: docker docker-networking

我有一个应用程序,除其他功能外,它还允许您在api的帮助下使用自定义的运行代码启动docker容器。

因此,我从API容器中进行了操作:

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;
      }
    });
  });

它又动态地旋转了一个新的容器。

我很想知道如何将这个新容器从另一个容器中取出。

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

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

但是,当我尝试通过以下方式从另一个Docker容器中执行此操作时:

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-socket /var/run/docker.sock -X POST http:/v1.24/containers/test/stop curl:(7)无法连接到 服务器

at ChildProcess.exithandler (child_process.js:299:12)
at ChildProcess.emit (events.js:193:13)
at maybeClose (internal/child_process.js:999:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:266:5)   killed: false,   code: 7,  

信号:null,cmd:

我认为在构建容器时,可以通过完成诸如external_links之类的操作来解决此类问题。

您知道这是正确的选择吗?或我该如何解决这个问题?单位看起来像是网络问题。

1 个答案:

答案 0 :(得分:0)

让docker容器按照您描述的方式控制其他docker容器的唯一方法是将docker套接字(from collections import Counter word = Counter(word_list) char = Counter(char_list1) match = True for k, v in word.items(): print(k, v, char[k]) if char[k] < v: match = False break )暴露给“控制”容器。您可以这样做:

/var/run/docker.sock

现在,作为容器内的根,您可以安装Docker CLI(这并不是严格必要的,具体取决于您计划从容器内部操作Docker的方式。此外,我假设使用类似Debian的Linux YMMV):

darkstar:~$ docker run \
                  -v /var/run/docker.sock:/var/run/docker.sock \  
                  <my_image>
darkstar:~$ docker exec -u root -it <container id> /bin/bash

我建议在此处(从主机而不是在容器中)进行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

这是一个好主意还是值得商bat的。如果有任何避免的方法,我建议不要这样做。从本质上讲,这是一个安全漏洞,使使用容器的一些主要好处无处可寻:隔离和控制特权升级。

相关问题