1. Docker 常用命令(增删改查,分组说明)
镜像相关
-
docker images:列出本地镜像。 -
docker pull <repo>:<tag>:拉取镜像。 -
docker build -t name:tag .:根据 Dockerfile 构建镜像。 -
docker rmi <image>:删除镜像(-f强制删除)。 -
docker save -o file.tar <image>:保存镜像为 tar。 -
docker load -i file.tar:从 tar 加载镜像。 -
docker import/docker export:export导出容器文件系统(不包含镜像元数据),import从该文件生成镜像。
容器相关(常用增删改查)
-
docker ps:列出运行容器。 -
docker ps -a:列出所有容器(含已退出)。 -
docker create:创建容器但不启动。 -
docker run [options] image [cmd]:创建并运行容器(等同 create + start)。 -
docker start/stop/restart <container>:启动/停止/重启已创建容器。 -
docker rm <container>:删除容器(-f强制)。 -
docker logs <container>:查看容器日志。 -
docker exec -it <container> /bin/bash:进入正在运行的容器(类似 ssh)。 -
docker attach <container>:附着到容器主进程的 stdio(不常用于交互式 shell)。 -
docker cp <src> <dest>:在宿主机与容器间复制文件。 -
docker inspect <container|image>:查看低层元数据(JSON)。 -
docker top <container>:查看容器内进程。 -
docker stats(你写成 statas):实时显示容器资源使用(CPU/内存/网络)。 -
docker rm $(docker ps -aq):批量删除容器(示例)。
网络与卷
-
docker network ls:列出网络。 -
docker network create <name> [--driver bridge|overlay|host]:创建网络。 -
docker volume create vol1:创建命名卷。 -
docker volume ls/docker volume rm:管理卷。
2. 常用 docker run 选项解释:-i -t -d 等
-
-i(--interactive):保持 STDIN 打开(用于交互)。 -
-t(--tty):分配伪终端(TTY),让 shell 显示漂亮的提示符。 -
-it:常组合使用,进入交互式 shell。 -
-d(--detach):后台运行容器(守护模式)。 -
-p hostPort:containerPort:映射端口(指定端口)。 -
-P(大写):暴露容器在 Docker 随机选择的主机端口(映射所有 EXPOSE 的端口)。 -
--name:为容器指定名字。 -
--rm:容器退出自动删除。 -
-v hostPath:containerPath:绑定挂载宿主目录(或-v volname:/data使用命名卷)。
示例:
3. Dockerfile 指令与典型写法(常见指令、示例和分阶段构建)
常见指令
-
FROM <image> [AS name]:基础镜像。可用于多阶段构建(AS builder)。 -
RUN <command>:在镜像构建时执行命令(安装依赖、构建等)。 -
COPY <src> <dest>/ADD <src> <dest>:复制文件到镜像(差异见下面)。 -
WORKDIR <dir>:设置工作目录(后续相对路径均基于此)。 -
ENV <key>=<value>:设置环境变量。 -
EXPOSE <port>:声明容器对外暴露端口(仅文档化作用)。 -
CMD ["executable","param"]:容器运行时的默认命令(可被docker run <cmd>覆盖)。 -
ENTRYPOINT ["executable","param"]:设置容器主命令,CMD作为默认参数传入。 -
USER <user>:指定运行用户。 -
VOLUME ["/data"]:声明挂载点(卷)。 -
ONBUILD:触发下一阶段构建时运行(不常用)。
多阶段构建(减少镜像体积)

4. CMD 与 ENTRYPOINT 的区别(必须理解)
-
ENTRYPOINT:设置容器的不可变主命令(容器启动时始终执行)。 -
CMD:提供默认参数或默认命令(如果docker run指定命令,则CMD被覆盖,或作为ENTRYPOINT的参数)。
常见用法:
- 使用
ENTRYPOINT固定程序,CMD提供默认参数:

