Docker大厂面试必备题,看这一篇就够了。

在这里插入图片描述

作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
欢迎 点赞✍评论⭐收藏

RabbitMQ/Kubernetes 知识专栏学习

Docker知识云集 访问地址 备注
Docker知识点(1) https://blog.csdn.net/m0_50308467/article/details/134693497 Docker专栏
Kubernetes知识点(1) https://blog.csdn.net/m0_50308467/article/details/134693653 Kubernetes专栏
Kubernetes知识点(2) https://blog.csdn.net/m0_50308467/article/details/134694211 Kubernetes专栏
Kubernetes知识点(3) https://blog.csdn.net/m0_50308467/article/details/134694311 Kubernetes专栏

文章目录

    • Docker 入门学习(1)
      • 01、什么是Docker?
      • 02、什么是Docker镜像?
      • 03、什么是Docker容器?
      • 04、Docker容器有几种状态?
      • 05、DockerFile中最常见的指定是什么?
      • 06、DockerFile中的命令COPY和ADD命令有什么区别?
      • 07、Docker的常用命令?
      • 08、容器与主机之间的数据拷贝命令?
      • 09、启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令?
      • 10、解释一下dockerfile的ONBUILD指令?
      • 11、什么是docker Swarm?
      • 12、如何在生产中监控docker?
      • 13、Docker如何在非Linux系统中运行容器?
      • 14、如何批量清理临时镜像文件?
      • 15、如何查看镜像支持的环境变量?
      • 16、本地的镜像文件都存放在哪里?
      • 17、构建docker镜像应该遵循哪些原则?
      • 18、容器退出后,通过docker ps命令查看不到,数据会丢失么?
      • 19、如何停止所有正在运行的容器?
      • 20、如何清理批量后台停止容器?
      • 21、如何临时退出一个正在交互的容器的终端,而不终止它?
      • 22、很多应用容器都是默认后台运行的,怎么查看他们的输出和日志信息?
      • 23、使用docker port命令映射容器的端口时系统报错Error∶NO public port '80'publis hed for …,是什么意思?
      • 24、可以在一个容器中同时运行多个应用进程吗?
      • 25、如何控制容器占用系统资源(CPU,内存)的份额?
      • 26、仓库(Repository)、注册服务器(Regi stry)、注册索引(Index)有何关系?
      • 27、从非官方仓库(如∶ )下载镜像的时候,有时候会提示"Error∶lnvail d registry endpoint ."?
      • 28、Docker的配置文件放在那里? 如何修改配置?
      • 29、如何更改docker的默认存储设置?
      • 30、docker与LXC(Linux Container)有何不同?
      • 31、Docker于Vagrant有何不同?
      • 32、开发环境中Docker与Vagrant该如何选择?
      • 33、如何将一台宿主机的docker环境迁移到另外一台宿主机?
      • 34、Docker容器创建后,删除了/var/run/net ns目录下的网络名字空间文件,可以手动恢复它吗?
      • 35、解释基本的Docker使用工作流程是怎样的?
      • 36、什么是docker-compose?
      • 37、什么是Docker镜像联合文件系统?
      • 38、什么类型的应用程序无状态或有状态更适合Docker容器?
      • 39、Docker 和虚拟机有啥不同?
      • 40、Docker 安全么?
      • 41、如何清理后台停止的容器?
      • 42、如何查看镜像支持的环境变量?
      • 43、当启动容器的时候提示∶exec format err or? 如何解决问题?
      • 44、本地的镜像文件都存放在哪里?
      • 45、如何退出一个镜像的bash,而不终止它?
      • 46、退出容器时候自动删除?
      • 47、怎么快速查看本地的镜像和容器?
      • 48、什么是Docker Hub?
      • 49、Docker容器可扩展到多远?
      • 50、Docker容器退出时是否丢失数据?

Docker大厂面试必备题,看这一篇就够了。_第1张图片

Docker 入门学习(1)

01、什么是Docker?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以在虚拟机中运行。

Docker 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是,容器之间可以共享主机的操作系统内核,因此几乎不需要任何的系统资源,极大地减少了系统开销,同时保证了系统安全。

Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以在虚拟机中运行。

Docker 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是,容器之间可以共享主机的操作系统内核,因此几乎不需要任何的系统资源,极大地减少了系统开销,同时保证了系统安全。

Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以在虚拟机中运行。

Docker 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是,容器之间可以共享主机的操作系统内核,因此几乎不需要任何的系统资源,极大地减少了系统开销,同时保证了系统安全。

02、什么是Docker镜像?

Docker 镜像(Image) 是用于创建 Docker 容器的基础,它包含了创建容器所需的所有内容,包括代码、运行时、库、环境变量、依赖项等。

镜像是只读的,当你创建一个容器时,Docker 会在镜像的基础上创建一个新的可写层,并在其中运行你的应用。当你修改容器时,这些修改会保存在该容器的可写层中,而不会影响镜像。

你可以通过 Dockerfile 来创建自己的镜像,Dockerfile 是一个文本文件,其中包含了创建镜像所需的所有指令。

例如,下面是一个简单的 Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx

这个 Dockerfile 会从 ubuntu:latest 镜像创建一个新的镜像,并安装 nginx 服务器。

你可以使用 docker build 命令来构建镜像:

docker build -t my-nginx .

这将在当前目录中创建一个名为 my-nginx 的镜像。

你可以使用 docker run 命令来运行镜像:

docker run -d -p 80:80 my-nginx

这将启动一个名为 my-nginx 的容器,并将其暴露在端口 80 上。

你可以使用 docker images 命令来查看本地镜像:

docker images

这将列出你所有的本地镜像。

你可以使用 docker rmi 命令来删除镜像:

docker rmi my-nginx

这将删除名为 my-nginx 的镜像。

03、什么是Docker容器?

Docker 容器(Container) 是运行在 Docker 引擎上的独立运行环境,它包含了应用程序运行所需的所有内容,包括代码、运行时、库、环境变量、依赖项等。

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是,容器之间可以共享主机的操作系统内核,因此几乎不需要任何的系统资源,极大地减少了系统开销,同时保证了系统安全。

你可以通过 Dockerfile 来创建自己的容器,Dockerfile 是一个文本文件,其中包含了创建容器所需的所有指令。

例如,下面是一个简单的 Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx

这个 Dockerfile 会从 ubuntu:latest 镜像创建一个新的容器,并安装 nginx 服务器。

你可以使用 docker build 命令来构建镜像:

docker build -t my-nginx .

这将在当前目录中创建一个名为 my-nginx 的镜像。

你可以使用 docker run 命令来运行镜像:

docker run -d -p 80:80 my-nginx

这将启动一个名为 my-nginx 的容器,并将其暴露在端口 80 上。

你可以使用 docker images 命令来查看本地镜像:

docker images

这将列出你所有的本地镜像。

你可以使用 docker rmi 命令来删除镜像:

docker rmi my-nginx

这将删除名为 my-nginx 的镜像。

04、Docker容器有几种状态?

Docker 容器有以下几种状态:

  • 创建(Created):容器已经创建,但还没有启动。
  • 启动(Running):容器已经启动,并正在运行。
  • 停止(Stopped):容器已经停止,但还没有删除。
  • 删除(Deleted):容器已经被删除。

你可以使用 docker ps 命令来查看所有容器的状态。

以下是 docker ps 命令的输出示例:

CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
05939389894d   nginx     "nginx -g 'daemon..."   2 minutes ago     Up 2 minutes    80/tcp   my-nginx

在这个示例中,容器 ID 为 05939389894d ,镜像为 nginx ,命令为 nginx -g 'daemon off;' ,创建时间为 2 minutes ago ,状态为 Up 2 minutes ,端口为 80/tcp ,名称为 my-nginx

05、DockerFile中最常见的指定是什么?

Dockerfile 中最常见的指定是 FROM 指令,它用于指定基础镜像。基础镜像是创建新镜像的基础,它可以是官方镜像,也可以是自定义镜像。

例如,下面是一个简单的 Dockerfile,它从 ubuntu:latest 镜像创建一个新的镜像:

