docker日常使用的要点

Docker 日常使用的核心是规范操作、性能优化、安全管控、故障排查,掌握以下要点能大幅提升使用效率,减少踩坑,覆盖开发、测试、生产全场景:

一、基础操作:规范使用容器 / 镜像

1. 容器管理(核心)
  • 命名规范:创建容器时用--name指定有意义的名称(如nginx-prod-80),避免默认随机名,便于后续管理:

    bash

    运行

    docker run -d --name nginx-prod -p 80:80 nginx
    
  • 资源限制:生产环境必须限制容器 CPU / 内存,避免抢占宿主机资源:

    bash

    运行

    # 限制1核CPU、512M内存,内存上限1G
    docker run -d --name app --cpus=1 --memory=512m --memory-swap=1g app-image
    
  • 重启策略:根据场景配置--restart,避免容器异常退出后无人值守:
    策略适用场景
    no测试容器(默认,不重启)
    always核心服务(只要停止就重启)
    on-failure:5应用服务(非 0 退出时重启,最多 5 次)
    unless-stopped生产服务(手动停止前一直重启)
  • 容器清理:避免无用容器占用资源,定期清理:

    bash

    运行

    # 停止所有运行容器
    docker stop $(docker ps -q)
    # 删除已停止容器
    docker rm $(docker ps -aq)
    # 一键清理停止的容器、悬空镜像、网络等
    docker system prune -f  # -f 免确认,生产环境谨慎
    
