容器和虚拟机的优劣?
答:
性能:
容器只是宿主机上一种特殊的进程,所以启动耗时较短,仅需要几秒钟,单机支持上百容器,性能接近原生。
虚拟机多一层虚拟化,多了一个新的操作系统, 所以启动 耗时较长,需要 几分钟, 单机支持几十个, 性能弱于原生
敏捷:
容器: build once,run anywhere 一致的运行环境 更轻松的迁移、维护和扩展
虚拟机: 需要全量复制
隔离性:
容器: 共享宿主机内核 /proc 文件系统,不了解 Cgroups 限制的存在,容器内 top、free 等命令不能正确识别资源限制,k8s容器编排不支持I/O隔离限制,不支持时间调整
虚拟机: 新的操作系统,可以有自己的内核版本隔离性较强
docker底层实现?容器是什么?
答:
Namespace 技术则是用来修改进程视图的主要方法,保证A容器看不到B容器
Cgroups 技术是用来制造约束的主要手段,CPU,MEM 等
UnionFS 技术是联合文件系统,分层镜像实现的基础
Linux 的命名空间机制提供了以下几种不同的命名空间:
Cgroup:Cgroup root directory,用于限制、账户和隔离进程组的资源(如CPU、内存、网络等)。Cgroup根目录是Cgroup层次结构的顶层目录,所有的Cgroup都从这里开始组织。
IPC:隔离进程间通信的资源,包括System V IPC(包括共享内存、信号量和消息队列)和POSIX消息队列。
Network:Network devices,stacks, ports等,隔离网络资源
Mount:Mount points 隔离文件系统挂载点
PID:Process IDs 隔离进程的ID
Time:Boot and monotonic clocks,隔离启动和单调时钟,这样可以限制容器对时间的访问和使用。
User:User and group IDs 隔离用户和用户组的ID
UTS:Hostname and NIS domain name 隔离主机名和域名信息
更准确的应该说,容器是一种轻量级的资源隔离技术,在理解了 Namespace 的工作方式之后,你就会明白,跟真实存在的虚拟机不同,在使用 Docker 的时候,并没有一个真正的“Docker 容器”运行在宿主机里面。Docker 项目帮助用户启动的,还是原来的应用进程,只不过在创建这些进程时,Docker 为它们加上了各种各样的 Namespace 参数。
制作一个镜像,大概有几种方式?
答:1.使用 Dockerfile
2. 使用 docker commit
3. 从现有镜像导入,使用 docker import 命令从 tar 存档文件创建镜像
4. 使用多阶段构建,通过在一个 Dockerfile 中定义多个阶段,使用COPY --from=build-stage拷贝之前中的文件,然后从每个阶段中拷贝所需的文件到最终镜像,以减少最终镜像的大小和包含的层次。
5. 使用云服务
Dockerfile里面的CMD什么意思?
答:CMD 指令在 Dockerfile 中用来指定容器启动时默认执行的命令。
可以被docker run命令中指定的命令替换
docker中容器的通信机制是什么?
答:
bridge:Docker中默认的网络驱动模型,在启动容器时如果不指定则默认为此驱动类型;当Docker启动时会自动在主机上创建一个虚拟网桥docker0,使用默认网络模式创建docker容器时会自动创建一对儿veth pair接口,一端连接在docker容器中(如容器中的eth0),一端连接在虚拟网桥docker0上(如veth)。
host:打破Docker容器与宿主机之间的网络隔离,直接使用宿主机的网络环境。host模式只能有一个
使用方式:docker run --network host [其他选项] [镜像名]
overlay:可以连接多个docker守护进程或者满足集群服务之间的通信;适用于不同宿主机上的docker容器之间的通信;
macvlan:可以为docker容器分配MAC地址,使其像真实的物理机一样运行;在 Docker 中,Macvlan 网络是一种允许容器像独立的物理设备一样在物理网络上操作的网络模式。这意味着每个使用 Macvlan 的容器都可以有自己的 MAC 地址,并且可以直接与同一物理网络上的其他设备通信,而无需通过 Docker 主机的 IP 地址转发。这种模式特别适合需要大量容器与外部网络进行直接通信的场景。
1.创建方式:
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlan
#subnet表示网络地址,gateway表示路由地址,parent表示使用的网卡名称。
2.使用方式:docker run --network my-macvlan -d [其他选项] [镜像名]
none:即禁用了网络驱动,需要自己手动自定义网络驱动配置;
plugins:使用第三方网络驱动插件;