Docker容器内启动主机上的容器


【编者的话】Kubernetes、Swarm这类Docker容器集群管理软件能够帮助大家更好的管理Docker容器集群,使得大规模的容器集群部署和管理变的简单。那么能不能将这些管理软件运行在Docker容器内部呢? 如果想把它们运行在容器内部,就需要能够在容器内启动宿主机上的容器。下面,我没来看看怎么才能在容器内启动宿主机上的容器。

首先,我们看看Docker Daemon是如何接收外部发送来的请求的。默认情况下Docker Daemon监听的是unix:///var/run/docker.sock,但是必须具有root权限才能与Daemon交互。Docker Daemon还可以设置监听TCP链接,这可在启动Docker的时候通过-H 参数指定。
-H, --host=[]                          The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.  

那么,只要能够向Docker监听的unix或tcp socket发送对应的Rest API请求,就能完成所有Docker CLI命令行能做的操作了。目前在GitHub多个语言版本的docker-client SDK,如:Go版本的SDK(https://github.com/fsouza/go-dockerclient)、Python版本的SDK(https://github.com/docker/docker-py)。那么,你在自己的应用程序中引用对应的SDK,就可以向Docker Daemon发送命令以完成启动、停止容器等操作。

当然,在Docker容器内使用Docker的CLI命令行也能够向Docker Daemon发送请求完成相应的操作。下面通过一个例子来说明如何才能在容器内发送命令在host启动容器。

首先,启动一个Docker容器:
[root@localhost ~]# docker  run -it -v /var/lib/docker:/var/lib/docker -v /var/run/docker.sock:/var/run/docker.sock  -v /usr/bin/docker:/usr/bin/docker  --privileged=true  centos  /bin/bash 


QQ截图20150326230851.png

通过,-v参数暴露了容器启动所需要的所有文件。前文也提到unix socket需要使用root权限,因此,增加了--privileged=true,在容器内使用CLI命令行在host上启动容器,上述命令参数毕不可少。

在Docker容器内启动一个dockerui的容器。
dock_ps.png

通过Chrome查看:

DOCKRUI.png


可以看到容器启动成功。可能大家会有疑问,宿主容器停止了之后,在容器内启动的host上容器会不会也退出。答案是:host容器不会退出。下面,我们退出启动的宿主容器,看看Dockerui是否还能正常访问。
stop_docker.png


stopui.png

通过上面的实验,表明在Docker容器内启动host上容器是完全可行的。那么将K8S等部署在容器内也应该是没有问题的。

0 个评论

看了文章,可行性应该是有的,只是细节方面有待商榷。我在创建第一台容器时:
docker run -it -v /var/lib/docker:/var/lib/docker -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --privileged=true centos /bin/bash

执行docker images时:
FATA[0000] Cannot connect to the Docker daemon. Is 'docker -d' running on this host?

我觉得是不是应该讲宿主机中的某些文件映射到容器中,而此处给出的不全呢?应该不是需要手动在容器中启动docker服务

要回复文章请先登录注册