1. 容器中的端口如何映射到宿主机上

在启动容器时,可以通过 -p 参数指定端口映射规则。

示例如下:

docker run -d -p <宿主机端口>:<容器内部端口> <镜像名称>


2. 如何复制宿主机上的文件到容器中

可以使用docker cp指令。

示例如下:

docker cp <宿主机上的文件路径> <容器名或容器ID>:<容器内的目标路径>


3. 如何复制容器中的文件到宿主机

同样可以使用docker cp指令。

示例如下:

docker cp <容器名或容器ID>:<容器内的文件路径> <宿主机上的目标路径>


4. 容器中的数据如何挂载到宿主机上

在 Docker 中,可以通过 挂载 Volume 或 绑定宿主机目录 的方式将容器中的数据持久化并映射到宿主机上。

docker run -d \
  -v /宿主机/目录路径:/容器内挂载路径 \
  --name <容器名称> \
  <镜像名称>

也可以使用命名卷

docker volume create app_data
docker run -d \
  -v app_data:/容器内路径 \
  --name my_container \
  my_image


5. 如何设置容器在异常退出后能够自动启动

以通过设置 重启策略(Restart Policy) 来确保容器在异常退出后能够自动启动。Docker 提供了多种重启策略,适用于不同的使用场景。

docker run -d \
  --restart=<策略名称>[:重试次数] \
  --name <容器名称> \
  <镜像名称>


6. 容器的自启动选项都有哪些值,分别是什么含义

策略

行为说明

no

默认行为,不会自动重启容器

on-failure[:max-retries]

仅当容器退出状态码非0时重启(可选最大重试次数)

on-failure:5

容器失败时最多尝试重启5次

always

总是重启容器,无论退出状态码

unless-stopped

总是重启容器,除非手动停止


7. 什么是时区,一般情况下,容器中的时区是什么

时区(Time Zone) 是指地球上某个区域内统一使用的一种时间标准。由于地球自转一周为24小时,全球被划分为 24个时区,每个时区相差约1小时。

  • UTC(Coordinated Universal Time):世界协调时间,是所有时区的基准时间。

  • 本地时间(Local Time):根据所在地区的时区对 UTC 进行偏移后的时间。例如:

    • 北京时间(UTC+8)

    • 美国东部时间(UTC-5 或 UTC-4,视夏令时而定)

容器本质上是一个隔离的进程环境,它默认继承宿主机的操作系统时区设置。

可以运行以下命令来查看当前时区与时间与时区信息:

docker run --rm alpine date


8. 如何让容器中的时区与宿主机保持一致

可以通过-v挂载宿主机的时区配置文件到文件中。


9. 容器的实现原理是什么

Docker 容器的本质是利用 Linux 内核的 命名空间隔离、资源控制(Cgroups) 和 联合文件系统 来实现轻量级虚拟化。它不是完整的虚拟机,但提供了接近原生的性能和极高的可移植性,非常适合微服务、云原生应用部署。

1. Namespaces(命名空间)

Namespaces 是 Linux 内核提供的一种隔离机制,它为每个容器提供一个独立的运行环境视图。

2. Cgroups(Control Groups)

Cgroups 是 Linux 的另一个核心功能,用于对进程组进行资源限制和监控。

3. Union File System(联合文件系统)

Docker 使用 UnionFS(如 AUFS、OverlayFS)来构建容器的文件系统。这种文件系统允许将多个只读层与一个可写层叠加,形成一个统一的文件系统视图。

4. 容器运行时引擎(如 containerd、runc)

Docker 并不直接操作内核,而是通过容器运行时(如 containerd 或 runc)来管理容器生命周期。

  • containerd:负责管理容器的启停、日志、快照等

  • runc:负责实际调用内核接口启动容器进程


10. Dockerfile是什么

Dockerfile 是一个文本文件,其中包含了一系列指令(instructions),用于定义如何构建一个 Docker 镜像(image)。它是容器化应用的标准构建描述文件,类似于“菜谱”,告诉 Docker 引擎如何一步步组装镜像。


11&12. Dockerfile中常用命令有哪些,比如FROM、RUN,这些命令都有什么含义,什么场景下使用