FROM ubuntu:latest

这个镜像可以用于创建任何类型的容器,因为它包含了所有运行 Linux 系统所需的软件。

另一个常见的指定是 RUN 指令,它用于在容器中运行命令。例如,下面的 Dockerfile 会在容器中安装 nginx 服务器:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx

这个镜像可以用于创建一个运行 nginx 服务器的容器。

除了 FROMRUN 指令之外,还有许多其他常见的指定,例如 CMDEXPOSEENV 等。你可以在 Dockerfile 官方文档中找到更多关于这些指令的信息。

06、DockerFile中的命令COPY和ADD命令有什么区别?

COPY 和 ADD 都是用于将文件复制到容器中的命令。但是,它们有一些重要的区别。

  • COPY 是安全的,而 ADD 不是。COPY 会将文件复制到容器中,而不会修改文件的权限。ADD 会将文件复制到容器中,并将文件的权限设置为 0644。这意味着,如果您使用 ADD 命令复制一个可执行文件,那么该文件将可以被任何人执行。
  • COPY 可以使用多个源文件,而 ADD 只能使用一个源文件。COPY 可以使用多个源文件,并将它们复制到容器中的一个目录中。ADD 只能使用一个源文件,并将其复制到容器中的一个目录中。
  • COPY 可以使用相对路径,而 ADD 只能使用绝对路径。COPY 可以使用相对路径,这意味着您可以从当前目录复制文件。ADD 只能使用绝对路径,这意味着您必须指定文件的完整路径。

总体而言,COPY 是更安全、更灵活的命令。如果您需要将文件复制到容器中,建议您使用 COPY 命令。

以下是一个简单的例子:

COPY myfile /mydir/

这个命令会将 myfile 文件复制到容器中的 /mydir/ 目录中。

ADD myfile /mydir/

这个命令会将 myfile 文件复制到容器中的 /mydir/ 目录中,并将文件的权限设置为 0644。

07、Docker的常用命令?

以下是 Docker 的常用命令:

命令 描述 示例
docker build 用于构建 Docker 镜像。 docker build -t my-image .
docker run 用于运行 Docker 容器。 docker run -d -p 80:80 my-image
docker ps 用于查看正在运行的 Docker 容器。 docker ps
docker stop 用于停止 Docker 容器。 docker stop my-container
docker start 用于启动 Docker 容器。 docker start my-container
docker rm 用于删除 Docker 容器。 docker rm my-container
docker images 用于查看本地 Docker 镜像。 docker images
docker pull 用于下载 Docker 镜像。 docker pull nginx:latest
docker push 用于上传 Docker 镜像。 docker push my-image:latest
docker inspect 用于查看 Docker 容器或镜像的详细信息。 docker inspect my-container
docker tag 用于为 Docker 镜像添加标签。 docker tag my-image my-new-image
docker commit 用于将 Docker 容器转换为镜像。 docker commit my-container my-new-image
docker rmi 用于删除 Docker 镜像。 docker rmi my-image
docker network 用于管理 Docker 网络。 docker network create my-network
docker volume 用于管理 Docker 卷。 docker volume create my-volume
docker swarm 用于管理 Docker Swarm 集群。 docker swarm init
docker compose 用于管理 Docker Compose 应用程序。 docker compose up

你可以在 Docker 官方文档中找到更多关于 Docker 命令的信息。

08、容器与主机之间的数据拷贝命令?

要在容器和主机之间进行数据拷贝,可以使用以下命令:

1. 从主机拷贝到容器:使用 docker cp 命令可以将文件或目录从主机复制到运行中的容器。命令的基本语法如下:

docker cp <源路径> <容器名称或ID>:<目标路径>

示例:

docker cp /path/to/file.txt my-container:/app/file.txt

这会将主机上的 file.txt 文件复制到名为 my-container 的容器中的 /app 目录下。

2. 从容器拷贝到主机:使用 docker cp 命令也可以将文件或目录从运行中的容器复制到主机。命令的基本语法如下:

docker cp <容器名称或ID>:<源路径> <目标路径>

示例:

docker cp my-container:/app/file.txt /path/to/file.txt

这会将容器中的 /app/file.txt 文件复制到主机上的 /path/to 目录下。

使用这些命令,您可以在容器和主机之间进行灵活的数据拷贝操作。请注意, <容器名称或ID> 是指要拷贝的容器的名称或ID, <源路径> 是指要拷贝的文件或目录在容器或主机中的路径, <目标路径> 是指拷贝后文件或目录在容器或主机中的目标路径。

09、启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令?

要启动一个随机端口映射的 nginx 容器,并将本地文件目录挂载到容器的 HTML 目录,可以使用以下命令:

docker run -d -P -v /本地目录路径:/usr/share/nginx/html --name my-nginx nginx

这个命令将创建一个名为 my-nginx 的 nginx 容器,并将主机上的 /本地目录路径 目录挂载到容器的 /usr/share/nginx/html 目录。

  • -d 参数表示容器以后台模式运行。
  • -P 参数表示将容器的端口随机映射到主机的端口。
  • -v 参数用于挂载本地文件目录到容器的指定目录。
  • --name 参数用于指定容器的名称。
  • nginx 是要使用的 nginx 镜像。

容器启动后,可以使用以下命令查看容器的端口映射:

docker port my-nginx

你将看到类似以下输出:

80/tcp -> 0.0.0.0:32768

这表示容器的端口 80 映射到主机的端口 32768。

现在,你可以通过访问 http://localhost:32768 来查看挂载到容器的本地文件目录的内容。

如果需要停止容器,可以使用以下命令:

docker stop my-nginx

如果需要删除容器,可以使用以下命令:

docker rm my-nginx

请确保将 /本地目录路径 替换为你本地文件目录的实际路径。

10、解释一下dockerfile的ONBUILD指令?

Dockerfile 中的 ONBUILD 指令是一种特殊的指令,它允许你在当前镜像的基础上构建其他镜像时执行一些操作。当构建一个镜像时,ONBUILD 指令中的命令将会被保存,并在后续构建的镜像中执行。

ONBUILD 指令通常用于创建可重用的基础镜像,以便其他开发者可以在其基础上构建自己的镜像,并在构建过程中执行一些特定的操作。

以下是一个使用 ONBUILD 指令的示例 Dockerfile:

FROM nginx:latest
ONBUILD COPY . /usr/share/nginx/html

在这个示例中,当基于这个镜像构建新的镜像时,ONBUILD 指令将会将当前目录中的所有文件复制到新镜像的 /usr/share/nginx/html 目录中。

当你构建一个继承这个基础镜像的镜像时,这个复制操作将会自动执行,无需在新的 Dockerfile 中重复定义。

使用 ONBUILD 指令可以方便地定义通用的构建步骤,并在后续构建过程中自动执行,提高了镜像的可重用性和灵活性。

11、什么是docker Swarm?

Docker Swarm 是 Docker 官方提供的一个原生的容器编排和集群管理工具,它允许用户创建和管理一个由多个 Docker 节点组成的集群,以便在集群中部署和运行容器化的应用程序。

Swarm 使用主节点和工作节点的概念来组织容器集群。主节点负责管理整个集群的状态和任务分配,而工作节点负责运行容器。

通过 Docker Swarm,用户可以轻松地扩展应用程序,实现高可用性和负载均衡。Swarm 提供了一些高级功能,如服务发现、负载均衡、滚动更新等,使得在容器集群中部署和管理应用程序变得更加简单和可靠。

以下是一个使用 Docker Swarm 的示例:

1. 初始化 Swarm:

docker swarm init

这将在当前节点上初始化一个 Swarm 集群,并将当前节点设置为 Swarm 的主节点。

2. 加入其他节点:

docker swarm join --token <TOKEN> <IP:PORT>

使用上述命令将其他节点加入到 Swarm 集群中。

3. 部署服务:

docker service create --name my-service --replicas 3 -p 8080:80 my-image

这将在 Swarm 集群中部署一个名为 my-service 的服务,使用 my-image 镜像,并设置为在 3 个副本中运行,将容器的 80 端口映射到主机的 8080 端口。

