当前位置: 首页 > news >正文

Docker使用方法及注意事项

Docker 的使用可以分为基础操作进阶编排最佳实践三个层面。以下是针对开发者和运维人员的详细使用指南及关键注意事项。


一、Docker 核心使用方法

1. 环境准备

  • 安装
    • Linux: 推荐使用官方脚本 curl -fsSL https://get.docker.com | bash 或包管理器安装。
    • Mac/Windows: 下载并安装 Docker Desktop(包含 Docker Engine, CLI, Compose, Kubernetes 等全套工具)。
  • 验证: 运行 docker run hello-world 确认安装成功。
  • 权限配置 (Linux): 避免每次都用 sudo,将当前用户加入 docker 组:
    sudo usermod -aG docker $USER
    # 注销并重新登录后生效
    

2. 镜像管理 (Images)

镜像是容器的模板。

  • 拉取镜像: docker pull <镜像名>:<标签>
    • 例:docker pull nginx:1.25 (推荐指定具体版本,避免 latest 的不确定性)
  • 查看镜像: docker images
  • 构建镜像: 在当前目录有 Dockerfile 时执行:
    docker build -t my-app:v1 .
    # -t 指定名称和标签,. 代表当前目录
    
  • 删除镜像: docker rmi <镜像ID或名称>

3. 容器运行与管理 (Containers)

容器是运行的实例。

  • 启动容器 (最常用命令):

    docker run -d \--name my-web \-p 8080:80 \-v /host/data:/app/data \-e ENV=production \--restart unless-stopped \nginx:1.25
    
    • -d: 后台运行 (Detached)。
    • --name: 指定容器名称,方便记忆。
    • -p 宿主机端口:容器端口: 端口映射,让外部能访问。
    • -v 宿主机路径:容器路径: 数据卷挂载,确保持久化存储。
    • -e: 设置环境变量。
    • --restart: 重启策略 (no, on-failure, always, unless-stopped)。
  • 查看容器:

    • docker ps: 查看运行中的容器。
    • docker ps -a: 查看所有容器(包括已停止的)。
  • 交互与调试:

    • docker logs -f --tail 100 <容器名>: 实时查看日志。
    • docker exec -it <容器名> bash: 进入容器内部终端 (如果镜像没 bash 则用 sh)。
    • docker inspect <容器名>: 查看容器详细信息(IP、挂载点等)。
  • 停止与清理:

    • docker stop <容器名>: 优雅停止。
    • docker rm <容器名>: 删除已停止的容器。
    • docker system prune: 一键清理所有停止的容器、未使用的网络和悬空镜像(慎用,会释放大量空间)。

4. 多容器编排 (Docker Compose)

当应用由多个服务组成(如 Web + DB + Redis)时,使用 docker-compose.yml 文件管理。

  • 示例 docker-compose.yml:
    version: '3.8'
    services:web:image: nginx:1.25ports:- "80:80"depends_on:- dbdb:image: postgres:15environment:POSTGRES_PASSWORD: examplevolumes:- pgdata:/var/lib/postgresql/datavolumes:pgdata:
    
  • 常用命令:
    • docker compose up -d: 启动所有服务。
    • docker compose down: 停止并移除容器、网络(卷默认保留)。
    • docker compose logs -f: 查看所有服务日志。

二、关键注意事项 (避坑指南)

1. 数据持久化 (最重要!)

  • 风险: 容器是** ephemeral **(易失) 的。一旦容器被删除 (docker rm),容器内部文件系统的所有修改都会丢失。
  • 对策: 必须将数据库文件、配置文件、上传的文件等通过 -v (Volume) 或 --mount 挂载到宿主机。
    • ❌ 错误:直接在容器内写数据。
    • ✅ 正确:-v /opt/mysql/data:/var/lib/mysql

2. 镜像标签管理

  • 风险: 尽量避免在生产环境使用 latest 标签。如果上游镜像更新导致不兼容,你的服务可能会在下次重启时突然挂掉。
  • 对策: 始终使用具体的版本号(如 python:3.9-slim, node:18-alpine)。

3. 资源限制

  • 风险: 默认情况下,容器可以使用宿主机的所有 CPU 和内存。如果一个容器发生内存泄漏,可能会拖垮整个宿主机,导致其他服务崩溃。
  • 对策: 启动时务必限制资源:
    docker run -d --memory="512m" --cpus="1.0" ...
    
    或在 Docker Compose 中配置 deploy.resources

4. 安全性 (Security)

  • 不要以 Root 运行: 默认情况下,容器内的进程以 root 身份运行。如果容器被攻破,攻击者可能获得宿主机 root 权限。
    • 做法: 在 Dockerfile 中使用 USER 指令切换到非 root 用户。
    • Rootless 模式: 在新版 Docker 中,建议启用 Rootless 模式运行 Docker 守护进程。
  • 敏感信息: 严禁将密码、API Key 硬编码在 Dockerfile 或镜像中。
    • 做法: 使用 -e 环境变量传入,或使用 Docker Secrets (Swarm/K8s),或使用 .env 文件(确保 .env 不被提交到 git)。
  • 镜像扫描: 定期使用 docker scan 或集成 Trivy 等工具扫描镜像漏洞。

5. 网络隔离

  • 原则: 默认情况下,所有容器都在 bridge 网络中,可以互相通信。
  • 做法: 为不同应用创建自定义网络 (docker network create my-net),只将需要暴露端口的容器映射到宿主机,数据库等后端服务不要映射端口到宿主机,仅允许同网络下的 Web 容器访问。

