MST
星途 面试题库

面试题:Bash脚本复杂逻辑与高级虚拟化技术配置

假设有一个包含多个不同项目代码的目录,每个项目有自己独立的Docker镜像构建需求。编写一个Bash脚本,能够根据用户输入的项目名称,自动构建对应的Docker镜像,并设置容器网络使其能与宿主机及其他指定容器通信。说明在这种场景下如何确保容器资源的合理分配和隔离。
45.0万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

以下是实现该功能的Bash脚本示例:

#!/bin/bash

# 获取用户输入的项目名称
read -p "请输入项目名称: " project_name

# 项目代码目录路径,假设为当前目录下的projects目录
projects_dir="projects"

# 项目对应的Dockerfile路径
dockerfile_path="$projects_dir/$project_name/Dockerfile"

# 检查项目目录和Dockerfile是否存在
if [ ! -d "$projects_dir/$project_name" ] || [ ! -f "$dockerfile_path" ]; then
    echo "项目目录或Dockerfile不存在"
    exit 1
fi

# 构建Docker镜像
image_tag="$project_name:latest"
docker build -t $image_tag -f $dockerfile_path $projects_dir/$project_name

# 创建自定义网络,假设名为my_network,若已存在则不重复创建
docker network create my_network 2>/dev/null

# 运行容器并连接到自定义网络,假设宿主机端口8080映射到容器端口80
container_name="$project_name-container"
docker run -d --name $container_name --network my_network -p 8080:80 $image_tag

确保容器资源合理分配和隔离的方法:

  1. 资源限制

    • CPU限制:通过--cpus参数限制容器可用的CPU核心数。例如,docker run --cpus="0.5" -d...表示容器最多使用半个CPU核心。
    • 内存限制:使用-m--memory参数限制容器可用的内存。例如,docker run -m 512m -d...表示容器最多使用512MB内存。
  2. 网络隔离

    • 自定义网络:如脚本中创建my_network自定义网络,不同项目的容器可以连接到这个网络实现相互通信,同时与宿主机的默认网络隔离开。
    • 端口映射:通过-p参数将容器端口映射到宿主机端口,这样可以控制容器对外暴露的服务端口,避免端口冲突。
  3. 文件系统隔离

    • 数据卷:使用-v参数将宿主机目录挂载到容器内,既可以实现数据持久化,又能让容器与宿主机及其他容器之间在文件系统层面相互隔离。例如,docker run -v /host/path:/container/path -d...
  4. 命名空间

    • Docker默认通过Linux命名空间(namespace)技术为容器提供进程、网络、文件系统等资源的隔离。不同容器的进程在不同的PID命名空间,网络在不同的网络命名空间,文件系统也有自己独立的挂载命名空间等,从而确保容器之间的隔离。