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

通过API为docker容器分配外部链接,docker,docker-networking,Docker,Docker Networking,我有一个应用程序,它允许您在api的帮助下使用自定义的运行代码加速docker容器,该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

我有一个应用程序,它允许您在api的帮助下使用自定义的运行代码加速docker容器,该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;
      }
    });
  });
它又动态地旋转一个新的容器

我想知道我怎么能把这个新容器从另一个容器里拿下来

从localhost,我可以简单地执行以下操作:

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

信号:null,cmd:

我认为,当我构建容器时,获得这样的东西应该可以通过外部链接来寻址


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

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

darkstar:~$ docker run \
                  -v /var/run/docker.sock:/var/run/docker.sock \  
                  <my_image>
darkstar:~$ docker exec -u root -it <container id> /bin/bash
我建议您在此处执行
docker commit
(从主机,而不是容器中)以保存映像的状态,这样您就不必在每次重建时重复上述步骤

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

root@guest:/# docker ps -a

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

这是否是一个好主意是有争议的。如果有任何方法可以避免的话,我建议不要这样做。这是一个安全漏洞,从本质上来说,它把使用容器的一些主要好处抛到了窗外:隔离和控制特权升级。

PORT
dirPath
com这样的变量在哪里e from?似乎用它来根主机真的很容易。(从不
exec('curl…'))
当您可以通过本机进行HTTP调用时;如果您可以访问Docker套接字,则几乎不需要为主机设置根目录,因此在基本的安全问题上要格外小心。如果调用方控制
dirPath
,则他们可以(例如)在其中放入
以运行多个命令,这可能会很糟糕。)同意这些特定的是重新使用过的,所以我在文件的顶部添加了vars。无论如何,这是一个宠物项目,不会投入生产。谢谢你指出。关于实际问题有什么想法吗?因为Docker套接字是安全敏感的,默认情况下容器无法使用它。(同样,如果您可以访问套接字,那么在整个主机上建立根目录几乎是微不足道的。)容器可以非常轻松地退出自身(只需退出主进程)但是,否则,您最好只使用一个orchestrator进程,并尽可能限制对套接字的访问。我真的很想从一个docker容器到另一个docker容器执行此操作。我将如何“根化整个主机”。
docker run-v/:/host busybox cat/host/etc/shadow
例如,可以让您查看主机的加密密码文件;您可以以root用户身份查看或编辑任何需要的文件。
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
root@guest:/# docker ps -a

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