6. 日志管理

  • 风险: 容器标准输出 (stdout/stderr) 如果不加限制,日志文件 (json-file) 可能会无限增长,占满宿主机磁盘。
  • 对策: 配置 Docker 守护进程 (/etc/docker/daemon.json) 开启日志轮转:
    {"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "3"}
    }
    

7. 国内网络环境 (中国大陆用户特供)

  • 问题: 直接 docker pull 经常超时或失败。
  • 对策:
    1. 配置镜像加速器: 修改 /etc/docker/daemon.json,添加可靠的镜像源地址(注意:许多公共加速源在 2026 年可能不稳定,需关注云厂商最新公告)。
    2. 离线传输: 在有网络的地方 docker save -o app.tar image_name,传输到目标机器后 docker load -i app.tar
    3. 私有仓库: 企业级场景务必搭建 Harbor 私有仓库作为中转。

三、Dockerfile 编写最佳实践

为了构建更小、更安全、更快的镜像,请遵循以下原则:

  1. 选择合适的基础镜像:

    • 优先选用 alpine (极小,但需注意 musl libc 兼容性) 或 slim (Debian 精简版) 版本。
    • 例:FROM node:18-alpine 而不是 FROM node:18
  2. 减少层数:

    • 合并 RUN 指令。
    • 例:RUN apt-get update && apt-get install -y vim && rm -rf /var/lib/apt/lists/* (一行完成安装并清理缓存,减少镜像体积)。
  3. 利用缓存:

    • 将变化少的指令(如安装依赖)放在前面,将代码复制 (COPY . .) 放在后面。这样代码变动时,依赖层可以复用缓存。
  4. 使用 .dockerignore:

    • 类似 .gitignore,排除 node_modules, .git, *.log 等不需要构建进镜像的文件,加快构建速度并减小体积。
  5. **多阶段构建 **(Multi-stage Builds):

    • 对于编译型语言 (Go, Java, C++),在一个阶段编译,在另一个阶段只复制二进制文件。
    • 效果: 最终镜像不包含编译器、源码和中间文件,体积极小且更安全。
    # 编译阶段
    FROM golang:1.21 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp# 运行阶段
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    WORKDIR /root/
    COPY --from=builder /app/myapp .
    CMD ["./myapp"]
    

总结

Docker 的核心在于"标准化"和"隔离"。

  • 新手:先掌握 run, ps, logs, exec-v 挂载。
  • 进阶:重点攻克 Dockerfile 优化、Docker Compose 编排以及安全加固
  • 生产环境:切记数据持久化资源限制非 Root 运行
http://www.jsqmd.com/news/444574/

相关文章:

  • 德系车底盘维修哪家专业?2026年上海浦东5大靠谱店铺推荐,省钱又省心! - 品牌企业推荐师(官方)
  • 除甲醛公司推荐:专业公司服务与技术对比分析 - 品牌企业推荐师(官方)
  • 水利工程设备采购必看!5家优质启闭机、闸门厂家推荐,选购指南一文读懂 - 品牌企业推荐师(官方)
  • 2026年福州代理记账公司哪家好?福州10家财务公司真实测评 - 品牌企业推荐师(官方)
  • 2026年GEO优化服务商排名解读:企业或商户如何选择? - 品牌企业推荐师(官方)
  • 阻燃EPS厂家2026年TOP5:5家实力厂商怎么选?工程采购避坑+价值指南 - 品牌企业推荐师(官方)
  • 张家口注册公司|张家口快速办理营业执照【张家口玉算盘财税服务】 - 品牌企业推荐师(官方)
  • 2026年张家口公司注册、张家口代理记账【张家口玉算盘会计服务有限公司】 - 品牌企业推荐师(官方)
  • 广州地区金蝶云星空最好的服务商有哪家? - 品牌企业推荐师(官方)
  • 明星代言联系哪家好 - 品牌企业推荐师(官方)
  • 2026步入式试验箱优选榜单| 步入式十大精选厂家 - 品牌企业推荐师(官方)
  • 福州睿象科技对接步骤:找对联系方式精准对接,高效启航 - 品牌企业推荐师(官方)
  • 格宾网在高标准农田建设中的技术落地全攻略:高频疑问解答,助力工程高效实施 - 品牌企业推荐师(官方)
  • 张家口注册营业执照首选【玉算盘财税服务】 - 品牌企业推荐师(官方)
  • 2026年性价比高的定制酒生产厂家哪家强? - 品牌企业推荐师(官方)
  • 订婚结婚选哪款钻戒更值?——基于4C标准的五大国产品牌理性解析 - 品牌企业推荐师(官方)
  • 数据解码2026:婚戒定制品牌全景测评,揭秘培育钻石赛道的“价值新标杆” - 品牌企业推荐师(官方)
  • 力扣Hot100---1.两数之和
  • ABC 445 E(利用线性预处理最小质因子快速得到每个数的质因子分布 trick)
  • Git Pre-commit 钩子
  • Java全栈开发面试实战:从基础到高阶的深度探讨
  • 免费在线浏览查看3DTiles,支持修改坐标,微调整保存坐标json,支持cesium地图,高德地图,ArcGIS,天地图等自定义地图
  • Le sens de vivre dans un monde misrable
  • Reversing-x64Elf-100
  • 玩转opencraw
  • 6500亿美元AI资本开支:科技巨头逆势布局的底层逻辑与行业博弈
  • 深度解析:AI原生应用中的人机协作架构设计
  • 湖北2026省选试机题目 - 填充
  • 容器发展史
  • Godot游戏练习01-第4节-多人控制与玩家位置同步(翻车)