4. 扩展服务:

docker service scale my-service=5

这将扩展 my-service 服务的副本数为 5。

通过 Docker Swarm,您可以轻松地管理容器集群,部署和扩展应用程序,以及实现高可用性和负载均衡。

12、如何在生产中监控docker?

在生产环境中监控 Docker,可以采取以下几种方式:

  1. 使用 Docker 内置的监控工具:Docker 提供了一些内置的监控工具,如 Docker Stats 和 Docker Events。Docker Stats 可以实时监测容器的 CPU、内存、网络和磁盘使用情况,而 Docker Events 可以捕获容器和镜像的事件。可以使用这些工具来监控容器的运行状态和性能指标。

  2. 使用第三方容器监控工具:有许多第三方工具专门用于监控 Docker 容器,如 Prometheus、cAdvisor、Datadog、Sysdig 等。这些工具提供更丰富的监控功能,可以收集和展示更多的指标数据,并提供报警功能和可视化仪表盘,帮助你更好地监控和管理 Docker 容器。

  3. 集成容器编排工具的监控功能:如果你在生产环境中使用容器编排工具如 Docker Swarm、Kubernetes 等,这些工具通常都提供了内置的监控功能。通过集成容器编排工具的监控功能,你可以监控整个容器集群的状态、资源使用情况、服务健康状况等。

  4. 日志监控:除了监控容器的性能指标,还应该关注容器的日志。通过收集和分析容器的日志,可以及时发现和解决潜在的问题。可以使用 ELK Stack(Elasticsearch、Logstash、Kibana)或其他日志管理工具来集中管理和监控容器的日志。

  5. 基础设施监控:除了监控 Docker 容器本身,还应该监控容器运行所在的主机和网络设备。这可以包括监控主机的 CPU、内存、磁盘使用情况,网络的带宽和延迟等。可以使用基础设施监控工具如 Zabbix、Prometheus、Grafana 等来监控整个基础设施的状态。

综合运用以上的监控方法,可以全面监控 Docker 容器在生产环境中的运行状态、性能指标和日志,及时发现和解决问题,确保容器的稳定和可靠运行。

13、Docker如何在非Linux系统中运行容器?

Docker 在非 Linux 系统中运行容器通常使用虚拟化技术。虚拟化技术可以创建一个虚拟的 Linux 环境,使得 Docker 可以在其中运行。

以下是一些常用的虚拟化技术和在非 Linux 系统上运行 Docker 的示例:

  1. Docker Desktop(Windows 和 macOS):Docker Desktop 是为 Windows 和 macOS 提供的官方 Docker 解决方案。它使用 Hyper-V(Windows)或者 HyperKit(macOS)虚拟化技术,在本地主机上创建一个 Linux 虚拟机来运行 Docker 容器。

  2. VirtualBox:VirtualBox 是一款免费的虚拟化软件,可以在 Windows、macOS 和 Linux 上运行。通过在 VirtualBox 中创建一个 Linux 虚拟机,然后在虚拟机中安装 Docker,就可以在非 Linux 系统上运行 Docker 容器。

  3. VMware Workstation:VMware Workstation 是一款商业虚拟化软件,支持 Windows 和 Linux 操作系统。通过在 VMware Workstation 中创建一个 Linux 虚拟机,然后在虚拟机中安装 Docker,就可以在非 Linux 系统上运行 Docker 容器。

这些虚拟化技术允许在非 Linux 系统上运行 Docker 容器,并提供与在 Linux 环境中相似的体验。用户可以使用 Docker 命令行界面或者 Docker 图形界面工具来管理和操作容器,就像在 Linux 环境中一样。

需要注意的是,虚拟化技术可能会对性能产生一定的影响,因此在选择虚拟化技术时需要考虑主机的硬件资源和性能需求。

14、如何批量清理临时镜像文件?

要批量清理 Docker 中的临时镜像文件,可以按照以下步骤进行操作:

1. 查找临时镜像:首先,使用以下命令查找所有的临时镜像文件:

docker images -f "dangling=true"

这将列出所有的临时镜像文件。

2. 删除临时镜像:使用以下命令删除所有的临时镜像文件:

docker rmi $(docker images -f "dangling=true" -q)

这将批量删除所有的临时镜像文件。

在执行上述命令时,请确保你有足够的权限来执行 Docker 相关操作。

这些步骤将帮助你批量清理 Docker 中的临时镜像文件,释放磁盘空间并提高系统性能。请注意,删除临时镜像文件后将无法恢复,所以请确保你不再需要这些镜像。

15、如何查看镜像支持的环境变量?

要查看 Docker 镜像支持的环境变量,可以使用以下命令:

docker inspect --format='{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' <镜像名称或ID>

<镜像名称或ID> 替换为要查看的镜像的名称或ID。

运行该命令后,将会列出镜像中定义的所有环境变量及其对应的值。

请注意,这个命令会输出镜像中所有已定义的环境变量,包括默认的和自定义的。

16、本地的镜像文件都存放在哪里?

本地的镜像文件默认存放在 Docker 的镜像仓库中。具体存放位置取决于不同的操作系统。

在大多数 Linux 系统上,默认的镜像存储路径是 /var/lib/docker 。在该路径下,镜像文件存储在 /var/lib/docker/image 目录中。

在 Windows 系统上,默认的镜像存储路径是 C:\ProgramData\Docker\windowsfilter

在 macOS 系统上,默认的镜像存储路径是 /var/lib/docker

请注意,这些路径是默认路径,具体路径可能因为不同的 Docker 配置或安装方式而有所不同。如果你想要确认镜像的存储路径,可以通过 Docker 的配置文件或者命令行参数进行查询和设置。

17、构建docker镜像应该遵循哪些原则?

构建 Docker 镜像时,应遵循以下原则:

  1. 最小化镜像大小:尽量选择基础镜像,并仅安装应用程序所需的依赖项。避免在镜像中包含不必要的文件和软件,以减小镜像的大小。

  2. 使用官方镜像:优先选择官方提供的镜像,它们经过良好的维护和更新,并且有广泛的社区支持。

  3. 分层构建:利用 Docker 的分层构建机制,将常变化的部分放在上层,并将稳定的部分放在底层。这样可以最大程度地复用镜像层,减少构建时间和镜像大小。

  4. 使用版本控制:在 Dockerfile 中指定所使用的软件和库的具体版本,以确保环境的一致性和可重复性。

  5. 减少镜像层数:尽量减少镜像层数,以便于管理和维护。可以使用多个 RUN 命令的组合,而不是每个命令都创建一个新的镜像层。

  6. 清理不必要的文件:在构建镜像时,确保删除不再需要的临时文件和缓存,以减小镜像的体积。

  7. 使用 .dockerignore 文件:在构建镜像时,使用 .dockerignore 文件来排除不需要复制到镜像中的文件和目录,以减小镜像的大小。

  8. 优化镜像构建过程:可以使用多阶段构建、缓存镜像层、并行构建等技术来优化镜像构建过程,提高构建效率。

  9. 安全性考虑:在构建镜像时,确保镜像中的软件和库都是经过验证和安全的。遵循最佳安全实践,如使用官方签名的基础镜像、定期更新镜像等。

  10. 文档和元数据:在构建镜像时,为镜像添加适当的文档和元数据,包括镜像的用途、作者、版本号等信息,以便于后续的管理和维护。

遵循这些原则可以帮助构建高效、可靠、安全和可维护的 Docker 镜像。

18、容器退出后,通过docker ps命令查看不到,数据会丢失么?

当容器退出后,如果通过 docker ps 命令查看不到该容器,这意味着该容器已经被删除。在默认情况下,Docker 会在容器退出后自动删除容器。

当容器被删除时,容器中的数据也会被删除。这是因为容器的文件系统是在容器运行期间存在于容器的可写层中的,而容器删除后,可写层也会被删除,从而导致数据丢失。

如果你希望在容器退出后保留数据,可以使用 Docker 的数据卷(Volume)功能。数据卷是一个特殊的目录,可以绕过容器文件系统,将数据存储在主机上。通过将数据卷挂载到容器中,即使容器被删除,数据仍然会保留在主机上。

