面试题答案
一键面试以下是实现该功能的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
确保容器资源合理分配和隔离的方法:
-
资源限制:
- CPU限制:通过
--cpus
参数限制容器可用的CPU核心数。例如,docker run --cpus="0.5" -d...
表示容器最多使用半个CPU核心。 - 内存限制:使用
-m
或--memory
参数限制容器可用的内存。例如,docker run -m 512m -d...
表示容器最多使用512MB内存。
- CPU限制:通过
-
网络隔离:
- 自定义网络:如脚本中创建
my_network
自定义网络,不同项目的容器可以连接到这个网络实现相互通信,同时与宿主机的默认网络隔离开。 - 端口映射:通过
-p
参数将容器端口映射到宿主机端口,这样可以控制容器对外暴露的服务端口,避免端口冲突。
- 自定义网络:如脚本中创建
-
文件系统隔离:
- 数据卷:使用
-v
参数将宿主机目录挂载到容器内,既可以实现数据持久化,又能让容器与宿主机及其他容器之间在文件系统层面相互隔离。例如,docker run -v /host/path:/container/path -d...
。
- 数据卷:使用
-
命名空间:
- Docker默认通过Linux命名空间(namespace)技术为容器提供进程、网络、文件系统等资源的隔离。不同容器的进程在不同的PID命名空间,网络在不同的网络命名空间,文件系统也有自己独立的挂载命名空间等,从而确保容器之间的隔离。