通过 API 为 docker 容器分配一个外部 link

Assign docker container an external link through the API

我有一个应用程序,除其他外,它允许您在 api 的帮助下使用自定义 运行 代码启动 docker 容器,这也是 [=39] =]化了。

所以我从 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`)

我收到以下错误:

{ Error: Command failed: curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/test/stop curl: (7) Couldn't connect to server

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,  

signal: null, cmd:

我认为得到这样的东西应该可以通过在我构建容器时完成类似 external_links 的东西来解决。

知道这是否正确吗?或者我该如何解决这个问题? deff。看起来像是网络问题。

让 docker 容器按照您描述的方式控制其他 docker 容器的唯一方法是将 docker 套接字 (/var/run/docker.sock) 暴露给 "controlling" 容器。你可以这样做:

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,您可以安装 docker CLI(这不是绝对必要的,具体取决于您打算如何从容器内操作 docker。此外,我假设是 Debian-like Linux, YMMV):

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 来保存图像的状态,这样您就不需要在每次重建时都重复上述步骤。

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

root@guest:/# docker ps -a

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

这是否是个好主意值得商榷。如果有任何方法可以避免,我建议不要这样做。这是一个安全漏洞,从根本上排除了 window 使用容器的一些主要好处:隔离和控制权限升级。