2025-03-19    2025-03-19    3199 字  7 分钟

一、Docker 容器的健康检查

在 Docker 中,容器的运行状态不仅仅是“启动”或“停止”那么简单。通过健康检查(Health Check),我们可以更精确地了解容器内部应用程序的实际运行状况。Docker 提供了 HEALTHCHECK 指令,让用户可以在 Dockerfile 中定义如何检查容器的健康状态。 例如,一个简单的健康检查配置可能是这样的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
        healthcheck:
            interval: 30s
            retries: 5
            start_period: 30s
            test:
                - CMD
                - curl
                - -f
                - http://localhost:8090/actuator/health/readiness
            timeout: 5s

30s检测一次,超时5s,若失败重试5次。 健康状态可以通过 docker ps 查看,显示为 (healthy)、(unhealthy) 或 (starting)。如果需要更详细的信息,可以使用 docker inspect 查看健康检查的输出结果。这种主动监控方式不仅提高了系统的可靠性,还能帮助我们在问题发生时及时采取措施。

二、Docker 数据卷的使用

Docker 容器的一个显著特点是其短暂性——容器停止后,内部数据可能会丢失。为了解决这个问题,Docker 提供了数据卷(Volume)和绑定挂载(Bind Mount)两种方式来持久化数据。 数据卷是 Docker 推荐的方式,因为它由 Docker 管理,独立于容器的生命周期。创建数据卷只需使用以下命令:

1
docker volume create my-volume

然后在运行容器时通过 -v 参数挂载:

1
docker run -v my-volume:/app/data my-image

这样,容器中的 /app/data 目录就会与数据卷关联,即使容器被删除,数据依然保留在卷中。 相比之下,绑定挂载直接将宿主机的目录映射到容器内,例如:

1
docker run -v /host/path:/app/data my-image

或者

1
2
[root@k3s-storage volume-ubuntu]# docker run -itd --name test-ubuntu1 -v $(pwd):/usr/sbin ubuntu:latest bash 
651c856a202e52fa66f316f60568c9c0fd844bc02efbd137e3b45974cad7a1df

这种方式更直观,适合开发环境,但需要注意权限问题,比如SELinux环境下的额外配置。 通过合理使用数据卷和绑定挂载,我们可以确保数据的持久性,同时在开发、测试和生产环境中灵活切换。

三、清理 Docker 的无用资源

随着Docker的使用,系统中可能会积累大量无用资源,比如停止的容器、未使用的镜像和网络。这些资源占用磁盘空间,影响系统性能,因此定期清理非常必要。 Docker提供了一些便捷的命令来完成清理工作。例如,要删除所有停止的容器,可以运行:

1
docker container prune

如果想清理未被使用的镜像,可以使用:

1
docker image prune

而清理无用的网络则可以用:

1
docker network prune

如果想一次性清理所有未使用的资源(包括容器、镜像、网络和构建缓存),只需一条命令:

1
docker system prune

需要注意的是,prune命令会删除所有未被引用的资源,因此在执行前最好确认没有重要的临时数据会被误删。通过这些清理操作,我们可以保持 Docker 环境的整洁,避免资源浪费。

四、Docker中的特殊镜像

在Docker的使用过程中,我们可能会遇到一些特殊的镜像,比如none镜像和scratch镜像,它们各有其独特的作用。 none镜像通常出现在镜像构建或更新时。当我们构建一个新镜像并覆盖已有标签时,旧的镜像会失去标签,变成 none状态。这些镜像虽然没有名称,但仍然占用空间,可以通过docker image prune 清理。 另一方面,scratch是一个极简的基础镜像,它完全为空,主要用于构建自定义镜像。例如,一个简单的 Dockerfile可以这样使用:

1
2
3
FROM scratch
COPY hello /
CMD ["/hello"]

这种镜像适用于需要极致轻量化的场景,比如静态编译的二进制程序。不过,由于scratch不包含任何基础工具,调试和管理会更具挑战性。 理解这些特殊镜像的用途,可以帮助我们更好地管理镜像仓库,并在特定场景下优化容器部署。

五、删除已退出的容器

在使用Docker的过程中,经常会产生大量的已退出容器。这些容器虽然不再运行,但仍然占用系统资源。如果不及时清理,可能会导致磁盘空间不足或系统性能下降。以下是几种删除已退出容器的实用方法:

  1. 手动删除单个容器
    使用 docker ps -a 查看所有容器(包括已退出的),找到目标容器的 ID 或名称,然后通过以下命令删除:
1
docker rm <容器ID或名称>

例如:

1
docker rm 1e2f3g4h

2.批量删除所有已退出容器
当已退出容器数量较多时,手动逐一删除效率低下。可以通过以下命令一次性清理所有状态为 exited 的容器:

1
docker rm $(docker ps -a -f status=exited -q)

其中,-f status=exited 过滤出已退出状态的容器,-q 只返回容器 ID,结合 docker rm 实现批量删除。 3.自动清理容器
如果希望在容器运行结束后自动删除,可以在启动容器时加上 –rm 参数。例如:

1
docker run --rm -it ubuntu bash

