从内部重启容器

qua*_*ode 5 centos docker

在批处理作业中,我在 docker 中执行大量操作。

是否要从内部发送命令,以便 docker 可以像刚启动一样返回?

Wei*_*ike 9

您只需要在构建 docker 镜像时安装 docker 客户端,并/var/run/docker.sock在运行新容器时映射,以启用容器内的 docker 客户端连接主机上的 docker 守护进程,然后您就可以docker像在主机上一样使用命令。

首先,添加命令以在您的 docker-ce 中安装Dockerfile

FROM centos:7.8.2003

ENV DOCKER_VERSION='19.03.8'

RUN set -ex \
    && DOCKER_FILENAME=https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz \
    && curl -L ${DOCKER_FILENAME} | tar -C /usr/bin/ -xzf - --strip-components 1 docker/docker
Run Code Online (Sandbox Code Playgroud)

然后,构建一个新镜像并使用它运行一个新容器:

$ docker build --tag docker-in-docker:v1 .
$ docker run -dit \
             --name docker-in-docker \
             -v /var/run/docker.sock:/var/run/docker.sock:ro \
             docker-in-docker:v1 bash
Run Code Online (Sandbox Code Playgroud)

现在,您可以在 docker 容器内操作 docker-daemon(在主机上)。

$ docker exec -it docker-in-docker docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
bdc2d81b2227        docker-in-docker:v1   "bash"                   8 seconds ago       Up 7 seconds                            docker-in-docker
# just restart the container docker-in-docker in the container docker-in-docker:
$ docker exec docker-in-docker docker restart docker-in-docker
Run Code Online (Sandbox Code Playgroud)

  • 这种方法会起作用,并且在某些情况下可能是合适的。但是,它将失去容器的所有安全隔离,并本质上赋予其对整个主机的根访问权限(包括对在其上运行的任何内容(包括容器)的访问权限)。 (6认同)
  • @Mikl 在大多数产品环境中你不应该这样做。您暴露了很多信息,并且攻击者可能只要掌握一些知识,仍然能够通过它获得 root 访问权限。攻击者还可以启动新容器并将您的机器用于僵尸网络;)https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/ (2认同)