2. 镜像管理
  • 镜像命名:遵循仓库/名称:版本(如myapp/backend:v1.2.3),避免latest(易导致版本混乱);
  • 镜像瘦身
    • 使用多阶段构建(Dockerfile),仅保留运行时依赖:

      dockerfile

      # 构建阶段
      FROM maven:3.8 AS builder
      COPY . /app
      RUN mvn package -f /app/pom.xml
      # 运行阶段(仅保留jar包)
      FROM openjdk:8-jre-slim
      COPY --from=builder /app/target/app.jar /app.jar
      CMD ["java", "-jar", "/app.jar"]
      
    • 避免在 Dockerfile 中执行apt update后不清理缓存(rm -rf /var/lib/apt/lists/*);
  • 镜像备份 / 迁移

    bash

    运行

    # 导出镜像为tar包
    docker save -o app.tar myapp/backend:v1.2.3
    # 导入镜像
    docker load -i app.tar
    
  • 镜像清理:删除悬空镜像(无标签)、无用镜像:

    bash

    运行

    docker rmi $(docker images -f "dangling=true" -q)  # 删除悬空镜像
    

二、数据管理:确保数据安全不丢失

Docker 容器默认「无状态」,数据需通过数据卷(Volume) 或「绑定挂载」持久化:

1. 优先用数据卷(推荐)

数据卷由 Docker 管理,稳定性高,支持跨容器共享:

bash

运行

# 创建命名卷
docker volume create nginx-conf
# 挂载卷到容器(配置文件持久化)
docker run -d --name nginx -v nginx-conf:/etc/nginx nginx
# 查看卷位置(便于手动修改配置)
docker volume inspect nginx-conf
2. 绑定挂载(开发场景)

直接挂载宿主机目录到容器,适合开发时实时同步代码:

bash

运行

# 宿主机./code 挂载到容器/app,修改宿主机代码直接生效
docker run -d --name app -v $(pwd)/code:/app app-image
3. 注意事项
  • 生产环境禁止用/tmp等临时目录挂载关键数据;
  • 定期备份数据卷:docker run --rm -v nginx-conf:/source -v $(pwd):/dest alpine cp -r /source/* /dest/nginx-conf-backup
  • 避免容器内修改挂载目录权限导致宿主机权限混乱(可在 Dockerfile 中提前设置)。

三、网络管理:避免端口冲突 / 网络隔离

1. 自定义网络(推荐)

默认bridge网络下容器需暴露端口到宿主机,自定义网络可实现容器间内网通信,无需暴露端口:

bash

运行

# 创建自定义桥接网络
docker network create app-network
# 启动容器加入该网络(容器间可通过容器名互相访问)
docker run -d --name mysql --network app-network -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d --name app --network app-network app-image  # 容器内可通过mysql:3306访问数据库
2. 端口映射规范
  • 生产环境避免用-P(随机端口),明确指定-p 宿主机端口:容器端口
  • 宿主机端口尽量用非 80/443 等常用端口(如8080:80),避免冲突;
  • 查看端口映射:docker port 容器名

四、日志与监控:快速定位问题

1. 日志管理
  • 查看容器日志(核心排障手段):

    bash

    运行

    docker logs 容器名          # 查看全部日志
    docker logs -f 容器名       # 实时跟踪日志
    docker logs --since 10m 容器名  # 查看最近10分钟日志
    docker logs --tail 100 容器名   # 查看最后100行日志
    
  • 日志持久化:默认日志存在宿主机/var/lib/docker/containers/,可通过docker run --log-driver=local --log-opt max-size=100m --log-opt max-file=3限制日志大小,避免占满磁盘;
  • 生产环境推荐将日志输出到 ELK、Loki 等日志平台,而非仅存本地。
2. 监控容器状态
  • 基础监控:docker stats(实时查看容器 CPU / 内存 / 网络占用);
  • 健康检查:生产容器必须配置健康检查(详见前文),避免「容器 Up 但应用不可用」;
  • 进阶监控:用cAdvisor/Prometheus+Grafana监控容器指标,实现告警。

五、安全管控:避免权限 / 镜像风险

1. 容器权限
  • 禁止用--privileged(特权模式)运行容器,除非必须(如需要访问宿主机设备);
  • 用普通用户运行容器(在 Dockerfile 中创建非 root 用户):

    dockerfile

    FROM alpine
    RUN adduser -D appuser
    USER appuser  # 后续命令以appuser执行
    
  • 限制容器挂载宿主机敏感目录(如/etc/var/run/docker.sock)。
2. 镜像安全
  • 优先用官方镜像 / 可信仓库镜像,避免未知来源镜像;
  • 拉取镜像时指定具体版本(如nginx:1.24.0),而非latest
  • 扫描镜像漏洞:docker scan 镜像名(需登录 Docker Hub)。
3. 其他安全措施
  • 禁止容器内运行systemctl/service等宿主机管理命令;
  • 生产环境开启 Docker TLS 认证,禁止裸奔暴露 2375 端口。

六、Dockerfile 编写规范(核心)

Dockerfile 是镜像构建的核心,规范编写能减少镜像问题:

  1. 指令精简:合并 RUN 命令(减少镜像层),如:

    dockerfile

    # 不推荐(多图层)
    RUN apt update
    RUN apt install -y curl
    # 推荐(合并)
    RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
    
  2. 使用.dockerignore:排除无关文件(如node_modules.git),减少构建上下文大小;
  3. 避免无用依赖:仅安装运行时必需的包(如用alpine镜像替代ubuntu,体积更小);
  4. 指定工作目录:用WORKDIR替代RUN cd,更稳定:

    dockerfile

    WORKDIR /app  # 后续命令均在/app执行
    COPY . .      # 无需指定路径
    

七、生产环境额外要点

  1. 避免单机 Docker:生产推荐用 Docker Swarm/K8s 实现容器编排、高可用;
  2. 自动重启 + 健康检查:所有核心容器必须配置健康检查 +on-failure重启策略;
  3. 镜像版本固化:每次发布镜像打唯一标签(如 git commit id),避免回滚困难;
  4. 宿主机资源监控:监控 Docker 根目录(/var/lib/docker)磁盘使用率,避免日志 / 镜像占满磁盘;
  5. 备份恢复:定期备份数据卷、镜像,制定容器故障恢复预案。

八、常见问题速查

问题现象排查方向
容器启动后立即退出查看日志docker logs,检查 CMD/ENTRYPOINT
容器端口映射后无法访问检查宿主机防火墙、容器内应用是否监听 0.0.0.0
容器内存占用过高docker stats定位,调整--memory限制
镜像构建慢检查 Dockerfile 构建上下文,换国内镜像源

总结

Docker 日常使用的核心是「规范」(命名、权限、版本)+「可控」(资源、日志、健康检查)+「安全」(镜像、权限、数据)。遵循以上要点,既能提升开发效率,也能保障生产环境稳定,减少 90% 以上的常见问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值