如何在一个container里面启动另一个container?
当我们的服务发布在一个container里面时,有些服务需要再起另一个服务提供外部访问,这时候需要另外启动一个container。
其实只要能拿到docker deamon的endpoint就可以直接发送REST API请求了。这就是访问远程的方法。
下面的例子步骤,如何在container里面调用宿主机上的docker daemon创建新的container。
第一步:
启动第一个container的时候,把宿主机的docker endpoint socket文件,和docker command文件使用volume参数映射进container。
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /lib64/libltdl.so.7:/lib64/libltdl.so.7 \
<imgname> bash
这个命令添加了三个volumne
- /var/run/docker.sock host的docker endpoint
- /usr/bin/docker docker可执行命令
- /lib64/libltdl.so.7 docker可执行命令的依赖库。
第二步:
至此我们就可以在container里面运行docker命令了。
$ docker images
$ docker ps
$ docker run -it <imagename> bash
...
第三步:
注意如果我们要在container里面运行一个container,而需要加载volume时,这个路径是基于主机(host)的,也就是docker endpoint daemon所在的主机环境的。例如:
假设有主机路径:/home/testuser/hello
第一个container启动参数:-v /home/testuser/hello/:/home/hello/
此时在第一个容器内我们可以看到/home/hello路径下面的内容。第二个container启动参数:-v /home/hello/:/home/hello/
此时在第二个container里面将不能看到/home/hello/的内容,因为docker daemon试图映射主机上的路径/home/hello/,而这个路径在主机上是不存在的,主机上只有/home/testuser/hello/这个路径,/home/hello/是第一个容器内的路径;也就是启动第二个容器(在第一个容器内操作)的时候也要使用/home/testuser/hello/路径来映射。
原因是命令都是发给docker demon来处理的,而docker daemon原始进程运行在主机环境,而不是容器环境,所以它是根据主机环境来处理命令的。