要创建并使用数据卷,可以使用 -v--mount 参数来指定数据卷的挂载点。例如:

docker run -d -v /path/on/host:/path/in/container my-image

这将创建一个数据卷,并将主机上的 /path/on/host 目录挂载到容器中的 /path/in/container 目录。

使用数据卷可以确保容器退出后数据不会丢失,并且可以在其他容器中共享和访问数据。

19、如何停止所有正在运行的容器?

要停止所有正在运行的容器,可以使用以下命令:

docker stop $(docker ps -q)

这个命令使用 docker ps -q 来获取所有正在运行的容器的 ID,并将其传递给 docker stop 命令,从而停止所有容器的运行。

请注意,这个命令会停止所有正在运行的容器,包括后台运行的和前台运行的容器。确保在执行此命令之前确认您希望停止所有容器。

20、如何清理批量后台停止容器?

要清理批量后台停止的容器,可以使用以下命令:

1. 首先,列出所有已停止的容器:

docker ps -a -q --filter "status=exited"

这个命令会列出所有状态为 “exited” 的容器,并返回容器的 ID。

2. 接下来,删除这些已停止的容器:

docker rm $(docker ps -a -q --filter "status=exited")

这个命令使用 docker ps -a -q --filter "status=exited" 获取所有已停止容器的 ID,并将其传递给 docker rm 命令,从而删除这些容器。

请注意,这个命令会永久删除已停止的容器,确保在执行之前确认您希望清理这些容器。

这个命令序列将帮助您批量清理已停止的容器,以释放系统资源并保持容器环境的整洁。

21、如何临时退出一个正在交互的容器的终端,而不终止它?

要临时退出一个正在交互的容器的终端,而不终止它,可以按下组合键 Ctrl + P ,然后再按下组合键 Ctrl + Q

这个操作会将容器的终端分离,但容器仍然在后台运行。你可以返回到宿主机的终端,而容器会继续在后台运行。

以下是详细说明:

  1. 在容器的终端中,按下组合键 Ctrl + P
  2. 接着,按下组合键 Ctrl + Q
  3. 这样,你会退出容器的终端,返回到宿主机的终端。

请注意,这个操作只是将容器的终端分离,容器仍然在后台运行。你可以使用 docker ps 命令来查看容器的状态。

如果你想重新连接到容器的终端,可以使用以下命令:

docker attach <容器名称或ID>

这样,你就可以重新连接到容器的终端,继续与容器进行交互。

通过临时退出容器的终端,你可以在需要时方便地切换到宿主机的终端,而不会终止容器的运行。

22、很多应用容器都是默认后台运行的,怎么查看他们的输出和日志信息?

要查看在后台运行的应用容器的输出和日志信息,可以使用以下方法:

1. 使用 docker logs 命令:使用 docker logs 命令可以查看容器的标准输出和标准错误输出。命令的基本语法如下:

docker logs <容器名称或ID>

示例:

docker logs my-container

这将显示容器的输出和日志信息。

2. 查看容器的文件日志:容器的输出和日志通常会写入到容器内的文件中。可以通过进入容器并查看相关日志文件来获取信息。使用以下命令进入容器的终端:

docker exec -it <容器名称或ID> /bin/bash

示例:

docker exec -it my-container /bin/bash

进入容器后,你可以使用适合容器内部操作系统的命令(如 cattailless 等)来查看日志文件。常见的日志文件路径包括 /var/log/var/log/nginx/var/log/apache2 等,具体取决于容器内部的应用程序和操作系统。

3. 将容器的日志文件挂载到宿主机:在启动容器时,可以将容器内的日志文件挂载到宿主机上的目录,以便在宿主机上查看日志信息。在 docker run 命令中使用 -v 参数来进行挂载。

示例:

docker run -d -v /path/on/host:/path/in/container <镜像名称>

这将把容器内的 /path/in/container 目录挂载到宿主机上的 /path/on/host 目录。然后,你可以使用宿主机上的文本编辑器或命令行工具来查看容器的日志文件。

通过这些方法,你可以轻松地查看在后台运行的应用容器的输出和日志信息,以便进行故障排除和监控。

23、使用docker port命令映射容器的端口时系统报错Error∶NO public port '80’publis hed for …,是什么意思?

这个错误提示 “Error: No public port ‘80’ published for …” 表示在使用 docker port 命令时,容器没有将端口 80 发布到主机上。

该错误可能有以下几种原因:

  1. 容器没有将端口 80 映射到主机上:在使用 docker run 命令启动容器时,可能没有使用 -p 参数将容器的端口与主机的端口进行映射。请确保在启动容器时正确地指定了端口映射。

  2. 容器已经停止:如果容器已经停止,那么它将无法在主机上发布端口。请确保容器正在运行时执行 docker port 命令。

  3. 容器没有监听端口 80:如果容器内部的应用程序没有在端口 80 上监听连接,那么无法将该端口发布到主机上。请确保容器内部的应用程序正在正确地监听端口 80。

请检查以上原因,并确保容器正确发布了端口 80 到主机上。如果问题仍然存在,请提供更多的详细信息,以便我们能够更好地帮助你解决问题。

24、可以在一个容器中同时运行多个应用进程吗?

可以在一个容器中同时运行多个应用进程。Docker 容器内部可以运行一个主进程,但也可以在该主进程下启动多个子进程。

在 Docker 中同时运行多个应用进程有几种常见的方式:

  1. 使用进程管理工具:可以使用进程管理工具如 supervisord、runit、systemd 等,在容器内部启动和管理多个应用进程。这些工具可以确保多个进程同时运行,并在需要时重新启动它们。

  2. 使用启动脚本:可以编写一个启动脚本,其中包含启动多个应用进程的命令。该脚本可以在容器启动时执行,并启动多个应用进程。例如,可以使用 Shell 脚本或者编程语言提供的启动脚本功能,如 Python 的 subprocess 模块。

  3. 使用容器编排工具:如果你使用容器编排工具如 Docker Compose、Kubernetes 等,它们提供了在容器中同时运行多个应用进程的机制。通过定义多个服务或容器,每个服务或容器可以运行一个应用进程,从而实现多个应用进程的同时运行。

无论你选择哪种方式,都需要确保容器内部的进程能够正确启动和运行,并且它们之间没有冲突或资源竞争。同时,还要注意容器的资源限制,确保容器的资源分配足够满足所有运行的应用进程的需求。

需要注意的是,将多个应用进程放在一个容器中可能增加了容器的复杂性和管理难度。通常情况下,更推荐将每个应用程序放在一个单独的容器中,以便更好地实现容器的隔离和管理。

25、如何控制容器占用系统资源(CPU,内存)的份额?

要控制容器占用系统资源(如 CPU 和内存)的份额,可以使用 Docker 提供的资源限制功能。Docker 提供了两种主要的资源限制方式:CPU 资源限制和内存资源限制。

1. CPU 资源限制:可以使用 --cpus 参数来限制容器可以使用的 CPU 核心数。例如,使用以下命令将容器限制为使用 0.5 个 CPU 核心:

docker run --cpus=0.5 my-container

这将使容器最多只能使用半个 CPU 核心的计算资源。

另外,可以使用 --cpu-shares 参数来设置容器相对于其他容器的 CPU 份额。较高的 --cpu-shares 值表示容器将获得更多的 CPU 时间。例如,使用以下命令将容器的 CPU 份额设置为 512:

docker run --cpu-shares=512 my-container

这将使容器相对于其他容器获得更多的 CPU 时间。

2. 内存资源限制:可以使用 --memory 参数来限制容器可以使用的内存量。例如,使用以下命令将容器限制为使用 512MB 的内存:

docker run --memory=512m my-container

这将使容器最多只能使用 512MB 的内存。

另外,可以使用 --memory-swap 参数来设置容器可以使用的交换空间大小。交换空间是在内存不足时使用的辅助存储空间。例如,使用以下命令将容器的交换空间限制为 1GB:

docker run --memory=512m --memory-swap=1g my-container