常见 Dockerfile 指令

指令

说明

FROM

指定基础镜像,如 FROM ubuntu:20.04

RUN

在镜像中执行命令,如安装软件包 RUN apt-get update && apt-get install -y python3

COPY

将本地文件复制到镜像中,如 COPY app.py /app/app.py

ADD

类似 COPY,但支持自动解压压缩包和远程 URL 下载(不推荐在生产中使用)

WORKDIR

设置工作目录,后续命令基于该目录执行

CMD

容器启动时默认执行的命令(可被运行时覆盖)

ENTRYPOINT

容器启动命令入口,常与 CMD 结合使用

EXPOSE

声明容器运行时监听的端口(仅文档用途,不会实际映射端口)

ENV

设置环境变量

VOLUME

声明挂载点,用于持久化数据或共享文件

LABEL

添加元数据,如作者、版本信息等


13. COPY和ADD有什么区别

特性

COPY

ADD

基本功能

复制本地文件/目录到镜像中

复制文件、解压压缩包或下载远程文件

支持远程 URL

❌ 不支持

✅ 支持(不推荐用于生产)

自动解压

❌ 不会自动解压文件

✅ 支持自动解压 .tar, .gz, .xz, .bz2 等格式

推荐用途

✅ 推荐用于生产环境

⚠️ 不推荐用于生产(行为不可控)

构建缓存友好性

✅ 更好地支持构建缓存优化

❌ 解压或下载可能导致缓存失效


14. CMD和ENTRYPOINT有什么区别

特性

CMD

ENTRYPOINT

用途

设置默认命令及参数(可被覆盖)

设置容器启动入口命令(不可轻易覆盖)

是否可覆盖

✅ 可在运行时通过 docker run <镜像> <新命令> 覆盖

❌ 默认不会被覆盖,除非使用 --entrypoint

格式支持

可以是 shell 格式或 exec 格式

推荐使用 exec 格式(JSON 数组)

多个指令

只有最后一个生效

只有最后一个生效


15. 什么是环境变量,有什么应用场景

环境变量(Environment Variables) 是操作系统或运行环境中提供的一组动态值,用于影响程序的运行行为。它们是键值对形式的字符串,存储在系统或进程的环境中。

  • 作用:为程序提供配置信息、路径设置、用户身份等运行时所需的数据。

  • 生命周期:通常只在当前会话或进程中有效,除非持久化保存(如写入 .env 文件或 Dockerfile 中使用 ENV 指令)。

特点

描述

全局性

对当前 shell 或容器中的所有进程可见

动态性

可以在运行时修改

可继承

子进程可以继承父进程的环境变量

安全性

不应包含敏感信息(除非加密处理)


16. Dockerfile中如何指定环境变量

通过使用 ENV 变量名 变量

以下是示例:

ENV TZ Asia/Shanghai


17. 启动容器时如何在命令行中设置环境变量

可以通过-e 变量名=变量来设置

例如:

-e APP_ENV=production


18. 基于Nginx镜像制作一个Docker,要求替换首页为自己制作的首页

index.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的定制Nginx首页</title>
</head>
<body>
    <h1>欢迎访问我的定制Nginx首页</h1>
    <p>这是基于官方 Nginx 镜像构建的自定义镜像。</p>
</body>
</html>     

Dockerfile:

# 使用官方 Nginx 镜像作为基础镜像(推荐显式指定版本)
FROM nginx:latest

# 设置工作目录
WORKDIR /usr/share/nginx/html

# 替换默认首页
COPY index.html index.html

# 暴露 80 端口(默认已暴露)
EXPOSE 80

# 容器启动命令(默认已由 nginx 镜像定义)
CMD ["nginx", "-g", "daemon off;"]

在包含Dockerfile与index.html的目录下执行docker build


19. 启动自己制作的镜像,并设置宿主机上的端口为23456,并挂载Nginx的配置目录到宿主机

docker run -d -p 23456:80 --name custom-nginx-container my-custom-nginx


20. 启动容器时如何为容器指定名称,指定名称有什么作用

在使用--name作为参数时可以指定名称,指定有意义的名称有助于更好地管理容器。

以他人的幸福为幸福,以他人的享乐为享乐。