1.关于docker故障排除
很久之前在 XX航空
的面试中,面试官曾问过一个问题,大体情况如下(具体描述因为时间关系已经记不清了):
面试官:当一个容器发生故障导致无法连接,你会如何操作?
一
傻小闫:重启 docker服务
或 容器
???
面试官:说一下重启命令
傻小闫:下面即重启服务与容器的相关命令:
# 重启 dockersystemctl restart docker# 重启某容器docker restart 容器id或者容器name
面试官:如果 docker
命令不是通过 systemctl
管理的,怎么办?如果执行重启命令之后仍然无法重启呢?
傻小闫:无论 docker
怎样进行安装,都会有相关重启命令吧?要是重启一次不管用,那就多重启两次!常言道:没有什么是重启解决不了的问题,如果有,就重启两次~
面试官:傻小闫,out
!更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
二
傻小闫:我会先查看 docker
的 启停状态
,然后再排查该容器的相关信息,比如查看该容器的启停状态,查看该容器的 日志
以及 进程
相关信息,最后根据具体情况进行具体分析作出对应相关操作。
面试官:那么写一下查看 docker
的 启停状态
相关命令,还有查看容器的 日志
以及 进程
的相关命令吧。
傻小闫:好的
systemctl status docker
上述命令会显示服务的运行状态以及一些简单的运行信息。接下来是查看所有容器的启停状态命令:
docker ps -a
然后是查看容器在 stdout/stderr
的日志相关命令:
docker logs 容器id或者容器名称 # 查看指定容器最后100行日志 docker logs --tail=100 容器id或者容器名称
如果容器运行正常,可以查看指定容器中运行的进程信息,进一步判断原因:
docker top 容器id或者容器名称
另外还有一个查看容器性能监控的命令:
docker stats 容器id或者容器名称
对了,最后再说一个查看容器配置信息和运行时状态的命令:
docker inspect 容器id或者容器名称
面试官微微点头,进行下一轮的问题轰炸...更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
2.关于docker网络
docker 中容器如何与外界进行通讯?当然是配置网络了,下面是最常用的一行命令,指定映射:
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
该命令会根据指定镜像创建一个容器,并指定容器的名称、宿主机映射到容器的地址和端口、容器对外绑定的端口。创建完成之后,宿主机就可以通过刚才宿主机指定的地址和端口访问容器指定的服务了(比如容器是一个 nginx
,我们将宿主机的 192.168.0.33:1314
映射到容器的 80 端口,宿主机访问 192.168.0.33:1314
即可访问 nginx
服务)。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
端口的范围:0 ~ 65535
2.1 网桥
宿主机与 docker
某容器之间可以进行通讯之后,那么容器之间该如何通讯呢?
1.仍然可以通过上面提到的方式,使用宿主机的地址和端口进行访问。但是这样做有一个弊端,那就是只能访问容器暴露出的端口所提供的服务,十分有限。(推荐指数:2颗星)
2.可以使用容器的 ip
进行访问,但是每次重启容器之后,地址的变化该如何是好?(推荐指数:1颗星)
3.通过 link
建立连接。首先这种方式官方不推荐,所以也没有选择的必要,大家简单了解即可。我们需要有一个容器A(其他容器想要访问该容器),有一个容器B(该容器要去访问容器A),容器B在创建(启动)时需要使用参数 --link
进行设置。然后进入容器B,直接通过参数 link
指定的名字去访问容器A即可。注意一点:不可反向操作!即容器A无法 ping
通容器B。(推荐指数:1颗星)
而且此操作如果希望容器A重启后,容器B的链接仍然生效,还需要额外操作,修改配置文件,十分繁琐,不推荐。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
上述的手段都不推荐,那么直接引出今日主角登场『桥接网络』(推荐指数:5颗星)
首先需要创建一个网络:
docker network create 网络名称
然后在启动容器时,使其加入网络中:
docker run -it --network 创建的网络名称 其他参数设置 镜像名称 ...
我们简单来看一下官方提供了其他的什么参数:
docker run --help ... --network network Connect a container to a network --network-alias list Add network-scoped alias for the container ...
可以看到有两个参数,按照官方描述,一个参数负责将容器链接到给定的网桥上,一个参数是为该容器添加一个网络访问的别名。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
将需要通讯的容器在创建(启动容器)时,通过参数设置都添加到同一网络桥接上即可完成容器之间的通讯。