Docker容器技术核心知识点精要

学海无涯,志当存远。燃心砺志,奋进不辍。

愿诸君得此鸡汤,如沐春风,事业有成。

若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌!

1. 什么是 Docker 容器?

Docker容器是轻量级、可移植的软件单元,基于Docker镜像创建。它在隔离的进程空间中运行应用程序,包含代码、运行时环境、系统工具和依赖库。容器共享主机操作系统内核,启动快、资源占用低。


2. Docker的应用场景

  • ✅ 微服务部署:独立部署/扩展单个服务

  • ✅ 持续集成/交付 (CI/CD):标准化构建、测试环境

  • ✅ 开发环境统一:解决“在我机器上能运行”问题

  • ✅ 云原生应用:Kubernetes等平台的基础单元

  • ✅ 快速搭建复杂环境(如数据库、中间件集群)


3. Docker 架构

Docker采用客户端-服务端 (C/S) 架构

  • Docker Client:用户命令行工具 (docker)

  • Docker Daemon (服务端):管理容器、镜像、网络等核心服务

  • Registry:镜像仓库(如Docker Hub)

  • Containers & Images:容器运行实例及其静态模板


4. Docker 核心组件

组件 作用
Docker Daemon 常驻后台进程,管理容器生命周期、镜像存储、网络等
Docker Client 用户与Daemon交互的接口(CLI或API)
Images 只读模板,包含应用和运行环境(分层存储)
Containers 镜像的运行实例(可读写的容器层)
Registry 镜像仓库(公共如Docker Hub,私有如Harbor)
Dockerfile 定义镜像构建步骤的脚本文件

5. 如何调整Docker镜像仓库?

修改镜像源为国内仓库(加速下载):

// 编辑 /etc/docker/daemon.json
{
  "registry-mirrors": ["https://<镜像加速器地址>"]  
  // 示例:阿里云 "https://xxxx.mirror.aliyuncs.com"
}
sudo systemctl restart docker  # 重启生效


6. 如何查看Docker相关进程?

docker ps          # 查看运行中的容器
docker ps -a       # 查看所有容器(含已停止)
docker stats       # 实时监控容器资源占用
top -p $(pgrep dockerd)  # 查看Docker Daemon进程资源使用

7. 虚拟化 vs 容器化区别

特性 虚拟化 (VM) 容器化 (Docker)
隔离级别 硬件级虚拟化 (Hypervisor) 进程级隔离 (cgroups/namespaces)
Guest OS 每个VM需独立OS内核 共享主机OS内核
启动速度 慢(分钟级) 快(秒级)
资源占用 高(内存、CPU冗余) 低(按需分配)
镜像大小 GB级 MB级

8. 什么是 Docker Swarm?

Docker Swarm是Docker官方提供的轻量级容器编排工具,用于管理多主机Docker集群。支持:

  • 集群节点管理(Manager/Worker)

  • 服务部署、滚动更新

  • 负载均衡与服务发现

  • 故障恢复(自动重启容器)


9. Docker镜像加载原理

  • 分层存储 (Layer)
    镜像由多层只读文件系统叠加而成(每层对应Dockerfile的一条指令)。

  • 联合挂载 (UnionFS)
    启动容器时,在镜像层之上添加一个可写层(容器层),所有修改在此层进行。

  • 写时复制 (Copy-on-Write)
    当修改文件时,从镜像层复制到容器层进行修改,保证底层只读性。


10. 构建Dockerfile流程

  1. 编写 Dockerfile

    FROM ubuntu:20.04             # 基础镜像
    RUN apt update && apt install -y python3  # 安装依赖
    COPY app.py /app              # 复制代码
    CMD ["python3", "/app/app.py"] # 启动命令
  2. 构建镜像

    docker build -t my-app:1.0 .  # 当前目录构建,标签为my-app:1.0
  3. 运行容器

    docker run -d --name my-container my-app:1.0

11. Docker执行Dockerfile的大致流程

  1. 解析Dockerfile:逐行读取指令

  2. 初始化构建环境:创建临时构建上下文

  3. 执行指令序列

    • FROM:拉取基础镜像(如未本地存在)

    • RUN/COPY/ADD:创建新镜像层执行操作

    • ENV/WORKDIR:设置元数据

  4. 缓存机制:检查指令是否匹配缓存(若相同指令且上下文未变则复用层)

  5. 生成最终镜像:合并所有层并添加镜像配置(CMD/ENTRYPOINT等)

12. 推送镜像到Registry的命令

