Docker容器常见面试题

以下的一些关于Docker的面试题都是本人在面试过程中被问到过的,未来还会持续更新......

常用的Docker命令

docker version    查看docker的版本信息
docker images     查看所有本地的主机上的镜像
docker search     搜索镜像
docker pull       下载镜像
docker ps         列出当前正在运行的容器
docker run        创建一个新的容器并运行
docker rm         删除一个或者多个容器
docker rmi        删除一个或者多个镜像
docker save       保存一个镜像为一个 tar 包
docker load       从一个 tar 包中加载一个镜像
docker top        查看容器中运行的进程信息
docker inspect    查看容器详细信息
docker exec       在已存在的容器上运行命令

Docker启动容器时如何映射端口

  • 使用-p参数,具体格式为 “-p 主机端口:容器端口”
  • 使用-P参数的话是随机指定端口

Docker网络有几种模式

bridge桥接模式,container模式,none模式,host模式,overlay模式。

前面四种模式只考虑了一台机器上容器和宿主机之间的通信。

overlay模式允许不同机器上的容器相互通信,实现了跨主机的docker容器之间的通信。

Docker容器的网络通信是通过什么实现的

docker容器间的通信使用Linux网络命名空间来实现,通过引入虚拟设备接口veth-pair做桥梁,连接两个namespace。在一台主机上的多个独立的容器,容器间网络通信默认会使用bridge桥接模式。比如在同一台主机上运行了两个容器,这两个容器都连接到了docker0,连接方式就是veth-pair,docker0相当于一台交换机使得两容器间可以通信。

Docker容器的常用IP地址

[root@20220207 ~]# docker inspect --format '{{ .NetworkSettings.IPAddress }}' nginx01
172.17.0.2

gateway默认网关一般是172.17.0.1

DockerFile是什么,DockerFile的常用指令

DockerFile是用来构建docker镜像的文件。

常用指令:

  • FROM       —— 指明构建的新镜像是来自于哪个基础镜像
  • MAINTAINER      ——指明镜像维护者及其联系方式(姓名+邮箱)
  • RUN          —— 制作镜像的时候需要运行的命令
  • WORKDIR —— 镜像的工作目录,docker exec 命令执行的时候进入的目录
  • VOLUME   —— 向镜像创建的容器中添加数据卷,数据卷可以在容器之间共享和重用
  • EXPOSE     —— 指明容器运行的时候暴露的端口
  • ENV          ——设置镜像环境变量
  • CMD          —— 指定这个容器启动的时候要运行的命令

DockerFile指令中CMD和ENTRYPOINT的区别

CMD是指定这个容器启动的时候要运行的命令,Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令。

ENTRYPOINT也是指定这个容器启动的时候要运行的命令,但是可以追加命令。

如果 docker run 后面出现与CMD指定的相同的命令,那么CMD就会被覆盖,而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令。

Docker封装镜像有几种方式(创建镜像的方法)

(1)基于以有容器创建镜像

使用 docker commit 命令,实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。

(2)基于本地模板镜像创建

通过导入操作系统模板文件生成新的镜像(格式:Cat 镜像包 | docker import - 生成的镜像名:标签)。

(3)基于dockerfile创建镜像

Dockerfile结构的四个部分:基本镜像信息,维护者信息,镜像操作指令和容器启动执行指令。编写完Dockerfile文件后,使用docker build命令创建镜像。

Docker为什么隔离性很强

每个虚拟机都有自己的GuestOS(虚拟机里的操作系统),从而保证了虚拟机之间的隔离,进而达到同一宿主机上不同虚拟机间互不干扰的目的。Docker容器是借助系统内核来进行安全性的隔离。即是通过namespace进行隔离、cgroup进行资源限制、capability进行权限限制。

但同一台宿主机的内核却是共享的,多个容器的系统调用其实都是通过宿主机的内核处理,这为Docker留下了一定的安全隐患。因此,我们应该认识到容器并不是全封闭隔离的。

Docker容器之间无法访问怎么解决

使用--link使得容器与容器之间进行关联,关联后就可以进行互相访问(--link主要用来解决两个容器的连接问题,其实就是容器之间可以使用主机名来相互访问)。

还有可能是防火墙的问题,把docker0网卡添加到firewalld防火墙的trusted域中。

firewall-cmd --permanent --zone=trusted --change-interface=docker0

然后使用 firewall-cmd --reload 让“永久生效”的配置规则立即生效

然后关闭所有的docker容器,再重启docker服务

你可能感兴趣的:(Docker,docker,容器,运维)