这将使容器最多只能使用 512MB 的内存,并且最多可以使用 1GB 的交换空间。

通过这些资源限制参数,可以根据应用程序的需求和系统资源的可用性来控制容器对 CPU 和内存的占用。这有助于保持容器的稳定性和可靠性,并确保系统中的其他容器或进程也能获得足够的资源。

26、仓库(Repository)、注册服务器(Regi stry)、注册索引(Index)有何关系?

仓库(Repository)、注册服务器(Registry)和注册索引(Index)是 Docker 中用于存储和管理镜像的概念,它们之间有以下关系:

  1. 仓库(Repository):仓库是用于存储和组织 Docker 镜像的地方。一个仓库可以包含多个不同版本的镜像,每个镜像都有一个唯一的标签(tag)。仓库可以分为两种类型:

    • 官方仓库(Official Repository):由 Docker 官方维护的仓库,包含了一些常用的镜像,如 Ubuntu、Nginx 等。
    • 用户仓库(User Repository):由用户自己创建和维护的仓库,用于存储个人或组织的镜像。

    仓库的名称由两部分组成:仓库的命名空间(Namespace)和仓库的名称(Name),格式为 <命名空间>/<名称> 。例如, ubuntu 是一个官方仓库, myuser/my-image 是一个用户仓库。

  2. 注册服务器(Registry):注册服务器是用于存储和分发 Docker 镜像的服务器。它充当了仓库的中央存储库,负责管理和提供镜像的上传、下载和分发功能。Docker 官方提供了一个默认的注册服务器,称为 Docker Hub,用户可以在其中创建和管理自己的仓库。此外,还有其他第三方注册服务器可供选择,如 Harbor、Amazon ECR、Azure Container Registry 等。

  3. 注册索引(Index):注册索引是一个集中的镜像索引服务,用于存储和查询镜像的元数据(metadata)。它充当了仓库和注册服务器之间的连接器,帮助用户快速搜索和发现镜像。Docker Hub 作为默认的注册服务器也提供了注册索引的功能,使用户可以方便地搜索和浏览各种镜像。

综上所述,仓库是存储和组织镜像的地方,注册服务器是存储和分发镜像的服务器,注册索引是镜像的元数据索引服务。它们共同构成了 Docker 镜像生态系统,提供了方便的镜像管理和共享机制。