docker push <镜像名>:<标签>
# 示例:
docker push my-registry.com/app:v1.0

需先通过 docker login 认证仓库权限

13. Docker镜像是什么?

  • 只读模板:包含应用程序代码、依赖库、环境变量和配置文件

  • 分层结构:由多个只读层(Layer)叠加组成

  • 静态定义:提供容器运行所需的基础文件系统快照

14. 获取镜像的常规操作

docker pull <镜像名>:<标签>   # 默认从Docker Hub拉取
docker pull registry.private.com/app:v2  # 从私有仓库拉取

标签省略时默认使用 :latest

15. 什么是base镜像?

  • 基础镜像:Dockerfile中 FROM 指定的初始层

  • 最小化OS:通常为精简版操作系统(如 alpineubuntu

  • 不依赖父镜像:其Dockerfile以 FROM scratch 开头(空镜像)

16. Docker镜像分层

  • 层级堆叠:每个Dockerfile指令(RUN/COPY等)生成新的只读层

  • 联合挂载:启动容器时所有层按顺序挂载为单一文件系统视图

  • 唯一ID:每层有独立的哈希标识(内容变更则ID改变)

17. 分层结构的优势

  • 存储效率:相同层可被多个镜像/容器共享

  • 快速构建:仅重建变更层(利用缓存机制)

  • 减小体积:基础层(如OS)只需存储一次

  • 版本追踪:层哈希值天然支持镜像版本控制

18. Copy-on-Write (COW)

  • 写时复制机制:当容器需要修改文件时:

    1. 定位文件所在镜像层

    2. 复制该文件到容器可写层

    3. 所有修改作用于副本(原始镜像层保持不变)

  • 关键特性:保证镜像层不可变性,提升资源利用率

19. 请简述Docker中可写的容器层的概念

  • 位于镜像层之上:容器启动时创建的空白读写层

  • 生命周期

    • 所有文件修改存储于此层(增删改)

    • 容器删除时该层销毁(数据不持久化)

  • 临时性:需通过卷(Volume)或绑定挂载实现数据持久化

20. Commit镜像操作

docker commit [选项] <容器ID> <新镜像名>:<标签>
# 示例:
docker commit -m "Added config" c3ab8e my-app:v2

选项:
-m:提交信息(类似Git commit)
-a:指定作者

21. 使用docker commit手动构建镜像

1.运行基础容器:
docker run -it ubuntu:20.04 /bin/bash
2.在容器内修改:
apt update && apt install -y python3
echo "print('Hello')" > app.py
3.退出容器并提交:
docker commit <容器ID> my-python-app:v1
4.验证新镜像:
docker run my-python-app:v1 python3 app.py

⚠️ 注意:生产环境推荐使用可复现的Dockerfile而非commit

22. 什么是Docker引擎?

Docker引擎是核心运行时组件,采用C/S架构:

  • Docker Daemon:常驻后台进程,管理容器生命周期、镜像、网络等

  • Docker Client:用户交互接口(CLI/REST API)

  • containerd:容器运行时(管理容器执行、镜像分发)

  • runc:底层容器运行时(遵循OCI标准创建容器)


23. 访问正在运行的容器

docker exec -it <容器ID或名称> <命令>
# 示例:进入容器的bash终端
docker exec -it nginx-container /bin/bash

-i:保持标准输入打开,-t:分配伪终端


24. 列出所有运行中容器

docker ps      # 仅显示运行中的容器
docker ps -a   # 显示所有容器(包括已停止的)

25. Docker容器生命周期

  1. Createddocker create 创建容器(文件系统初始化)

  2. Runningdocker start/run 启动进程

  3. Pauseddocker pause 暂停进程(CPU/内存冻结)

  4. Stoppeddocker stop 发送SIGTERM优雅终止

  5. Restarteddocker restart 重新启动

  6. Destroyeddocker rm 删除容器及存储层


26. Docker对象标签(Labels)

  • 键值对元数据:附加到镜像/容器/网络等对象

  • 作用

    • 分类管理(如env=prodteam=devops)

    • 自动化策略(配合监控/日志工具过滤)

  • 设置方式

    Dockerfile

    LABEL version="1.0" maintainer="[email protected]"

27. docker create 命令作用

创建容器但不立即启动

docker create --name temp-container nginx:alpine
  • 预分配文件系统(初始化可写层)

  • 配置网络/卷等参数

  • 需手动执行 docker start 启动


28. 查看容器的文件目录

docker exec <容器ID> ls /app  # 查看特定目录
docker diff <容器ID>          # 查看文件系统变更(A添加/D删除/C修改)
# 或进入容器交互终端:
docker exec -it <容器ID> /bin/sh

29. 容器与主机间数据拷贝

# 主机 → 容器
docker cp /host/file.txt <容器ID>:/container/path/  

# 容器 → 主机
docker cp <容器ID>:/container/logs/ /host/backup/

30. 启动Nginx容器命令

docker run -d --name nginx-server \
  -p 8080:80 \                    # 指定端口映射(主机8080→容器80)
  -v $(pwd)/html:/usr/share/nginx/html \  # 挂载本地html目录
  nginx:latest

随机端口映射:使用 -P 代替 -p 8080:80(自动绑定主机随机端口到容器80)


31. Dockerfile常见指令

指令 用途
FROM 指定基础镜像
RUN 执行命令并创建新层
COPY/ADD 复制文件到镜像
CMD 容器启动默认命令
ENTRYPOINT 容器入口点(可执行文件)
ENV 设置环境变量
WORKDIR 设置工作目录
EXPOSE 声明监听端口
VOLUME 定义匿名卷

32. Dockerfile指令详解

  • FROM:必须为首条指令,指定构建起点(如ubuntu:22.04

  • RUN:在镜像层执行命令(如RUN apt install -y python3

  • COPY:复制主机文件到镜像(不支持URL解压)

  • ADD:类似COPY,但支持URL和自动解压tar包

  • CMD:容器启动时执行的默认命令(可被docker run覆盖)

  • ENTRYPOINT:容器的主进程(与CMD配合使用)

  • ENV:设置持久化环境变量(如ENV APP_HOME=/app

  • WORKDIR:设置后续指令的工作路径(类似cd


33. Docker构建流程

  1. 读取Dockerfile:解析指令序列

  2. 初始化构建上下文:发送当前目录文件到Daemon

  3. 逐层构建

    • 检查指令缓存(未命中则执行)

    • RUN/COPY等指令生成新镜像层

  4. 生成最终镜像:添加元数据(CMD/ENV等)并输出镜像ID


34. COPY vs ADD

特性 COPY ADD
复制本地文件
URL下载 ✅(自动下载到镜像)
自动解压 ✅(支持tar/gzip/bzip2/xz)
最佳实践 推荐用于普通文件复制 仅需自动解压或远程下载时使用

35. Docker Daemon原理

  • 常驻进程dockerd 监听UNIX套接字(/var/run/docker.sock

  • 核心功能

    • 镜像管理(构建/拉取/存储)

    • 容器生命周期管理(create/start/stop)

    • 网络驱动(bridge/host/none等)

    • 存储驱动(overlay2、aufs等管理分层)

  • 依赖组件:将容器操作委托给containerdrunc


36. Docker vs 传统虚拟机

维度 Docker容器 传统虚拟机
虚拟化目标 进程级隔离 硬件级虚拟化
Guest OS 共享主机内核 独立OS内核(每VM一份)
启动速度 秒级 分钟级
资源开销 低(无Hypervisor层) 高(需预留资源)
隔离性 较弱(内核共享) 强(完全隔离)

37. Docker vs LXC

特性 Docker LXC (原生Linux容器)
核心能力 基于LXC改进 直接使用cgroups/namespaces
镜像格式 分层镜像(UnionFS) 完整文件系统模板
可移植性 强(跨环境一致) 弱(依赖主机环境)
生态系统 丰富(Hub/K8s集成) 较简单
部署单元 单进程模型(推荐) 可运行完整系统

38. Docker本地镜像存储位置

  • 默认路径

    • Linux:/var/lib/docker/image/<存储驱动>/

    • Windows:C:\ProgramData\docker\windowsfilter\

  • 关键目录

    • overlay2/:镜像分层文件(使用overlay2驱动时)

    • imagedb/:镜像元数据数据库

  • 查看命令

    docker info | grep "Docker Root Dir"

39. 启动容器提示"exec format error"的解决方法

原因

  1. 镜像架构与宿主机不匹配(如ARM镜像运行在x86主机)

  2. Dockerfile中ENTRYPOINT/CMD指向不存在的二进制文件

  3. 启动脚本格式错误(如Windows换行符在Linux容器运行)

解决步骤

  1. 检查镜像架构:docker inspect --format='{{.Architecture}}' <镜像>

  2. 显式指定平台:docker run --platform linux/amd64 ...

  3. 验证启动命令:docker run --entrypoint sh <镜像> 进入容器检查

  4. 转换脚本格式:dos2unix startup.sh


40. 退出容器bash而不终止容器

使用 分离快捷键

# 在容器交互终端中按顺序按下
Ctrl + P  然后  Ctrl + Q

直接输入exitCtrl+D会终止容器进程


41. 批量清理临时镜像文件

docker image prune  # 删除悬空镜像(无标签)
docker image prune -a  # 删除所有未被容器使用的镜像
docker system prune  # 清理镜像/容器/网络/构建缓存(加-f强制)

42. 查看镜像环境变量

docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' <镜像名>
# 或运行容器时打印:
docker run <镜像> env

43. 容器退出后数据是否丢失?

  • 不会立即丢失

    • 停止的容器文件系统仍存在(通过docker ps -a可见)

    • 数据存储在容器可写层,直到容器被删除(docker rm

  • 持久化建议

    • 重要数据使用-v挂载卷(Volume)绑定目录

    • 数据库等有状态服务必须使用持久化存储


44. 快速停止所有运行中容器

docker stop $(docker ps -q)  # 获取所有运行容器ID并停止

45. 清理已停止的容器

docker container prune  # 交互式删除所有停止的容器
docker rm $(docker ps -a -q -f status=exited)  # 批量删除已退出容器

46. 什么是Docker Hub?

Docker官方的公共镜像仓库

  • 存储海量官方/社区镜像(如nginx, mysql等)

  • 提供镜像托管、自动构建、漏洞扫描服务

  • 支持免费账户创建私有仓库(1个私有库)

  • 访问地址:https://hub.docker.com


47. Docker容器隔离机制

利用Linux内核特性实现隔离:

隔离类型 技术实现
进程隔离 PID Namespace
网络隔离 Network Namespace
文件系统 Mount Namespace
用户权限 User Namespace
资源限制 cgroups (CPU/内存/IO)

48. Docker镜像仓库(Repository)

  • 逻辑概念:同一镜像的不同版本集合(如ubuntu仓库包含20.04/22.04等)

  • 命名规范[registry_host]/[namespace]/repository_name:tag

  • 示例docker.io/library/nginx:latest


49. Docker注册服务器(Registry)

  • 服务实体:存储和分发镜像的服务器程序

  • 类型

    • 公有Registry:Docker Hub, Quay.io

    • 私有Registry:Harbor, Docker Registry

  • 核心功能:处理docker push/pull请求


50. 什么是Harbor?

VMware开源的企业级私有镜像仓库

  • 核心功能:镜像存储、RBAC权限控制、漏洞扫描

  • 扩展特性:镜像复制、Web UI管理、审计日志

  • 适用场景:企业CI/CD流水线、合规安全要求高的环境


51. Harbor的特性

  1. 多租户支持:项目级权限管理

  2. 漏洞扫描:集成Clair/Trivy

  3. 镜像签名:Notary组件保障完整性

  4. 跨仓库复制:多数据中心同步

  5. GC机制:自动清理过期镜像

  6. LDAP/AD集成:统一身份认证


52. Harbor的构成

组件 功能
Core API/UI服务
Registry 镜像存储(Docker Registry)
Job Service 镜像复制/扫描任务调度
Portal Web管理界面
Database 元数据存储(PostgreSQL)
Redis 缓存会话/任务队列

53. 给镜像打标签

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 示例:
docker tag nginx:latest my-registry.com/project/nginx:v1.0

54. 镜像导入导出

导出镜像

docker save -o image.tar image_name:tag  # 保存为tar文件

导入镜像

docker load -i image.tar  # 从tar文件加载

55. export/import vs save/load区别

命令 对象 保留信息 用途
docker export 容器 仅文件系统(无元数据) 迁移容器当前状态
docker import 容器→镜像 生成新镜像(丢失历史层)
docker save 镜像 完整镜像(含所有层和元数据) 备份/迁移完整镜像
docker load 镜像 恢复完整镜像结构

56. 非Linux系统运行容器

  • macOS/Windows
    使用Docker Desktop(底层创建Linux虚拟机)

    • macOS:HyperKit虚拟化

    • Windows:Hyper-V/WSL2

  • 关键限制
    只能运行与虚拟机内核兼容的Linux容器


57. docker port映射报错解决

错误原因
容器未暴露端口或映射配置错误
解决步骤

  1. 检查容器是否监听端口:docker exec <容器> netstat -tuln

  2. 运行容器时显式映射端口:docker run -p 8080:80 ...

  3. 若使用-P随机映射,确认Dockerfile有EXPOSE 80


58. 单容器运行多进程

  • 可行但违反最佳实践

    • 可通过Supervisor/Systemd管理多进程

  • 生产环境不推荐

    1. 违背单一职责原则

    2. 日志收集困难

    3. 故障隔离性差

    4. 资源限制不精确

应拆分为多个容器通过网络通信


59. 控制CPU份额

使用--cpu-shares设置相对权重(默认1024):

docker run -d --cpu-shares 512 app1  # 获得50%的CPU时间
docker run -d --cpu-shares 1024 app2 # 获得100%基准权重

60. 控制内存份额

docker run -d --memory 500m app      # 硬限制500MB内存
docker run -d --memory-reservation 300m app # 软限制300MB

61. 控制磁盘配额

限制容器磁盘空间

docker run -it --storage-opt size=10G ubuntu  # 限制10G

需底层文件系统支持

  • Devicemapper:直接配置dm.basesize

  • Btrfs/ZFS:原生支持配额


62. "Invalid registry endpoint"错误解决

原因:私有仓库未正确配置
解决

  1. 检查仓库地址格式:http(s)://host:port

  2. 对于非HTTPS仓库,在/etc/docker/daemon.json添加:

    { "insecure-registries": ["my-registry:5000"] }
  3. 重启Docker:systemctl restart docker


63. Docker配置文件

  • 主配置文件/etc/docker/daemon.json

  • 修改步骤

    1. 编辑配置文件

    2. 重载配置:systemctl reload docker

    3. 或重启:systemctl restart docker

  • 关键配置项

    {
      "registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
      "data-root": "/data/docker",
      "log-driver": "json-file"
    }

64. 更改默认存储路径

  1. 停止Docker:systemctl stop docker

  2. 迁移数据:rsync -av /var/lib/docker/ /new/path

  3. 修改配置:

    // /etc/docker/daemon.json
    { "data-root": "/new/path" }
  4. 重启:systemctl start docker


65. UnionFS (联合文件系统)

核心机制

  • 将多个目录(层)挂载到单一虚拟文件系统

  • 写时复制(CoW)
    修改文件时从只读层复制到可写层

  • 驱劢实现
    Overlay2(推荐)、AUFS、DeviceMapper


66. 无状态 vs 有状态应用容器化

类型 适合度 示例 原因
无状态 ★★★★★ Web服务、API网关 易扩展、无持久化数据依赖
有状态 ★★★☆☆ 数据库、消息队列 需持久化存储+稳定网络标识
最佳实践
  • 有状态服务需配合持久卷StatefulSet(K8s)

67. 退出容器时自动删除

运行容器时添加 --rm 参数:

docker run -it --rm ubuntu bash  # 容器退出后自动删除

68. 容器退出时数据丢失问题

  • 临时容器层数据丢失:默认容器层(可写层)在容器删除后销毁

  • 持久化方案

    1. 挂载卷(Volume)-v my_volume:/data

    2. 绑定主机目录-v /host/path:/container/path

    3. 共享数据容器:通过 --volumes-from 复用


69. Docker部署Java服务完整步骤

  1. 编写Dockerfile

    FROM openjdk:11-jre
    COPY target/app.jar /app.jar
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  2. 构建镜像:(后面有个. 是 Linux/Unix 系统中表示“当前目录”的符号:从当前目录作为构建上下文,读取 Dockerfile 并构建镜像)

    docker build -t java-app:v1 .
  3. 运行容器

    docker run -d -p 8080:8080 --name my-java-app java-app:v1
  4. 验证curl http://localhost:8080/health


70. Docker的CMD指令

  • 定义容器默认启动命令

    CMD ["executable", "arg1", "arg2"]  # exec格式(推荐)
    CMD command arg1 arg2                # shell格式
  • 可被覆盖docker run <镜像> <新命令>

  • 与ENTRYPOINT协作

    • ENTRYPOINT 定义固定可执行文件

    • CMD 提供默认参数


71. Docker Compose

多容器应用编排工具

  • 通过YAML文件定义服务/网络/卷

  • 一键启动/停止整个应用栈

  • 支持服务依赖、环境变量、扩缩容

  • 典型文件:docker-compose.yml


72. Docker Compose安装

  1. Linux安装

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
  2. 验证docker-compose --version


73. 修改Docker容器IP范围

  1. 修改默认网络配置:

    # 停止Docker
    systemctl stop docker
    # 修改配置文件 /etc/docker/daemon.json
    {
      "bip": "192.168.100.1/24"  # 设置网桥IP段
    }
  2. 重启Docker:systemctl start docker


74. 自定义Docker网络配置

# 创建自定义网络
docker network create \
  --driver=bridge \
  --subnet=10.10.0.0/16 \
  --gateway=10.10.0.1 \
  my-network

# 指定容器使用该网络
docker run --network=my-network nginx

75. 私有仓库开启2375端口(⚠️不安全)

  1. 修改配置(不推荐暴露端口):

    # /etc/docker/daemon.json
    {
      "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
    }
  2. 重启Dockersystemctl restart docker

生产环境必须使用TLS加密(端口2376)


76. Docker挂载的三种方式

方式 命令示例 特点
绑定挂载 -v /host/path:/container/path 主机目录直接映射(可读写)
卷挂载 -v my_volume:/container/path Docker管理生命周期(推荐)
临时文件系统 --tmpfs /container/path 内存存储(重启丢失)

77. Docker Pull慢的解决

  1. 配置镜像加速器

    // /etc/docker/daemon.json
    {
      "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://hub-mirror.c.163.com"
      ]
    }
  2. 重启Dockersystemctl restart docker


78. Docker中配置Hosts

  1. 运行时注入

    docker run --add-host db:192.168.1.100 nginx
  2. 修改容器内部文件

    docker exec -it my-container sh -c "echo '192.168.1.100 db' >> /etc/hosts"

79. 私有仓库自定义端口

启动Registry容器时指定端口:

docker run -d -p 5000:5000 --name registry registry:2

客户端拉取镜像:

docker pull myhost:5000/myimage:tag

80. 容器网络更改

  1. 断开旧网络

    docker network disconnect bridge my-container
  2. 连接新网络

    docker network connect my-custom-net my-container

81. 查看容器日志

docker logs my-container      # 查看历史日志
docker logs -f my-container   # 实时追踪日志
docker logs --tail 100 my-container  # 查看最后100行

82. 容器内缺少命令的解决

  1. 进入容器安装

    docker exec -it my-container sh
    # Alpine: apk add curl
    # Ubuntu: apt update && apt install curl
  2. 构建新镜像

    dockerfile

    FROM original-image
    RUN apt update && apt install -y curl  # 添加缺失工具

83. 容器文件拷贝与挂载

操作 命令
主机→容器拷贝 docker cp file.txt my-container:/path
容器→主机拷贝 docker cp my-container:/log.txt ./
目录挂载 -v /host/path:/container/path

84. Docker Compose核心语法

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example

volumes:
  data:  # 声明命名卷

85. 查询镜像版本信息

  1. Docker Hub网页搜索

  2. API查询

    curl "https://registry.hub.docker.com/v2/repositories/library/nginx/tags/" | jq
  3. 命令行工具

    docker search nginx --limit 10  # 查看可用版本

86. CMD vs ENTRYPOINT

指令 是否可覆盖 典型用途
CMD ✅ (run命令覆盖) 定义默认参数
ENTRYPOINT ❌ (需--entrypoint覆盖) 定义容器主程序
组合使用

dockerfile

ENTRYPOINT ["java", "-jar"]
CMD ["/app.jar"]  # 可被覆盖:docker run my-app /other.jar

87. Docker网络模式

模式 命令参数 特点
bridge --net=bridge (默认) 容器通过网桥连接
host --net=host 共享主机网络栈
none --net=none 无网络接口
container --net=container:ID 共享其他容器网络

88. 容器中文乱码解决

  1. 安装中文字体:dockerfile

    RUN apt update && apt install -y fonts-wqy-zenhei
  2. 设置环境变量:dockerfile

    ENV LANG C.UTF-8
  3. 启动容器时指定

    docker run -e LANG=C.UTF-8 my-image

89. Dockerfile构建异常排查

  1. 定位失败指令:查看日志中最后执行的步骤

  2. 进入中间层调试

    docker run -it <失败前镜像ID> sh  # 手动执行命令
  3. 分阶段构建:复杂操作拆分为多个RUN

  4. 清理缓存重建docker build --no-cache .

示例:RUN apt install失败可尝试先apt update

学海无涯,志当存远。燃心砺志,奋进不辍。

愿诸君得此鸡汤,如沐春风,事业有成。

若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌!

 

 

你可能感兴趣的:(docker基础,面试学习,docker,容器,运维)