- 如果只写
CMD ["bash"],使用docker run imagename /bin/sh会覆盖CMD。
5. COPY 与 ADD 的区别
-
COPY:仅做本地文件/目录的拷贝(简单、可预测)。 -
ADD:功能更强,支持自动解压.tar.gz,且可以接受远程 URL(把远程资源下载到镜像中)。
建议 :除非需要ADD的额外功能(自动解压或从 URL 下载),尽量使用COPY(语义更明确、更可控)。
6. 容器 vs 虚拟机(对比、优劣)
-
内核层面:容器共享宿主机内核(进程级隔离);虚拟机有独立内核(完整操作系统)。
-
启动速度:容器:秒级;虚拟机:分钟级(或更长)。
-
资源开销:容器接近原生;虚拟机有更高开销(虚拟化层)。
-
隔离强度:VM > 容器(容器需要额外安全机制)。
-
部署密度:容器可以运行上百个实例;VM 通常较少。
-
使用场景:容器适合微服务、CI/CD、快速部署;VM 适合需要强隔离或特殊内核/内核模块的场景。
7. Docker 的底层原理(精简要点)
-
Namespace(命名空间):提供资源隔离(PID、NET、MNT、IPC、UTS、USER 等)。
pid:进程隔离;net:网络隔离;mnt:文件系统视图;user:UID/GID 隔离。
-
cgroups(控制组):限制/计量/隔离进程组的资源(CPU、内存、I/O 等)。
-
UnionFS(分层文件系统):镜像采用分层,只写上层(如 overlay2)。
-
Container Engine(守护进程) :
dockerd管理镜像、容器、网络、存储。 -
Registry:镜像仓库(Docker Hub、私有仓库)。
8. Docker 的工作流程(客户端-服务端)
-
用户在 CLI(docker client)执行命令。
-
客户端将请求发送给
dockerd(daemon)。 -
dockerd检查本地镜像缓存:-
存在 → 用镜像创建容器并运行。
-
不存在 → 向 Registry 拉取镜像,然后创建容器。
-
-
dockerd配置网络、卷、cgroups、命名空间等并启动进程。
简化:client -> dockerd -> image(本地/registry) -> container(runtime)
9. 容器如何对外暴露服务(-p vs -P 等)
-
-p hostPort:containerPort:把容器端口映射到宿主指定端口(常用)。 -
-P:把容器所有被EXPOSE的端口随机映射到宿主端口(由 Docker 随机分配)。 -
网络模式:
-
bridge(默认):容器通过桥接网络访问外部;端口映射必需。
-
host:容器使用宿主主机网络命名空间(端口直接暴露,无需映射)。
-
none:没有网络。
-
container:<name|id>:与已有容器共享网络命名空间。
-
overlay:跨主机的网络(需 Swarm 或 Kubernetes CNI/插件配合)。
-
注意:host 模式性能略优但隔离弱;bridge 常用于单机部署。
10. Docker 网络类型与特点(常问点)
-
bridge(网桥) :默认,容器处于私有网络,通过 NAT 与宿主通信,需
-p映射端口。 -
host(主机网络):容器和宿主共享网络栈,端口冲突要注意,适合高性能/低延迟场景。
-
overlay(覆盖网络):跨宿主机容器互联(Swarm、Kubernetes 等使用)。
-
macvlan:容器直接上三层网络,容器获得独立 MAC/IP(用于某些网络隔离要求)。
-
none:禁用网络(用于极端隔离或特定安全场景)。
11. docker-compose(做什么、常见写法)
-
用途:用 YAML 文件定义和运行多容器应用(服务编排、依赖、网络、卷、环境变量)。
-
常见文件 :
docker-compose.yml -
示例 :

-
常用命令 :
docker-compose up -d、docker-compose down、docker-compose ps、docker-compose logs。 -
场景:本地开发、CI 测试、小型生产环境(或与 Swarm 集成)。
12. 除了 Docker,是否用过其他容器运行时?------containerd 简介与常用命令
-
containerd:由 Docker 分离出的轻量级容器运行时,实现镜像传输、存储和容器生命周期管理。与 Docker 比较:
-
Docker = client + dockerd(包含 containerd)
-
containerd 更纯粹、更轻,常与 CRI(Kubernetes Container Runtime Interface)一起被 Kubernetes 使用(kubelet -> containerd)。
-
-
优点:更轻量、对 Kubernetes 更友好(直接暴露 CRI)、更适合云原生场景。
-
常见 CLI:
-
ctr images ls/ctr images pull <image>:镜像管理(ctr是 containerd 自带调试工具)。 -
ctr containers list/ctr tasks ls:容器 & 任务查看。 -
crictl:当 containerd 作为 CRI runtime 时,常用crictl(Kubernetes 工具),命令包括:crictl images、crictl pull、crictl ps、crictl runp等。
-
-
示例 (基础):

(注:ctr 更多为低层工具,生产多由 higher-level runtimes or CRI shim 管理。)
13. 常见面试/实操要点与陷阱提示
-
docker exec -it是常用进入容器方式(不建议用docker attach来做 shell 登录)。 -
构建镜像尽量减少层数、善用
.dockerignore减少上下文体积。 -
COPY优于ADD(除非用到解压或 URL 下载)。 -
CMD可被docker run覆盖;ENTRYPOINT更"固定"。 -
生产建议使用
--restart策略(如--restart unless-stopped)保证容器失败自动重启。 -
使用
docker network为服务创建自定义网络,利于服务发现与隔离。 -
留意
docker system df/docker system prune清理磁盘占用。 -
容器安全:使用最小权限运行(
USER指令)、限制 capability、使用 seccomp/apparmor/profile。
14. 常用命令速查表(便于记忆)
-
列容器:
docker ps -a -
启动:
docker start <id|name> -
停止:
docker stop <id|name> -
进入:
docker exec -it <container> /bin/bash -
查看日志:
docker logs -f <container> -
查看镜像:
docker images -
删除容器:
docker rm <container> -
删除镜像:
docker rmi <image> -
构建:
docker build -t name:tag . -
运行并映射端口:
docker run -d -p 8080:80 name -
查看资源:
docker stats -
查看详细信息:
docker inspect <container|image> -
清理无用资源:
docker system prune -a(危险:删除所有未使用镜像)