容器退出后会自动被移除,无需手动清理。 注意事项:

  • 在删除容器前,确保已退出且不再需要,因为删除后无法恢复容器数据。
  • 如果容器仍在运行,需先用 docker stop <容器ID> 停止,再执行删除。

六、灵活映射容器端口

Docker 容器运行时,通常需要与宿主机或其他服务进行网络通信,而端口映射是实现这一目标的关键手段。Docker 提供了多种端口映射方式,以下是常见方法及其使用场景:

  1. 随机映射端口
    使用 -P 参数,Docker 会自动将容器内暴露的端口映射到宿主机的随机端口。例如:
    1
    
    docker run -d -P nginx
    
    运行后,可通过 docker ps 查看映射结果,如 0.0.0.0:32768->80/tcp,表示容器内 80 端口被映射到宿主机的 32768 端口。
  2. 指定端口映射
    使用 -p 参数,可以精确指定宿主机和容器之间的端口映射,格式为 -p 宿主机端口:容器端口。例如:
    1
    
    docker run -d -p 8080:80 nginx
    
    这将容器内的 80 端口映射到宿主机的 8080 端口。
  3. 绑定特定 IP 的端口
    如果宿主机有多个网络接口,可以指定 IP 地址进行映射,格式为 -p IP:宿主机端口:容器端口。例如:
    1
    
    docker run -d -p 192.168.1.10:8080:80 nginx
    
    这样,只有通过 192.168.1.10:8080 才能访问容器服务。 实用技巧:
  • 使用 docker port <容器ID> 查看容器当前的端口映射情况。
  • 如果端口被占用,可通过 netstat -tuln | grep <端口号> 检查并释放。
  • 在生产环境中,建议明确指定端口,避免随机映射带来的不确定性。

七、以特殊格式显示镜像

Docker 镜像管理中,查看镜像信息是日常操作之一。默认的 docker images 命令虽然简单,但输出格式有限。以下是如何以特殊格式显示镜像的技巧:

  1. 基础用法
    运行 docker images,输出包括镜像名称(REPOSITORY)、标签(TAG)、镜像 ID(IMAGE ID)、创建时间(CREATED)和大小(SIZE)。

  2. 自定义输出格式
    使用 –format 参数结合 Go 模板语法,可以定制输出内容。例如:

    1
    
    docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}"
    

    输出示例:

    1
    2
    
    nginx:latest 133MB
    ubuntu:20.04 72.8MB
    
  3. 过滤特定镜像
    配合 –filter 参数,可以筛选出符合条件的镜像。例如,只显示带有 nginx 的镜像:

    1
    
    docker images --filter "reference=nginx" --format "{{.Repository}} {{.Size}}"
    
  4. 去除重复项
    如果镜像存在多个标签,默认显示所有条目。加上 –no-trunc 和 –quiet 可优化输出。例如:

    1
    
    docker images -q | sort | uniq
    

    这将列出唯一的镜像 ID,去除重复。

应用场景:

  • 在脚本中处理镜像信息时,自定义格式更便于解析。

  • 检查镜像占用空间时,结合大小字段快速定位大镜像。

八、释放空标签镜像

Docker使用过程中,可能会产生none标签的镜像(即空标签镜像),通常由更新或重新构建镜像时遗留。这些镜像占用磁盘空间,需定期清理:

  1. 查看空标签镜像
    使用以下命令列出所有none镜像:

    1
    
    docker images -f "dangling=true"
    
  2. 删除空标签镜像
    清理这些镜像的命令是:

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

    -q 只返回镜像 ID,结合 docker rmi 删除。

  3. 预防空标签镜像

    • 构建镜像时,始终指定明确的标签,例如:

      1
      
      docker build -t myapp:1.0 .
      
    • 更新镜像后,及时删除旧版本,避免产生无用镜像。

注意事项:

  • 如果空标签镜像正在被容器使用,需先删除相关容器。

  • 定期运行 docker system prune 可清理无用的镜像、容器和网络。

九、理解镜像构建上下文

构建 Docker 镜像时,docker build 命令需要一个构建上下文(Build Context),理解其作用对优化构建过程至关重要。

  1. 什么是构建上下文
    构建上下文是 docker build 命令中指定的路径,默认是当前目录(.)。Docker 会将该路径下的所有文件和子目录打包上传到 Docker 守护进程,用于构建镜像。例如:

    1
    
    docker build -t myapp:latest .
    
  2. 优化构建上下文

    • 排除无关文件:构建上下文包含不必要的文件(如日志、临时文件)会增加传输时间。使用 .dockerignore 文件排除无关内容,类似 .gitignore。示例 .dockerignore:

      1
      2
      3
      
      *.log
      node_modules
      .git
      
    • 指定特定上下文:如果 Dockerfile 不在当前目录,可通过 -f 参数指定文件路径,同时提供上下文路径。例如:

      1
      
      docker build -f ./docker/Dockerfile -t myapp:latest ./src
      
  3. 构建上下文的影响

    • 上下文过大可能导致构建变慢,尤其在远程守护进程上。

    • 合理规划上下文目录结构,可以提升构建效率并减少错误。

实用建议:

  • 始终检查上下文目录,确保只包含构建所需文件。

  • 在 CI/CD 管道中,优化 .dockerignore 以缩短构建时间。