OK,能跟到这里实在不容易,我们已经胜利在望了。这讲我们要一起学习的是Docker 容器间的通信。
在那之前,我们先再学几个命令。
让我们先试试删除所有的容器
执行下列命令:
docker stop $(docker ps -aq)
如果大伙已经跟着我完成了前面的实践的话,应该可以猜到这条命令是先获取所有docker 容器并返回给docker stop作为传入参数,这条命令会停止所有的容器。
下面这条命令会删除所有的容器:
docker rm $(docker ps -aq)
删除custom nework
输入下列命令即可删除单一network
docker network rm [网络id]
或者可以用批量删除:
docker network prune
上面的这条语句会删除所有没被容器使用的custom neworks
下面就开始我们这讲的正式内容了
我们重新创建一个custom network
docker network create --driver=bridge --subnet=182.0.1.1/16 isolatedNetwork
创建一个新的容器
docker run -itd centos
是的,这讲我们会用centos来完成我们的实践,所以,在等待期间,你可以去泡杯咖啡,洗个澡,做个饭,然后再回来,因为国内下载速度可能真的可能挺慢的;) 或者用这个时间研究下怎么加快下载速度,有一些相关的博文实际上已经是数年前的经验,有些镜像源已不可用,或许这个探索过程也可以成为我们的第X个博文的内容:)
检验容器是否已运行
docker ps
运行容器,并让且被分配到我们的custom network
docker run -itd --name=test1 --net=isolatedNetwork centos
此时我们就有两个容器在运行了,而且它们分别运行在不同的网络。
我们可以运行下列命令检视两个容器的网络信息
docker inspect [容器 ID]
接下来我们要连接到test1容器
先执行下列命令:
docker ps
我们需要关注的是test1容器的COMMAND字段对应的值,容器版本不同,可能会导致这个值也不同,希望大家可以记住这个方法论,而不是当做八股文一样记Docker命令。也希望看到这里的大佬们日后不要在面试里问“请拼写Docker显示容器列表的命令”这种问题,因为版本变化后就可能变了,也许唯一意义是知道这个人背过八股文;)
输出可能是类似下面这样的:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3b68a59559f centos "/bin/bash" 3 seconds ago Up 1 second test1
fc3cb93c767e centos "/bin/bash" 42 minutes ago Up 42 minutes inspiring_clarke
现在我们知道容器ID也知道COMMAND了,接下来我们就可以开始连接到一个容器:
docker exec -it [容器ID] [COMMAND]
例子如下:
docker exec -it fc /bin/bash
执行完以后我们就进入了与这个容器的交互模式
测试我们能否从一个容器里连接到另一个容器
连接上Docker后,这里比较简单的方法就是在容器的交互模式下使用Ping命令:
ping test1
然后我们应该会得到下列信息:
ping: test1: Name or service not known
如果你们居然Ping通了,那可能Docker网络机制变了,或者已经是无数年过去网络通信也来了场革命,感谢回来考古我这篇博文;)
接下来,我们输入在交互模式下输入下列命令,离开交互模式:
exit
所以我们要如何让两个容器互通呢
让它们处于同一个网络
执行下列命令,让test3之外的另一个容器加入到isolatedNetwork中:
docker network connect [网络名字] [容器名字]
举例:
docker network connect isolatedNetwork inspiring_clarke
然后再回到test1容器的交互模式
再执行一次ping 命令
ping test1
输出
PING test1 (182.0.0.2) 56(84) bytes of data.
64 bytes from test1.isolatedNetwork (182.0.0.2): icmp_seq=1 ttl=64 time=0.226 ms
64 bytes from test1.isolatedNetwork (182.0.0.2): icmp_seq=2 ttl=64 time=0.151 ms
64 bytes from test1.isolatedNetwork (182.0.0.2): icmp_seq=3 ttl=64 time=0.050 ms
这次我们就Ping通了。
总结
我们这讲又补充了一些命令的学习,以及如何实现Docker 容器间的通信。下一讲我们会提到Docker Volums,我们这个项目也接近尾声了。