27、从非官方仓库(如∶http://dl.dockerpool.com )下载镜像的时候,有时候会提示"Error∶lnvail d registry endpoint https://dl.docker.com:5000/v1."?

当从非官方仓库(如 http://dl.dockerpool.com )下载镜像时,出现提示 "Error: invalid registry endpoint https://dl.docker.com:5000/v1 " 的情况可能是由于以下原因导致的:

  1. 仓库地址错误:请确保输入的仓库地址正确,并且能够访问到该地址。在您的示例中,仓库地址为 http://dl.dockerpool.com ,请验证该地址是否正确。

  2. 网络连接问题:检查您的网络连接是否正常,确保能够访问到仓库地址。有时候网络问题可能导致无法连接到非官方仓库。

  3. 仓库配置问题:非官方仓库可能需要进行额外的配置才能正常使用。请参考仓库的文档或联系仓库的维护者,了解是否需要进行额外的配置步骤。

  4. 仓库不可用:非官方仓库可能出现不稳定或不可用的情况。这可能是由于仓库维护者的原因,或者仓库已经不再提供服务。您可以尝试使用其他可靠的仓库或官方仓库来获取所需的镜像。

请注意,非官方仓库的使用可能存在一定的风险,包括安全性和可靠性方面的问题。建议在使用非官方仓库时谨慎评估其可信度和可用性,并确保从可靠的来源获取镜像。

28、Docker的配置文件放在那里? 如何修改配置?

Docker 的配置文件通常位于不同操作系统的特定位置。以下是常见操作系统上 Docker 配置文件的默认位置:

  • Linux: /etc/docker/daemon.json
  • Windows: C:\ProgramData\docker\config\daemon.json
  • macOS: /etc/docker/daemon.json

要修改 Docker 的配置文件,可以按照以下步骤进行操作:

  1. 打开配置文件所在的目录。
  2. 使用适合您的文本编辑器打开配置文件。
  3. 修改配置文件中的相应设置。配置文件使用 JSON 格式,您可以根据需要修改各个配置项,例如修改镜像加速器、网络设置、存储驱动等。
  4. 保存并关闭配置文件。
  5. 重新启动 Docker 服务,以使配置更改生效。

请注意,在修改配置文件之前,请确保您对 Docker 的配置有一定的了解,并且小心地进行更改。配置文件中的错误可能会导致 Docker 无法正常工作。建议在修改配置文件之前备份原始文件,以防需要回滚更改。

如果您使用的是 Docker Desktop,可以通过系统托盘图标或应用程序设置界面来修改 Docker 的配置,而无需直接编辑配置文件。

29、如何更改docker的默认存储设置?

要更改 Docker 的默认存储设置,您需要编辑 Docker 的配置文件,并指定所需的存储驱动程序。

以下是一些常见的存储驱动程序及其在不同操作系统上的配置方法:

  1. aufs:

    • Linux: 在 Docker 配置文件中添加 "storage-driver": "aufs"
  2. overlay2:

    • Linux: 在 Docker 配置文件中添加 "storage-driver": "overlay2"
  3. btrfs:

    • Linux: 在 Docker 配置文件中添加 "storage-driver": "btrfs"
  4. zfs:

    • Linux: 在 Docker 配置文件中添加 "storage-driver": "zfs"

请注意,存储驱动程序的可用性取决于您的操作系统和 Docker 版本。确保在更改配置之前,您已经了解所选存储驱动程序的要求和限制,并备份您的 Docker 配置文件。

以下是修改 Docker 配置文件的一般步骤:

  1. 打开 Docker 的配置文件。根据操作系统的不同,配置文件的位置可能会有所不同(例如 /etc/docker/daemon.json )。
  2. 使用适合您的文本编辑器打开配置文件。
  3. 根据所需的存储驱动程序,将配置文件中的 "storage-driver" 设置更改为所选驱动程序。
  4. 保存并关闭配置文件。
  5. 重新启动 Docker 服务,以使配置更改生效。

请注意,更改存储驱动程序可能需要重新创建现有的容器和镜像。确保在进行更改之前备份重要的容器和镜像数据。

再次提醒,在进行任何更改之前,请确保您对 Docker 的配置有一定的了解,并小心地进行更改。

30、docker与LXC(Linux Container)有何不同?

Docker 和 LXC(Linux Container)是两种不同的容器化技术,虽然它们都用于在 Linux 环境中实现轻量级的虚拟化,但在实现方式和功能上存在一些区别。

  1. 隔离级别:Docker 使用了一种名为“容器化”的虚拟化技术,它在操作系统级别实现了进程的隔离。而 LXC 是一种传统的系统级虚拟化技术,它在操作系统层面实现了完全的隔离,每个容器都有自己的进程、网络和文件系统。

  2. 镜像管理:Docker 使用了镜像和容器的概念。镜像是一个只读的模板,用于创建容器。而 LXC 使用了模板和快照的概念。模板是一个基础的文件系统,用于创建容器,而快照是一个容器的状态的副本。

  3. 启动速度:Docker 的启动速度通常比 LXC 更快。这是因为 Docker 使用了镜像的分层结构,可以快速创建和启动容器。而 LXC 需要在每次启动容器时创建一个完整的文件系统副本。

  4. 生态系统和工具支持:Docker 拥有庞大的生态系统和广泛的工具支持。它提供了丰富的命令行工具和图形界面工具,以及许多第三方工具和库。而 LXC 的生态系统相对较小,工具和支持相对有限。

总体而言,Docker 更加注重应用程序的部署和分发,提供了更高级的抽象层,使容器的管理更加简单和可靠。而 LXC 更加注重操作系统的虚拟化,提供了更接近传统虚拟机的隔离级别。选择使用 Docker 还是 LXC 取决于具体的使用场景和需求。

31、Docker于Vagrant有何不同?

Docker 和 Vagrant 是两种不同的工具,用于在不同的场景下创建和管理虚拟化环境。

  1. 虚拟化技术:Docker 使用容器化技术,在操作系统级别实现轻量级的虚拟化。它利用操作系统的内核来共享资源,使得容器的启动和运行更加快速和高效。而 Vagrant 使用虚拟机技术,通过在宿主机上运行一个虚拟机来模拟完整的操作系统环境。

  2. 环境复制和分发:Docker 通过镜像的方式来复制和分发环境。镜像是一个只读的模板,包含了运行应用程序所需的所有依赖项和配置。镜像可以在不同的主机上快速部署和运行。而 Vagrant 使用虚拟机模板(Box)来复制和分发环境,每个虚拟机都是一个独立的副本。

  3. 资源消耗:由于 Docker 使用容器化技术,它在资源消耗方面更加高效。容器与宿主机共享操作系统内核,因此启动和运行容器所需的资源较少。相比之下,Vagrant 使用虚拟机技术,每个虚拟机都需要独立的操作系统和资源。

  4. 适用场景:Docker 更适合用于部署和管理轻量级的应用程序,特别是微服务架构。它提供了快速部署、可扩展性和隔离性。Vagrant 更适合用于创建和管理复杂的开发环境,特别是需要完整操作系统环境的场景。

总体而言,Docker 和 Vagrant 是为不同的虚拟化需求而设计的工具。选择使用哪个工具取决于具体的使用场景和需求。

32、开发环境中Docker与Vagrant该如何选择?

在选择 Docker 或 Vagrant 作为开发环境工具时,可以考虑以下因素:

  1. 轻量性和性能:如果你需要快速启动和管理轻量级的容器化应用程序,以及更高的性能和资源利用率,那么 Docker 是一个更好的选择。Docker 使用容器化技术,在操作系统级别实现轻量级的虚拟化,启动和运行容器更加快速和高效。

  2. 完整的虚拟化环境:如果你需要在开发环境中模拟完整的操作系统环境,并进行更深入的配置和定制,那么 Vagrant 是一个更合适的选择。Vagrant 使用虚拟机技术,每个虚拟机都是一个独立的操作系统副本,可以进行更灵活的配置和管理。

  3. 团队和生态系统支持:如果你的团队已经熟悉 Docker,并且有大量的 Docker 镜像和工具可用,那么选择 Docker 可能更加方便。Docker 有一个庞大的社区和生态系统,提供了丰富的资源和支持。相比之下,如果你的团队更熟悉 Vagrant,并且有相关的虚拟机模板和插件,那么选择 Vagrant 可能更合适。

  4. 应用场景和需求:最重要的是根据你的具体应用场景和需求来选择。如果你需要部署和管理轻量级的容器化应用程序,特别是微服务架构,那么 Docker 是一个更好的选择。如果你需要创建和管理复杂的开发环境,特别是需要完整操作系统环境的场景,那么 Vagrant 是一个更合适的选择。

最终的选择取决于你的具体需求和团队的偏好。在某些情况下,Docker 和 Vagrant 也可以结合使用,以充分发挥各自的优势。

33、如何将一台宿主机的docker环境迁移到另外一台宿主机?

要将一台宿主机的 Docker 环境迁移到另一台宿主机,可以按照以下步骤进行操作:

  1. 备份容器和镜像:首先,在源宿主机上备份所有需要迁移的容器和镜像。可以使用 docker save 命令将镜像保存为 tar 文件,使用 docker export 命令将容器保存为 tar 文件。将这些备份文件保存到一个可访问的位置。

  2. 安装 Docker 环境:在目标宿主机上安装 Docker 环境,并确保版本兼容。可以参考 Docker 官方文档或适用于目标宿主机操作系统的安装指南进行安装。

  3. 恢复镜像和容器:将备份的镜像和容器文件传输到目标宿主机上。可以使用 docker load 命令加载镜像文件,使用 docker import 命令导入容器文件。确保在目标宿主机上恢复所有必要的镜像和容器。

  4. 迁移数据卷:如果容器使用了数据卷来持久化数据,需要将数据卷迁移到目标宿主机。可以使用 docker volume 命令导出和导入数据卷,或者手动复制数据卷的内容。

  5. 调整网络配置:如果源宿主机上的容器使用了自定义网络配置,需要在目标宿主机上重新创建相同的网络。可以使用 docker network 命令创建网络,并确保容器连接到正确的网络。

  6. 启动容器:在目标宿主机上使用适当的命令启动容器。可以使用 docker run 命令启动容器,并根据需要指定端口映射、环境变量等配置。

通过按照以上步骤操作,你可以将一台宿主机的 Docker 环境成功迁移到另一台宿主机。请注意,在迁移过程中要确保目标宿主机的环境和配置与源宿主机兼容,并确保数据的完整性和一致性。

34、Docker容器创建后,删除了/var/run/net ns目录下的网络名字空间文件,可以手动恢复它吗?

如果在 Docker 容器创建后意外删除了 /var/run/netns 目录下的网络命名空间文件,可以尝试手动恢复它。以下是一些步骤:

1. 首先,确定你在容器中删除的网络命名空间文件的名称。你可以使用 ip netns list 命令列出当前系统中的网络命名空间。

2. 如果你知道被删除的网络命名空间的名称,可以尝试手动创建它。使用 ip netns add 命令,后跟被删除的网络命名空间的名称,创建一个新的网络命名空间。

ip netns add <namespace_name>

3. 如果你不知道被删除的网络命名空间的名称,可以尝试通过 /proc 文件系统查找。在 /proc 目录中,有一个与每个网络命名空间对应的目录。你可以使用以下命令查找被删除的网络命名空间:

ls -l /proc/*/ns/net | grep deleted

这将显示所有被删除的网络命名空间文件的路径。你可以根据需要选择一个文件,并将其链接到 /var/run/netns 目录下。

ln -s /proc/<pid>/ns/net /var/run/netns/<namespace_name>

其中 是网络命名空间文件对应的进程 ID, 是你选择的命名空间名称。

4. 确认恢复是否成功。你可以使用 ip netns list 命令检查网络命名空间是否已恢复。

ip netns list

请注意,手动恢复网络命名空间可能会有一些限制,特别是如果容器已经被删除或网络配置已经发生变化。在进行任何手动操作之前,请确保理解操作的风险,并在测试或非生产环境中进行操作。

35、解释基本的Docker使用工作流程是怎样的?

基本的 Docker 使用工作流程如下:

  1. 编写 Dockerfile:创建一个文本文件,命名为 Dockerfile,其中定义了构建 Docker 镜像所需的步骤和配置。Dockerfile 包含了基础镜像、依赖项安装、环境变量设置、文件复制等指令。

  2. 构建镜像:使用 Docker 命令行工具执行 docker build 命令,指定 Dockerfile 的路径,以构建镜像。Docker 会按照 Dockerfile 中的指令逐步执行构建过程,生成一个新的镜像。

  3. 运行容器:使用 docker run 命令运行刚刚构建的镜像,创建一个容器实例。可以通过命令行参数指定容器的名称、端口映射、环境变量等配置选项。

  4. 访问容器:一旦容器运行起来,可以通过指定的端口或 IP 地址访问容器内的应用程序。可以使用浏览器或其他工具来访问容器中运行的应用程序。

  5. 管理容器:可以使用 Docker 命令行工具对容器进行管理,如停止容器、启动容器、查看容器状态等。可以使用 docker ps 命令查看正在运行的容器列表,使用 docker stop 命令停止容器的运行。

  6. 发布镜像:如果需要在其他环境或其他机器上部署应用程序,可以将构建的镜像发布到 Docker 镜像仓库,如 Docker Hub。其他用户可以从镜像仓库中拉取镜像,并在自己的环境中运行。

这是一个简单的 Docker 使用工作流程,可以根据具体需求和场景进行扩展和定制。Docker 提供了丰富的命令和工具来管理容器和镜像,使得应用程序的构建、交付和部署更加便捷和可靠。

36、什么是docker-compose?

Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。它允许用户使用简单的 YAML 文件来定义应用程序的服务、网络和卷等配置,并通过一个命令来启动、停止和管理这些容器。

通过 Docker Compose,用户可以将多个容器组合在一起,以便在一个命令下同时启动它们,并且它们可以相互通信和共享资源。这使得在开发和测试环境中部署复杂的多容器应用程序变得更加简单和可靠。

以下是一个使用 Docker Compose 的示例:

假设我们有一个 web 应用程序,它由一个前端容器和一个后端容器组成。我们可以使用 Docker Compose 来定义和管理这两个容器。

1. 创建一个名为 docker-compose.yml 的 YAML 文件,定义我们的服务和配置:

version: '3'
services:
  frontend:
    build:
      context: .
      dockerfile: Dockerfile.frontend
    ports:
      - 80:80
  backend:
    build:
      context: .
      dockerfile: Dockerfile.backend
    ports:
      - 8080:8080

在这个示例中,我们定义了两个服务: frontendbackend 。每个服务都有一个构建指令,指定了构建该服务所需的 Dockerfile 文件和上下文。我们还指定了端口映射,将容器内的端口映射到主机上的端口。

2. 创建 Dockerfile 文件:

创建一个名为 Dockerfile.frontend 的文件,用于构建前端容器的镜像。类似地,创建一个名为 Dockerfile.backend 的文件,用于构建后端容器的镜像。

3. 运行容器:

在终端中执行以下命令,使用 Docker Compose 启动我们的应用程序:

docker-compose up

Docker Compose 将根据我们在 docker-compose.yml 文件中定义的配置,构建并启动前端和后端容器。我们可以通过访问 http://localhost 来访问前端应用程序,通过访问 http://localhost:8080 来访问后端应用程序。

通过 Docker Compose,我们可以轻松地管理多个容器的部署和配置。它提供了一种简单而强大的方式来定义和运行复杂的容器化应用程序。

37、什么是Docker镜像联合文件系统?

Docker 镜像联合文件系统(Union File System)是 Docker 使用的一种文件系统技术,用于实现镜像的分层和共享。

镜像联合文件系统基于联合挂载(Union Mounting)的概念,它允许将多个只读文件系统(称为层)以层叠的方式组合在一起,形成一个统一的文件系统视图。

在 Docker 中,每个镜像都由多个层组成。每个层都是只读的,并且包含了文件系统的一部分或完整的文件和目录。每个层都可以在其上添加新的层,形成一个层级结构。

当创建容器时,Docker 会在镜像的基础上添加一个可写层,用于保存容器运行时的变化。这个可写层与镜像的只读层一起组成了容器的文件系统。

镜像联合文件系统的优势在于它的高效性和资源共享。由于镜像的层是只读的,可以在多个容器之间共享,节省存储空间。同时,当多个镜像共享相同的层时,这些层只需要在磁盘上保存一份副本,减少了存储开销。

镜像联合文件系统使得 Docker 镜像的构建和分发变得更加高效和灵活,同时提供了轻量级、可重用的镜像层的概念,使得容器的创建和启动更加快速和资源高效。

38、什么类型的应用程序无状态或有状态更适合Docker容器?

无状态应用程序更适合在 Docker 容器中运行。

无状态应用程序是指不依赖于特定的会话状态或上下文信息来处理请求的应用程序。它们的每个请求都是独立的,可以在任何容器实例之间进行负载均衡和水平扩展。无状态应用程序的特点是可伸缩性好,易于部署和管理。

一些常见的无状态应用程序包括 Web 服务器、负载均衡器、静态网站、API 服务等。这些应用程序可以通过 Docker 容器快速部署、扩展和管理,而且容器的隔离性和轻量性使得它们可以在不同的环境中运行,提供一致的服务。

相比之下,有状态应用程序依赖于会话状态或上下文信息来处理请求。它们需要在多个请求之间保持一致的状态,这使得在容器中运行变得更加复杂。有状态应用程序可能需要使用外部数据存储、数据库或缓存来管理状态,这增加了容器的复杂性和依赖性。

尽管有状态应用程序可以在 Docker 容器中运行,但需要额外的配置和管理来处理状态和持久化数据。通常情况下,有状态应用程序更适合在虚拟机或裸机上运行,以便更好地管理状态和数据存储。

总之,无状态应用程序更适合在 Docker 容器中运行,而有状态应用程序可能需要更复杂的配置和管理来处理状态和持久化数据。

39、Docker 和虚拟机有啥不同?

Docker 和虚拟机是两种不同的虚拟化技术,它们在原理和应用上有一些重要的区别。

  1. 架构差异:虚拟机使用完整的操作系统来运行应用程序,包括操作系统内核和用户空间。而 Docker 则共享宿主机操作系统的内核,每个容器只需包含应用程序及其依赖,使得容器更加轻量级和高效。

  2. 启动时间:虚拟机启动时间较长,需要启动整个操作系统。而 Docker 容器启动非常快速,因为它们只需加载应用程序及其依赖,并与宿主机共享内核。

  3. 资源利用率:由于虚拟机需要运行完整的操作系统,因此它们需要更多的资源,如内存和磁盘空间。相比之下,Docker 容器更加轻量级,共享宿主机的资源,因此资源利用率更高。

  4. 隔离性:虚拟机提供了较高的隔离性,每个虚拟机都有独立的操作系统和用户空间。Docker 容器也提供隔离性,但容器之间共享宿主机的操作系统内核,因此隔离性较虚拟机略低。

  5. 部署和扩展:使用虚拟机时,通常需要预先配置和管理虚拟机的数量和规模。而 Docker 容器可以更灵活地部署和扩展,可以根据需求快速启动、停止和复制容器。

总体而言,虚拟机适合运行有状态的应用程序,需要完整的操作系统和较高的隔离性。Docker 容器适合运行无状态的应用程序,具有快速启动、轻量级和高资源利用率的特点。选择使用虚拟机还是 Docker 容器取决于应用程序的特性、性能需求和部署要求。

40、Docker 安全么?

Docker 提供了一些安全特性,但它的安全性仍然取决于正确的配置和实施。

以下是一些 Docker 的安全特性和最佳实践:

  1. 命名空间和控制组:Docker 使用 Linux 的命名空间和控制组来隔离容器,使每个容器都拥有自己的进程空间、文件系统和网络。这种隔离性有助于防止容器之间的相互干扰。

  2. 镜像签名验证:Docker 支持使用数字签名验证镜像的完整性和来源。通过验证签名,可以确保镜像没有被篡改或来自不受信任的来源。

  3. 访问控制:Docker 提供了一些访问控制机制,如用户和组权限、访问控制列表等。通过限制对 Docker 守护进程的访问和控制容器的访问权限,可以增强安全性。

  4. 安全镜像:在构建镜像时,需要遵循最佳实践,如使用官方镜像或受信任的基础镜像、定期更新镜像、避免在镜像中包含敏感信息等。

  5. 网络安全:确保 Docker 容器和宿主机之间的网络通信是安全的。可以使用网络隔离、防火墙规则、安全组等来限制容器的网络访问。

  6. 持续监控和日志记录:定期监控 Docker 容器的运行状态和日志,及时检测和响应潜在的安全事件。

尽管 Docker 提供了这些安全特性,但安全性仍然需要综合考虑整个容器环境的配置、网络安全、访问控制和镜像管理等方面。正确配置和实施这些安全措施是确保 Docker 安全性的关键。

41、如何清理后台停止的容器?

要清理后台停止的容器,可以使用以下命令:

docker container prune

这个命令会删除所有处于停止状态的容器。它会提示确认后才会执行删除操作。

如果你只想删除特定的容器,可以使用以下命令:

docker container rm <容器ID或容器名称>

<容器ID或容器名称> 替换为要删除的容器的实际ID或名称。

请注意,删除容器将永久删除容器及其相关的数据。在删除之前,请确保你不再需要这些容器。

42、如何查看镜像支持的环境变量?

要查看 Docker 镜像支持的环境变量,可以使用以下命令:

docker inspect --format='{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' <镜像名称或ID>

<镜像名称或ID> 替换为要查看的镜像的实际名称或ID。

这个命令会输出镜像中定义的所有环境变量。每行输出都代表一个环境变量,格式为 key=value

例如,要查看名为 my-image 的镜像支持的环境变量,可以运行以下命令:

docker inspect --format='{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' my-image

这将显示镜像 my-image 中定义的所有环境变量。

43、当启动容器的时候提示∶exec format err or? 如何解决问题?

当启动容器时出现 “exec format error” 错误提示,通常是由于容器镜像与宿主机的操作系统架构不匹配所致。容器镜像是根据特定的操作系统架构构建的,例如 x86、ARM 等,而宿主机的操作系统架构与容器镜像不匹配时会导致该错误。

要解决这个问题,需要确保容器镜像与宿主机的操作系统架构相匹配。以下是一些可能的解决方法:

  1. 检查容器镜像架构:使用 docker inspect 命令查看容器镜像的架构信息。例如, docker inspect <镜像名称或ID> | grep Architecture 。确保容器镜像的架构与宿主机相匹配。

  2. 使用适合宿主机的容器镜像:如果宿主机是 x86 架构,则需要使用针对 x86 架构的容器镜像。同样,如果宿主机是 ARM 架构,则需要使用针对 ARM 架构的容器镜像。

  3. 更新容器镜像:如果容器镜像不匹配宿主机的架构,可以尝试更新容器镜像,确保使用与宿主机相匹配的版本。

请注意,解决这个问题的具体方法取决于宿主机和容器镜像的架构。确保宿主机和容器镜像的架构相匹配是解决 “exec format error” 错误的关键。

44、本地的镜像文件都存放在哪里?

本地的镜像文件存放在 Docker 的镜像存储库中。具体的存储路径取决于你使用的操作系统。

在大多数 Linux 系统中,镜像存储路径为 /var/lib/docker 。在这个路径下,镜像文件存放在 /var/lib/docker/images 目录中。

在 Windows 系统中,镜像存储路径为 C:\ProgramData\Docker\windowsfilter

在 macOS 系统中,镜像存储路径为 /var/lib/docker

请注意,这些路径可能因为 Docker 版本、操作系统版本或自定义配置而有所不同。如果你使用的是 Docker Desktop,你可以在 Docker 设置中查看和修改镜像存储路径。

如果你需要查看或备份镜像文件,建议使用 Docker 提供的命令行工具或第三方工具来管理镜像。直接操作镜像存储路径下的文件可能会导致 Docker 的不稳定或数据损坏。

45、如何退出一个镜像的bash,而不终止它?

使用 exit 命令退出容器的 bash 会终止容器。如果您希望退出容器的 bash 但不终止容器,可以使用 Ctrl-DCtrl-P Ctrl-Q

46、退出容器时候自动删除?

要退出一个正在运行的镜像的 Bash 终端,而不终止该镜像的运行,可以按下组合键 Ctrl + P ,然后再按下 Ctrl + Q 。这个组合键序列会将当前的 Bash 终端分离,但保持镜像的运行状态。

请注意,这种方法适用于以交互模式运行的容器,而不适用于以非交互模式(例如使用 -d 参数)运行的容器。对于以非交互模式运行的容器,可以使用 docker exec 命令来进入容器并执行命令,然后使用 exit 命令退出容器,而不会终止容器的运行。

如果你意外地关闭了终端或退出了 SSH 会话,可以使用 docker attach 命令重新附加到容器的终端。例如:

docker attach <容器名称或ID>

这将重新连接到容器的终端,并恢复之前的会话。

47、怎么快速查看本地的镜像和容器?

你可以使用以下命令快速查看本地的镜像和容器:

  • 查看本地镜像:
docker images

这个命令将列出本地所有的镜像,包括镜像的名称、标签、大小等信息。

  • 查看正在运行的容器:
docker ps

这个命令将列出当前正在运行的容器,包括容器的名称、ID、状态、端口映射等信息。

  • 查看所有的容器(包括已停止的):
docker ps -a

这个命令将列出所有的容器,包括正在运行的和已经停止的容器。

使用这些命令可以快速查看本地的镜像和容器,方便管理和操作。

48、什么是Docker Hub?

Docker Hub 是一个公共的 Docker 镜像仓库,它允许开发者和用户共享、存储和获取 Docker 镜像。Docker Hub 提供了一个集中的平台,使用户可以方便地搜索、下载和上传 Docker 镜像。

在 Docker Hub 上,你可以找到各种各样的官方镜像,包括常用的操作系统、数据库、Web 服务器等。此外,许多开发者和组织也将自己创建的镜像上传到 Docker Hub,供其他人使用和共享。

使用 Docker Hub,你可以轻松地获取所需的镜像,而无需自己构建和配置。可以通过 Docker 命令行界面或者 Docker 图形界面工具来从 Docker Hub 上搜索和下载镜像。

同时,Docker Hub 还提供了一些额外的功能,如构建自动化、版本管理、团队协作等。你可以在 Docker Hub 上创建自己的仓库,将自己的镜像上传到仓库中,并与其他人共享。

总之,Docker Hub 是一个方便的平台,使用户可以轻松地获取、共享和管理 Docker 镜像,为容器化应用开发和部署提供了便利。

49、Docker容器可扩展到多远?

Docker 容器的可扩展性取决于多个因素,包括底层主机的资源、网络配置、应用程序的需求以及容器编排工具的选择。

使用容器编排工具如 Docker Swarm、Kubernetes 等,可以实现在多个主机上自动管理和扩展容器。这些工具提供了自动负载均衡、容器自动伸缩等功能,可以根据应用程序的需求动态调整容器的数量。

当涉及到容器的可扩展性时,以下因素需要考虑:

  1. 资源限制:容器运行在主机上,其可扩展性受限于主机的资源,如 CPU、内存、存储等。如果主机资源有限,容器的数量和规模也会受到限制。

  2. 网络配置:容器之间需要进行通信和协作,因此网络配置对容器的可扩展性至关重要。如果网络配置不合理或网络带宽有限,可能会影响容器的扩展性能。

  3. 应用程序设计:应用程序的设计和架构也会影响容器的可扩展性。如果应用程序能够水平扩展,即能够通过添加更多的容器实例来处理更多的负载,那么容器的可扩展性就会更好。

  4. 容器编排工具:选择适合你需求的容器编排工具,如 Docker Swarm、Kubernetes 等,这些工具提供了自动化的容器管理和扩展功能,可以更方便地实现容器的可扩展性。

总的来说,Docker 容器的可扩展性是相当灵活和强大的,可以根据应用程序的需求和底层资源进行水平扩展,从几个容器实例扩展到数千个甚至更多。但具体的可扩展性取决于具体的场景和配置。

50、Docker容器退出时是否丢失数据?

Docker 容器退出时,容器内的数据默认情况下是不会丢失的。Docker 使用了联合文件系统(UnionFS)的技术,将容器的文件系统分为多个层级,其中容器的可写层是独立的,并且在容器退出后保留。

当容器退出时,容器的状态会被冻结,但容器的文件系统和数据仍然存在。如果你重新启动该容器,它将以先前的状态和数据继续运行。

然而,需要注意的是,如果你删除容器,容器的数据将会丢失。如果你希望保留容器的数据,可以通过挂载主机目录或使用 Docker 数据卷来持久化存储数据。

通过挂载主机目录,你可以将主机上的目录挂载到容器内的指定路径,这样容器内的数据将与主机上的目录同步。这样即使容器被删除,数据仍然存在于主机上。

使用 Docker 数据卷,你可以创建一个专门用于存储容器数据的卷,并将其挂载到容器中。这样即使容器被删除,数据仍然存在于 Docker 数据卷中,可以通过重新挂载到其他容器来访问。

总结而言,Docker 容器退出时不会丢失数据,但如果容器被删除,容器内的数据将会丢失。为了持久化存储数据,可以使用挂载主机目录或 Docker 数据卷的方式。

Docker大厂面试必备题,看这一篇就够了。_第2张图片

你可能感兴趣的:(Docker专栏,docker,面试,容器)