Docker实用技巧:这些功能你可能不知道但很好用

更新日期: 2025-12-03 阅读: 17 标签: Docker

Docker已经成为了现代开发和运维的标配工具。大部分人都知道基本的docker run、docker build命令,但Docker里还有一些不太为人知却非常实用的功能。掌握这些技巧,能让你的容器使用更加高效。


一、优化镜像大小:多阶段构建

很多Docker镜像最终很大,是因为包含了构建工具、源代码等不必要的文件。用多阶段构建可以解决这个问题。

传统做法的问题

FROM golang:1.20
WORKDIR /app
COPY . .
RUN go build -o myapp
CMD ["./myapp"]

这样做出来的镜像包含Go编译环境和源代码,可能超过1GB。

多阶段构建的改进

# 第一阶段:构建
FROM golang:1.20 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 第二阶段:运行
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
ENTRYPOINT ["./myapp"]

这样最终镜像只包含运行所需的最小环境,大小可能只有几十MB。

实际效果:一个Go应用的镜像从1.2GB减小到15MB。


二、控制资源使用:限制内存和CPU

在服务器上运行多个容器时,如果不加限制,某个容器可能占满所有资源,影响其他服务。

设置内存限制

docker run -d --memory=512m --memory-swap=1g nginx
  • --memory=512m:限制最多使用512MB内存

  • --memory-swap=1g:内存+交换分区总共1GB

设置CPU限制

# 限制使用1个CPU核心
docker run -d --cpus=1 nginx

# 限制使用0.5个CPU核心
docker run -d --cpus=0.5 nginx

# 设置CPU优先级(0-1024,默认1024)
docker run -d --cpu-shares=512 nginx

实际应用场景

  • 开发环境:限制资源,避免影响其他工作

  • 生产环境:确保关键服务有足够资源

  • 测试环境:模拟低配服务器


三、更灵活的卷挂载:使用--mount

大多数人都用-v参数挂载卷,但--mount其实更好用。

基本用法对比

# 传统方式
docker run -v $(pwd)/data:/app/data nginx

# 新方式
docker run --mount type=bind,source=$(pwd)/data,target=/app/data nginx

--mount的优势

  1. 更清晰的语法:参数意义明确

  2. 更多选项:比如设置只读

  3. 一致性:和docker service create语法一致

实用例子

# 只读挂载(防止容器修改宿主机文件)
docker run --mount type=bind,source=$(pwd)/config,target=/app/config,readonly nginx

# 挂载时设置权限
docker run --mount type=bind,source=$(pwd)/data,target=/app/data,readonly=false nginx


四、高效查看日志:定位问题更快

容器出问题时,查看日志是最常用的排查方法。

实时查看日志

# 实时查看(类似tail -f)
docker logs -f <容器ID或名称>

# 查看最近100行
docker logs --tail 100 <容器ID>

按时间筛选

# 查看最近10分钟的日志
docker logs --since 10m <容器ID>

# 查看从某个时间点开始的日志
docker logs --since 2024-01-01T00:00:00 <容器ID>

# 查看最近10分钟的最后50行
docker logs --since 10m --tail 50 <容器ID>

格式化输出

# 显示时间戳
docker logs -t <容器ID>

# 只显示错误日志
docker logs --since 1h <容器ID> 2>&1 | grep -i error


五、定期清理:释放磁盘空间

Docker用久了会占用大量磁盘空间,需要定期清理。

清理无用资源

# 清理所有未使用的资源(镜像、容器、网络、构建缓存)
docker system prune -a

# 只清理超过24小时的未使用资源
docker system prune -a --filter "until=24h"

针对性地清理

# 删除所有停止的容器
docker container prune

# 删除所有未被使用的镜像
docker image prune -a

# 删除所有未被使用的卷
docker volume prune

# 删除所有未被使用的网络
docker network prune

查看磁盘使用情况

# 查看详细使用情况
docker system df

# 查看具体是哪些镜像占空间
docker system df -v


六、网络隔离:更安全的服务通信

默认情况下,所有容器都在同一个网络,不够安全。

创建自定义网络

# 创建网络
docker network create my_app_network

# 运行服务时指定网络
docker run -d --network=my_app_network --name web nginx
docker run -d --network=my_app_network --name db mysql

网络间的服务发现

# 在web容器中可以直接ping db(通过服务名)
docker exec web ping db

# 也可以通过IP访问
docker network inspect my_app_network

网络类型选择

# 桥接网络(默认,适合单机)
docker network create --driver bridge app_net

# 覆盖网络(适合集群)
docker network create --driver overlay cluster_net


七、多平台构建:支持不同CPU架构

如果你的应用要在不同架构的机器上运行(比如x86和ARM),可以用多平台构建。

启用buildx

# 创建并切换到buildx构建器
docker buildx create --use --name multiarch-builder

# 检查构建器状态
docker buildx ls

多平台构建

# 同时构建amd64和arm64版本
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .

# 推送到镜像仓库
docker buildx build --platform linux/amd64,linux/arm64 -t username/myapp:latest --push .

实际应用

  • 开发机是Mac M系列(ARM),服务器是x86

  • 物联网设备使用ARM架构

  • 需要同时支持多种环境


八、安全存储:保护敏感信息

不要在环境变量或Dockerfile中写死密码,用Docker Secret更安全。

创建secret

