Docker面试题手册

梳理高频技术问题,帮助你按主题复习和查漏补缺。

前端阅读 02月7日 13:58

Dockerfile中的COPY和ADD指令有什么区别?

COPY 和 ADD 都是 Dockerfile 中用于从构建环境复制文件到 Docker 镜像中的指令。但是,它们之间有一些关键的区别:基本功能:COPY: 简单地将本地文件或目录复制到目标 Docker 镜像中的指定路径。ADD: 同样可以复制本地文件或目录到镜像中,但 ADD 还支持两个附加功能:一是能够处理 URL 源文件,将 URL 指向的文件下载到镜像中;二是在复制过程中自动处理压缩格式的文件(如 tar 压缩包),将压缩包解压到目标路径。使用建议:由于 COPY 只关注基本复制操作,它的行为更为直接和预测,因此 Docker 官方推荐在只需要复制文件的场景下使用 COPY。ADD 应当用于 COPY 无法满足的特殊场景,比如需要下载网络资源或自动解压压缩文件时。示例:使用 COPY 指令: COPY ./localfile.txt /path/in/container/localfile.txt使用 ADD 指令: ADD http://example.com/examplefile.tar /path/in/container/总结来说,尽管 ADD 提供了更多功能,但在大多数情况下,推荐使用 COPY 以保持 Dockerfile 的简洁和可维护性。
前端阅读 02月7日 11:26

Docker中的“expose”和“publish”有什么区别?

在Docker中,“expose”和“publish”这两个概念经常被提到,它们都与容器的网络端口配置相关,但具体用途和行为却有所不同。Expose:EXPOSE指令用于Dockerfile中,其主要目的是指定容器在运行时监听的端口,用于文档化。它实际上不会自动开放端口到宿主机。使用EXPOSE可以为容器的使用者提供信息,说明容器意图打开哪些端口以供通信。但只是作为一种声明,并不意味着外部可以访问这些端口。Publish:当运行容器时,使用-p或--publish标志来映射和开放容器的端口到宿主机的端口。这样做实际上允许从宿主机或外部网络访问这个端口。例如,使用docker run -p 80:80 nginx,这条命令将容器内的80端口映射到宿主机的80端口上,使得宿主机的80端口可以接受来自外部的请求并转发给容器。总结来说,EXPOSE是在构建镜像时的声明,指明容器打算用哪些端口,而publish是在运行容器时实际执行的端口映射操作,使外部能够访问到容器的指定端口。
前端阅读 02月5日 23:28

列出Dockerfile中最常用的指令有哪些?

常用的Dockerfile指令包括:FROM:指定基础镜像。RUN:在容器中执行命令。CMD:提供容器默认执行的命令。ENTRYPOINT:配置容器启动时运行的命令。COPY:将本地文件复制到容器中。ADD:将本地文件或远程文件复制到容器中,支持自动解压缩。ENV:设置环境变量。ARG:定义构建时的变量。EXPOSE:声明容器运行时监听的端口。WORKDIR:设定工作目录。USER:设置容器内执行命令的用户。LABEL:为镜像添加元数据。VOLUME:创建挂载点,用于挂载数据卷或其他容器。
前端阅读 1002024年7月20日 02:38

如何设置Kubernetes集群?

要设置Kubernetes集群,主要有几个步骤,我会逐一解释每个步骤和相关的操作。1. 确定基础设施首先,需确定部署Kubernetes集群的环境。可以在本地机器、私有云、公有云或混合云中部署。例如,如果选择在AWS上部署,可以利用其EKS(Elastic Kubernetes Service)服务,这样可以减少很多手动配置的工作。2. 配置主节点和工作节点Kubernetes集群通常包括至少一个主节点和多个工作节点。主节点负责管理集群的状态,调度应用程序,维护其所需的配置等。工作节点则是实际运行应用程序的服务器。主节点设置:安装Kubernetes的控制平面组件,例如API服务器、集群存储(etcd)、调度器等。工作节点设置:安装Kubelet、Kube-Proxy等,它们用于管理容器和与主节点通信。3. 安装Kubernetes可以通过多种方法安装Kubernetes,例如使用kubeadm、kops(针对AWS)、Minikube(适用于学习和开发环境)等工具。以kubeadm为例,步骤如下:安装kubeadm, kubelet 和 kubectl: apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl初始化主节点: kubeadm init --pod-network-cidr=10.244.0.0/16这里的CIDR块是为了配置网络插件使用的,确保不与现有网络冲突。配置kubectl: mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config安装网络插件:可以选择Calico, Flannel等。例如,安装Calico: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml将工作节点加入集群:每个工作节点运行: kubeadm join <MASTER_IP>:<MASTER_PORT> --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>这里需要替换 <MASTER_IP>, <MASTER_PORT>, <TOKEN>, 和 <HASH>为实际值。4. 验证集群状态完成以上步骤后,应使用以下命令检查集群的状态:kubectl get nodes如果一切正常,将看到所有节点的状态为 Ready。5. 部署应用现在,集群已准备好部署应用。可以使用Deployment资源来部署,例如:kubectl create deployment nginx --image=nginx然后,可以通过创建Service来暴露Deployment,如:kubectl expose deployment nginx --port=80 --type=NodePort总结这是一个基本的Kubernetes集群设置流程,涵盖了从选择基础设施到部署应用的完整步骤。当然,实际操作中会根据具体需求调整,例如在生产环境中可能需要配置高可用性等。