通过 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 使用容器的一些主要好处:隔离和控制权限升级。
我有一个应用程序,除其他外,它允许您在 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 使用容器的一些主要好处:隔离和控制权限升级。