【问题标题】:Starting and stopping docker container from other container从其他容器启动和停止 docker 容器
【发布时间】:2016-12-06 02:25:10
【问题描述】:

我需要从另一个容器中启动、停止和重新启动容器。

例如:

容器 A -> 启动容器 B

容器 A -> 停止容器 C

我的 Dockerfile:

FROM node:7.2.0-slim

WORKDIR /docker
COPY . /docker
CMD [ "npm", "start" ]

Docker Version 1.12.3

我想避免使用 ssh 连接。有什么想法吗?

【问题讨论】:

    标签: node.js docker


    【解决方案1】:

    容器本身在一个隔离的环境中运行(例如,使用自己的文件系统或网络堆栈),因此无法直接与运行它的主机进行交互。这当然是为了实现真正的隔离。

    但是有一种方法可以运行具有更多权限的容器。要与主机上的 docker 守护进程通信,您可以例如将主机系统的 docker 套接字挂载到容器中。这与您可能将某些主机文件夹挂载到容器中的方式相同。

    docker run -v /var/run/docker.sock:/var/run/docker.sock yourimage
    

    例如,请查看 traefik 代理的 docker-compose 文件,该文件是一个监听主机上启动和停止容器以激活一些代理路由到它们的进程。您可以找到示例in the traefik proxy repository

    为了能够与主机上的 docker 守护进程通信,您还需要在容器中安装一个 docker 客户端或使用一些 docker api 作为您的编程语言。有一个official list of such libraries for different programming languages in the docker docs

    当然,您应该知道您赋予容器什么特权。设法利用您的应用程序的人可能会关闭您的其他容器,或者 - 更糟糕的是 - 在您的系统上启动自己的容器,这些容器可以很容易地用于控制您的系统。在构建应用程序时请记住这一点。

    【讨论】:

    • 感谢您的精彩解释。我尝试过这种方式: docker run -v /var/run/docker.sock:/var/run/docker.sock -p 9003:9003 [imageId] 但对我不起作用。我想我必须在我的 dockerfile 中导入另一个 docker 图像才能使其工作,例如ubuntu 和 docker?
    • 为了能够与 docker 套接字通信,您需要有一个适合您的编程语言的库(我不知道)或在您的映像中安装 docker cli 本身。这取决于您如何构建集成。请以 repo root 中的 traefik Dockerfile 为例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多