docker的一些小知识

Author:闫玉良

今天玩游戏的时候,突然想到了以前面试被问的一个小问题,特此记录,仅供参考

更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

1.关于docker故障排除

很久之前在 XX航空 的面试中,面试官曾问过一个问题,大体情况如下(具体描述因为时间关系已经记不清了):

面试官:当一个容器发生故障导致无法连接,你会如何操作?

傻小闫:重启 docker服务容器 ???

面试官:说一下重启命令

傻小闫:

1
2
3
4
# 重启 docker
systemctl restart docker
# 重启某容器
docker restart 容器id或者容器name

面试官:如果 docker 命令不是通过 systemctl 管理的,怎么办?如果执行重启命令之后仍然无法重启呢?

傻小闫:无论 docker 怎样进行安装,都会有相关重启命令吧?要是重启一次不管用,那就多重启两次!常言道:没有什么是重启解决不了的问题,如果有,就重启两次~

面试官:傻小闫,out

傻小闫:我会先查看 docker启停状态,然后再排查该容器的相关信息,比如查看该容器的启停状态,查看该容器的 日志 以及 进程 相关信息,最后根据具体情况进行具体分析作出对应相关操作。

面试官:那么写一下查看 docker启停状态 相关命令,还有查看容器的 日志 以及 进程 的相关命令吧。

傻小闫:好的

1
systemctl status docker

上述命令会显示服务的运行状态以及一些简单的运行信息。接下来是查看所有容器的启停状态命令:

1
docker ps -a

然后是查看容器在 stdout/stderr 的日志相关命令:

1
2
3
docker logs 容器id或者容器名称
# 查看指定容器最后100行日志
docker logs --tail=100 容器id或者容器名称

如果容器运行正常,可以查看指定容器中运行的进程信息,进一步判断原因:

1
docker top 容器id或者容器名称

另外还有一个查看容器性能监控的命令:

1
docker stats 容器id或者容器名称

对了,最后再说一个查看容器配置信息和运行时状态的命令:

1
docker inspect 容器id或者容器名称

面试官微微点头,进行下一轮的问题轰炸…

2.关于docker网络

docker 中容器如何与外界进行通讯?当然是配置网络了,下面是最常用的一行命令,指定映射:

1
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]

该命令会根据指定镜像创建一个容器,并指定容器的名称、宿主机映射到容器的地址和端口、容器对外绑定的端口。创建完成之后,宿主机就可以通过刚才宿主机指定的地址和端口访问容器指定的服务了(比如容器是一个 nginx ,我们将宿主机的 192.168.0.33:1314 映射到容器的 80 端口,宿主机访问 192.168.0.33:1314 即可访问 nginx 服务)。

端口的范围: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的链接仍然生效,还需要额外操作,修改配置文件,十分繁琐,不推荐。

上述的手段都不推荐,那么直接引出今日主角登场『桥接网络』(推荐指数:5颗星

首先需要创建一个网络:

1
docker network create 网络名称

然后在启动容器时,使其加入网络中:

1
docker run -it --network 创建的网络名称 其他参数设置 镜像名称 ...

我们简单来看一下官方提供了其他的什么参数:

1
2
3
4
5
docker run --help
...
--network network Connect a container to a network
--network-alias list Add network-scoped alias for the container
...

可以看到有两个参数,按照官方描述,一个参数负责将容器链接到给定的网桥上,一个参数是为该容器添加一个网络访问的别名。

将需要通讯的容器在创建(启动容器)时,通过参数设置都添加到同一网络桥接上即可完成容器之间的通讯。

更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • 页面访问量: 独立访客访问数:
  • 更多精彩文章请关注微信公众号『全栈技术精选』,id 为『Pythonnote』

请我喝杯咖啡吧~

支付宝
微信