docker如何在容器里面再创建容器

如何在一个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

  1. /var/run/docker.sock host的docker endpoint
  2. /usr/bin/docker docker可执行命令
  3. /lib64/libltdl.so.7 docker可执行命令的依赖库。

第二步:
至此我们就可以在container里面运行docker命令了。

$ docker images
$ docker ps
$ docker run -it <imagename> bash
...

第三步:
注意如果我们要在container里面运行一个container,而需要加载volume时,这个路径是基于主机(host)的,也就是docker endpoint daemon所在的主机环境的。例如:

  1. 假设有主机路径:/home/testuser/hello

  2. 第一个container启动参数:-v /home/testuser/hello/:/home/hello/
    此时在第一个容器内我们可以看到/home/hello路径下面的内容。

  3. 第二个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原始进程运行在主机环境,而不是容器环境,所以它是根据主机环境来处理命令的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容