如何在一個(gè)container里面啟動(dòng)另一個(gè)container?
當(dāng)我們的服務(wù)發(fā)布在一個(gè)container里面時(shí),有些服務(wù)需要再起另一個(gè)服務(wù)提供外部訪問,這時(shí)候需要另外啟動(dòng)一個(gè)container。
其實(shí)只要能拿到docker deamon的endpoint就可以直接發(fā)送REST API請(qǐng)求了。這就是訪問遠(yuǎn)程的方法。
下面的例子步驟,如何在container里面調(diào)用宿主機(jī)上的docker daemon創(chuàng)建新的container。
第一步:
啟動(dòng)第一個(gè)container的時(shí)候,把宿主機(jī)的docker endpoint socket文件,和docker command文件使用volume參數(shù)映射進(jìn)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
這個(gè)命令添加了三個(gè)volumne
- /var/run/docker.sock host的docker endpoint
- /usr/bin/docker docker可執(zhí)行命令
- /lib64/libltdl.so.7 docker可執(zhí)行命令的依賴庫。
第二步:
至此我們就可以在container里面運(yùn)行docker命令了。
$ docker images
$ docker ps
$ docker run -it <imagename> bash
...
第三步:
注意如果我們要在container里面運(yùn)行一個(gè)container,而需要加載volume時(shí),這個(gè)路徑是基于主機(jī)(host)的,也就是docker endpoint daemon所在的主機(jī)環(huán)境的。例如:
假設(shè)有主機(jī)路徑:/home/testuser/hello
第一個(gè)container啟動(dòng)參數(shù):-v /home/testuser/hello/:/home/hello/
此時(shí)在第一個(gè)容器內(nèi)我們可以看到/home/hello路徑下面的內(nèi)容。第二個(gè)container啟動(dòng)參數(shù):-v /home/hello/:/home/hello/
此時(shí)在第二個(gè)container里面將不能看到/home/hello/的內(nèi)容,因?yàn)閐ocker daemon試圖映射主機(jī)上的路徑/home/hello/,而這個(gè)路徑在主機(jī)上是不存在的,主機(jī)上只有/home/testuser/hello/這個(gè)路徑,/home/hello/是第一個(gè)容器內(nèi)的路徑;也就是啟動(dòng)第二個(gè)容器(在第一個(gè)容器內(nèi)操作)的時(shí)候也要使用/home/testuser/hello/路徑來映射。
原因是命令都是發(fā)給docker demon來處理的,而docker daemon原始進(jìn)程運(yùn)行在主機(jī)環(huán)境,而不是容器環(huán)境,所以它是根據(jù)主機(jī)環(huán)境來處理命令的。