# 从文件创建
echo "my_secret_password" > password.txt
docker secret create db_password password.txt

# 从标准输入创建
echo "my_secret_password" | docker secret create db_password -

在服务中使用

# docker-compose.yml示例
version: '3.8'
services:
  db:
    image: mysql
    secrets:
      - db_password
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password

secrets:
  db_password:
    file: ./password.txt


九、其他实用命令

1. 查看镜像构建历史

docker history nginx:latest

可以看到镜像每一层是怎么构建的,用了什么命令。

2. 查看容器退出状态

# 运行一个临时容器
docker run --rm alpine sh -c "exit 1"

# 获取退出状态码
echo $?

# 或者用docker wait
docker run -d --name test alpine sleep 5
docker wait test

退出状态0表示成功,非0表示失败。

3. 查看容器文件变化

# 运行容器并修改文件
docker run --name test alpine touch /test.txt

# 查看修改了哪些文件
docker diff test
  • A:新增文件

  • C:修改文件

  • D:删除文件

4. 监控容器资源使用

# 实时监控所有容器
docker stats

# 监控特定容器
docker stats nginx mysql

# 不显示标题行,适合脚本处理
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"


十、实用组合技巧

快速进入容器

# 如果容器里没有bash,用sh
alias docker-exec='docker exec -it $(docker ps -q -f name=你想进入的容器名) sh'

# 或者用函数
dsh() {
    docker exec -it $1 sh
}

批量操作

# 停止所有运行的容器
docker stop $(docker ps -q)

# 删除所有已停止的容器
docker rm $(docker ps -aq)

# 更新所有运行中的容器
docker ps -q | xargs -I {} docker update --restart=always {}

端口快速检查

# 查看哪些端口被映射
docker port <容器名>

# 查看所有容器的端口映射
docker ps --format "table {{.Names}}\t{{.Ports}}"


总结建议

  1. 日常使用

    • 用多阶段构建减小镜像

    • 设置资源限制避免影响其他服务

    • 定期清理无用资源

  2. 生产环境

    • 使用自定义网络隔离服务

    • 用Secret保护敏感信息

    • 做好日志管理

  3. 跨平台场景

    • 用buildx支持多架构

    • 测试不同平台的表现

  4. 故障排查

    • 熟练使用docker logs的各种参数

    • 用docker diff和docker history辅助分析

这些技巧虽然不算基础知识,但掌握后能显著提升使用Docker的效率和体验。建议先挑选几个最需要的功能试试,熟练后再学习其他。好的工具要用得好,才能发挥最大价值。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13277

npm私有仓库 配置verdaccio在docker环境

前端开发过程中,少不了自己封装一些通用的包,但又不想放在公共的平台,所以搭建一个npm私有的仓库是很有必要的。在这里简单介绍如何使用 verdoccio 在docker环境下的配置。verdoccio,轻量级私有npm代理注册表。

ASP.NET Core 如何在运行Docker容器时指定容器外部端口(docker compose)

所以我们可以通过修改docker compose的配置文件来完成我们的需求。熟悉Docker的都应该知道容器运行时其内部会有一个端口以映射到我们外部的端口,我们需要固定的就是这个外部端口。

DOCKER上运行DOTNET CORE

下载microsoft/dotnet镜像、创建.NET Core MVC项目、上面dotnet restore这一步可能会卡很久遇到超时的状况,因为Nuget在国外的原因,博客园有提供加速镜像,参照设定好之后,速度会快很多

Docker---大型项目容器化改造

虚拟化和容器化是项目云化不可避免的两个问题。虚拟化由于是纯平台操作,一个运行于linux操作系统的项目几乎不需要做任何改造就可以支持虚拟化。而项目如果要支持容器化则需要做许多细致的改造工作。

开发人员爱Docker的10个理由

Stack Overflow开发人员调查中,开发人员将Docker评为:最受欢迎的平台,最喜欢的平台,最常用的平台。来自世界各地的近90,000名开发人员对调查做出了回应。

Docker部署网站之后映射域名

Docker中部署tomcat相信大家也都知道,不知道的可以google 或者bing 一下。这里主要是为了记录在我们启动容器之后,tomcat需要直接定位到网站信息,而不是打开域名之后,还得加个blog后缀才能访问到我们的网站首页。

微服务架构之「 容器技术 」

现在一聊到容器技术,大家就默认是指 Docker 了。但事实上,在 Docker 出现之前,PaaS社区早就有容器技术了,以 Cloud Foundry、OpenShift 为代表的就是当时的主流。那为啥最终还是 Docker 火起来了呢?

Docker部署ngnix静态网站

首先获取ngnix镜像(默认的是最新版),先来编写一个最简单的Dockerfile,一个Dockerfile修改该Nginx镜像的首页.Dockerfile是一个文本文件,其中包含了若干条指令

如何从单独的容器调试运行中的Docker容器?

容器非常适合封装软件,但是有时一味地改造容器镜像以使其尽可能小时,您可能走得太远。我们需要在“简洁”的镜像和无法调试的镜像之间找到很好的平衡。看到人们调试正在运行的容器的正常方法

内部集群的 DNS server 搭建

当我们使用 traefik 反向代理和自动服务发现后,我们对集群内部的服务分为两类:公有服务。如我的博客,网站,以及为它们提供服务的 API。我们可以通过公有的域名去映射服务使得外网能够访问

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!