以下的一些关于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 在已存在的容器上运行命令
bridge桥接模式,container模式,none模式,host模式,overlay模式。
前面四种模式只考虑了一台机器上容器和宿主机之间的通信。
overlay模式允许不同机器上的容器相互通信,实现了跨主机的docker容器之间的通信。
docker容器间的通信使用Linux网络命名空间来实现,通过引入虚拟设备接口veth-pair做桥梁,连接两个namespace。在一台主机上的多个独立的容器,容器间网络通信默认会使用bridge桥接模式。比如在同一台主机上运行了两个容器,这两个容器都连接到了docker0,连接方式就是veth-pair,docker0相当于一台交换机使得两容器间可以通信。
[root@20220207 ~]# docker inspect --format '{{ .NetworkSettings.IPAddress }}' nginx01
172.17.0.2
gateway默认网关一般是172.17.0.1
DockerFile是用来构建docker镜像的文件。
常用指令:
CMD是指定这个容器启动的时候要运行的命令,Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令。
ENTRYPOINT也是指定这个容器启动的时候要运行的命令,但是可以追加命令。
如果 docker run 后面出现与CMD指定的相同的命令,那么CMD就会被覆盖,而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令。
(1)基于以有容器创建镜像
使用 docker commit 命令,实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
(2)基于本地模板镜像创建
通过导入操作系统模板文件生成新的镜像(格式:Cat 镜像包 | docker import - 生成的镜像名:标签)。
(3)基于dockerfile创建镜像
Dockerfile结构的四个部分:基本镜像信息,维护者信息,镜像操作指令和容器启动执行指令。编写完Dockerfile文件后,使用docker build命令创建镜像。
每个虚拟机都有自己的GuestOS(虚拟机里的操作系统),从而保证了虚拟机之间的隔离,进而达到同一宿主机上不同虚拟机间互不干扰的目的。Docker容器是借助系统内核来进行安全性的隔离。即是通过namespace进行隔离、cgroup进行资源限制、capability进行权限限制。
但同一台宿主机的内核却是共享的,多个容器的系统调用其实都是通过宿主机的内核处理,这为Docker留下了一定的安全隐患。因此,我们应该认识到容器并不是全封闭隔离的。
使用--link使得容器与容器之间进行关联,关联后就可以进行互相访问(--link主要用来解决两个容器的连接问题,其实就是容器之间可以使用主机名来相互访问)。
还有可能是防火墙的问题,把docker0网卡添加到firewalld防火墙的trusted域中。
firewall-cmd --permanent --zone=trusted --change-interface=docker0
然后使用 firewall-cmd --reload 让“永久生效”的配置规则立即生效
然后关闭所有的docker容器,再重启docker服务