一键启动所有容器,你真的会用docker-compose up -d吗?

Docker Compose 的安装和使用详解 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,Docker Compose 和 OpenStack 中的 Heat 十分类似。我们知道,使用 Dockerfile 模板文件可以让用户很方便的定义一个单独的应用容器。然而,在实践过程中,我们经常会遇到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。 阅读详情

第一章:一键启动所有容器,你真的会用docker-compose up -d吗?

在微服务架构日益普及的今天,docker-compose up -d 成为开发者本地部署多容器应用的利器。它能根据 docker-compose.yml 文件定义的服务配置,一键启动所有依赖容器,并以后台模式运行,极大提升了开发与测试效率。

理解 docker-compose up -d 的核心作用

该命令不仅启动服务容器,还会自动处理网络、卷挂载和服务依赖关系。使用 -d 参数意味着“detached mode”,即容器在后台运行,不占用当前终端。
version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - app
  app:
    build: ./app
    environment:
      - NODE_ENV=production
上述配置文件定义了两个服务。执行以下命令即可一键启动:
# 在 docker-compose.yml 所在目录执行
docker-compose up -d
该命令会构建镜像(如需)、拉取缺失镜像,并启动所有服务容器。

常见操作场景与技巧

  • 仅重建并启动特定服务:docker-compose up -d --build app
  • 查看启动后的容器状态:docker-compose ps
  • 停止所有服务:docker-compose down
命令作用说明
docker-compose up -d后台启动所有服务容器
docker-compose up -d --force-recreate强制重新创建容器,即使配置未变
docker-compose up -d service_name仅启动指定服务及其依赖
正确使用 docker-compose up -d 能显著简化本地环境管理,但需确保配置文件逻辑清晰,避免循环依赖或端口冲突。

第二章:深入理解 docker-compose up -d 的核心机制

2.1 docker-compose.yml 文件结构解析与服务定义

核心结构概览
docker-compose.yml 采用 YAML 格式定义多容器应用服务,其顶层字段包括 services、volumes、networks 等。其中 services 是必选核心,用于描述各个容器的运行配置。
服务定义示例
version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
该配置定义了两个服务:web 使用 Nginx 镜像并映射端口 80,通过卷挂载静态文件;db 服务基于 MySQL 5.7,设置环境变量初始化 root 密码。字段 ports 实现主机与容器网络映射,volumes 支持持久化数据与配置共享。

2.2 up -d 命令背后的容器生命周期管理

执行 docker-compose up -d 时,Docker 并非简单启动容器,而是触发一整套生命周期管理流程。
容器状态机演进
该命令会依次经历构建(如有必要)、创建、启动、分离(detached)四个阶段。每个阶段都受容器状态机控制:
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    restart: unless-stopped
上述配置中,restart 策略影响容器在运行时的生命周期行为,unless-stopped 表示除非手动停止,否则始终重启。
核心操作流程
  • 解析 compose 文件中的服务依赖关系
  • 按拓扑顺序创建网络和卷资源
  • 拉取或构建镜像
  • 创建并后台启动容器
图示:up -d 触发的典型执行流程

2.3 后台运行模式(detached mode)的工作原理与优势

在容器化技术中,后台运行模式(detached mode)允许进程在非交互式状态下持续执行,避免因终端关闭而中断服务。
工作原理
Docker 容器通过 -d 参数启用 detached 模式,将容器进程挂载至系统后台。该模式下,容器的标准输入(stdin)被关闭,但日志仍可通过 docker logs 查看。
docker run -d --name web-server -p 8080:80 nginx:latest
上述命令启动一个 Nginx 容器:-d 表示后台运行,--name 指定容器名称,-p 映射端口。容器启动后立即返回终端控制权。
核心优势
  • 提升服务可用性:容器独立于终端生命周期运行
  • 便于集成自动化运维脚本
  • 支持多容器并行管理,资源调度更高效

2.4 依赖关系处理:depends_on 与启动顺序控制实践

在容器化编排中,服务间的依赖关系直接影响系统稳定性。Docker Compose 提供 `depends_on` 指令,用于声明服务启动顺序。
基础语法与行为
version: '3.8'
services:
  db:
    image: postgres:13
  web:
    image: myapp
    depends_on:
      - db
上述配置确保 `web` 服务在 `db` 启动后再启动。但需注意:`depends_on` 仅控制启动顺序,不等待服务内部就绪。
健康检查增强依赖控制
结合健康检查可实现更精准的依赖等待:
  • 定义容器健康状态判定条件
  • 依赖服务将等待目标进入 healthy 状态
通过合理使用 `depends_on` 与健康检查,可构建稳定可靠的多服务启动流程。

2.5 网络与卷的自动初始化过程剖析

在容器化平台启动初期,网络与存储卷的自动初始化是保障服务可运行性的关键步骤。系统通过预定义配置触发底层驱动程序的加载流程。
初始化触发机制
当容器引擎检测到新任务时,首先调用网络插件接口(CNI)创建命名空间隔离的网络环境,并通过插件链完成IP分配、路由设置和DNS配置。
// CNI 配置示例
{
  "cniVersion": "0.4.0",
  "name": "demo-network",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.88.0.0/16"
  }
}
上述配置定义了桥接网络模式,其中ipam字段指定使用本地子网进行IP地址管理,确保容器间通信可达。
卷的动态挂载流程
存储卷由编排系统根据Pod声明自动创建,支持NFS、iSCSI或云存储后端。初始化阶段会校验访问权限并绑定宿主机目录。
阶段操作
发现解析PersistentVolumeClaim请求
绑定关联PV与PVC
挂载在目标节点执行mount操作

第三章:常见问题与最佳实践指南

3.1 容器启动失败排查:日志查看与常见错误应对

容器启动失败是日常运维中的高频问题,首要排查手段是查看容器日志。使用以下命令获取详细输出:
docker logs <container_id>
该命令输出容器的标准输出和标准错误流,可定位应用崩溃、配置加载失败等问题。若容器反复重启,建议添加 --tail 和 --follow 参数实时追踪日志。
常见错误类型及应对
  • 镜像拉取失败:检查镜像名称、标签及仓库认证信息;
  • 端口冲突:使用 docker ps 查看占用端口,或更换宿主机映射端口;
  • 挂载目录权限拒绝:确保宿主机路径存在且容器用户具备读写权限。
快速诊断流程图
┌─────────────┐ │ 启动失败? │ └────┬───────┘ ↓ ┌─────────────┐ │ 查看容器日志 │ └────┬───────┘ ↓ ┌─────────────┐ │ 根据错误类型修复 │ └─────────────┘

3.2 环境变量与配置分离:提升可移植性的实战技巧

在现代应用部署中,将环境变量与代码逻辑解耦是实现高可移植性的关键实践。通过外部化配置,同一份代码可在开发、测试和生产环境中无缝切换。
使用环境变量管理配置
应用应避免硬编码数据库地址、密钥等敏感信息。推荐通过操作系统环境变量注入配置:
export DATABASE_URL="postgresql://user:pass@localhost:5432/mydb"
export LOG_LEVEL="debug"
该方式确保配置随部署环境动态变更,无需修改源码。
配置优先级设计
合理的配置加载顺序能提升灵活性:
  1. 默认配置(代码内建)
  2. 环境变量(覆盖默认值)
  3. 命令行参数(最高优先级)
dbURL := os.Getenv("DATABASE_URL")
if dbURL == "" {
    dbURL = "sqlite:///default.db" // 回退默认值
}
上述代码展示了安全读取环境变量并设置默认回退的模式,增强系统鲁棒性。

3.3 资源限制设置:避免因内存或CPU不足导致启动中断

在容器化部署中,合理配置资源限制是保障服务稳定启动的关键。若未设置适当的内存和CPU限制,容器可能因节点资源不足而被终止。
资源配置示例
resources:
  limits:
    memory: "512Mi"
    cpu: "500m"
  requests:
    memory: "256Mi"
    cpu: "250m"
上述YAML定义了容器的最小(requests)和最大(limits)资源需求。memory限制防止内存溢出引发OOM Kill,cpu以毫核为单位控制计算资源占用。
资源单位说明
  • cpu: "500m" 表示500毫核,即半颗CPU核心
  • memory: "512Mi" 使用二进制单位,等于512 * 10242 字节

第四章:进阶应用场景与优化策略

4.1 多环境部署:通过覆盖文件实现开发、测试、生产差异化启动

在微服务架构中,不同环境(开发、测试、生产)的配置差异显著。通过 Spring Boot 的 application-{profile}.yml 机制,可实现配置分离。
配置文件结构示例
# application-dev.yml
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db
    username: dev_user
该文件专用于开发环境,指定本地数据库连接与调试端口。
激活指定环境
通过命令行参数激活:
java -jar app.jar --spring.profiles.active=prod
系统将自动加载 application-prod.yml 覆盖默认配置。
  • 开发环境:启用热部署,连接本地数据库
  • 测试环境:使用模拟数据源,开启日志追踪
  • 生产环境:关闭调试信息,连接高可用集群

4.2 构建缓存优化:加速 build 阶段提升 up -d 效率

在 Docker 构建过程中,频繁执行 `docker-compose up -d` 导致重复构建会显著拖慢开发迭代速度。利用构建缓存是提升效率的关键手段。
分层构建与缓存复用
Docker 镜像构建采用分层机制,每一层基于前一层缓存。合理组织 Dockerfile 指令顺序,可最大化缓存命中率。
FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install --production
COPY . .
CMD ["npm", "start"]
上述代码中,先拷贝依赖描述文件并安装,再复制源码。当仅修改源码时,npm 安装层仍可复用缓存,避免重复下载。
使用构建参数优化缓存粒度
通过 `--build-arg` 可控制缓存键,例如添加时间戳强制刷新缓存: --build-arg CACHE_BUST=$(date +%s) 结合 CI/CD 环境,智能判断是否启用缓存,平衡更新与速度需求。

4.3 健康检查配置:确保服务真正就绪而非仅容器运行

在容器化部署中,容器启动成功并不等同于应用已可对外提供服务。Kubernetes 通过探针机制区分容器的“存活”与“就绪”状态,避免流量被错误转发至未准备完成的服务实例。
探针类型与应用场景
  • livenessProbe:判断容器是否运行正常,失败则触发重启;
  • readinessProbe:确认服务是否已准备好接收流量,未通过则从 Service 转发列表中剔除;
  • startupProbe:用于慢启动服务,避免早期探针误判。
典型配置示例
readinessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5
  timeoutSeconds: 2
  successThreshold: 1
  failureThreshold: 3
上述配置表示:容器启动 10 秒后开始检查,每 5 秒发起一次 HTTP 请求至 /health 接口,超时 2 秒即视为失败。连续 3 次失败将标记为未就绪,阻止流量进入。 合理设置健康检查能显著提升系统稳定性,避免因依赖初始化延迟导致的请求失败。

4.4 集成 CI/CD 流程:自动化部署中的安全启动模式

在现代 DevOps 实践中,CI/CD 流程的自动化必须与系统安全启动机制深度集成,以防止未经授权的代码部署。
安全启动的关键检查点
  • 代码签名验证:确保提交的构建产物来自可信源
  • 镜像完整性校验:使用哈希比对防止中间篡改
  • 最小权限原则:部署服务账户仅具备必要操作权限
GitLab CI 中的安全部署配置示例

deploy-prod:
  stage: deploy
  script:
    - ssh -i $SSH_KEY user@prod "sudo systemctl start app"
  environment: production
  only:
    - main
  before_script:
    - echo "$SSH_KEY" > key.pem && chmod 600 key.pem
该配置通过变量注入私钥并限制仅从主分支触发,实现受控部署。$SSH_KEY 为预定义的加密变量,避免凭据硬编码。
部署流程中的信任链构建
→ 代码提交 → 构建签名 → 安全扫描 → 凭据注入 → 目标主机验证 → 服务启动

第五章:从掌握到精通——构建高效的容器编排思维

理解声明式与命令式操作的本质差异
在 Kubernetes 中,声明式配置是高效编排的核心。与直接执行 kubectl run 这类命令式操作不同,使用 YAML 清单文件定义期望状态,能让系统自动调和实际状态。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
该配置确保始终运行三个 Nginx 实例,即使节点故障也能自动恢复。
设计高可用的 Pod 分布策略
为避免单点故障,应利用拓扑分布约束(Topology Spread Constraints)控制 Pod 分布。通过以下策略,可实现跨区域均衡部署:
  • 按区域(zone)分散 Pod,提升容灾能力
  • 设置 maxSkew 控制偏差程度
  • 结合节点亲和性(nodeAffinity)实现精细调度
优化资源管理与自动伸缩
合理设置资源请求与限制是保障集群稳定的关键。下表展示了典型 Web 服务的资源配置建议:
服务类型CPU 请求内存限制HPA 目标利用率
前端 API200m512Mi70%
批处理任务1000m2Gi85%
结合 HorizontalPodAutoscaler,可根据 CPU 或自定义指标动态调整副本数,实现成本与性能的平衡。
Docker-compose:管理多个容器 Docker-Compose 是 Docker 公司推出的一个开源工具软件,可以管理多个 Docker 容器组成一个应用。 阅读详情

相关推荐

Docker基础教程(188)Docker Compose命令基础之启动项目的up命令:Docker Compose Up:一键启动容器的魔法咒语,让你告别“它在我电脑上能跑”的噩梦!

Docker Compose up命令是容器编排中的“魔法启动键”,能够一键部署多容器应用。本文深度解析up命令的核心参数、工作流程及实战技巧,涵盖常见应用场景排错指南。通过完整的Web项目示例,演示如何快速部署包含Node.js、Redis和Nginx的完整应用栈,让你彻底告别“环境依赖”噩梦,实现真正的一键部署!

jxf_jxfcsdn的博客 1618

docker-compose up与docker-compose up -d

之前一直在国内博客上查阅这两个命令的区别。有的存在一些误导。现结合docker官方文档,简单看下这两个命令的用法 一、docker-compose up 与docker-compose up -d 用法和区别 两者都是创建或者重新创建容器,附加给当前服务器,除此之外,除非服务已经运行,否则启动所有链接服务。 docker-compose up 本质是docker-compose logs -f,它会收集所有容器的日志输出直到退出命令,或者容器都停止运行。 docker-compose up -d 以后台的方

qq_38971642的博客 3万+

Docker基础教程(185)Docker Compose命令基础之启动服务容器的start命令:Docker Compose start:拯救手残党的容器唤醒术!别再“up”一下莽到底了

Docker世界里的docker-compose start命令,宛如一位低调的容器唤醒师。它不重新构建,不创建新容器,只是优雅地将已存在但处于停止状态的容器重新启动,恢复其之前的运行状态。本文深度剖析start命令的工作机制、与up、restart的本质区别,并通过从单服务到多服务的完整示例,展示其精准、高效的操作场景,助你摆脱资源浪费,实现容器管理的精细化控制。

jxf_jxfcsdn的博客 782

docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令

如果容器未创建,会先构建镜像(如果定义了。

jiang_changsheng的博客 9102

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗

重复使用时,会根据服务配置和镜像状态智能处理,确保最终运行的容器符合。的定义,并非简单的“覆盖”,而是更灵活的更新或启动操作。

ZhangJiqun&191cm&85kg 1198

Docker:Docker-Compose使用

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!(如下图:就是一个帮手,小伙手挺多啊) Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下例子-: 上面的Compose文件就描述一个项目,其中包含两个容器:DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/其实DockerCompose文件可以看做是将多个docker run命令

流楚丶格念的博客 1141

Docker Compose Up 命令:容器编排的核心操作

摘要:docker compose up是Docker容器编排的核心命令,用于自动化构建、创建和启动容器服务。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 8750

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

ocean00008899的博客 1285

docker-compose up -d和docker-compose up --build的补充_docker compose up -d

命令用于启动已定义在文件中的服务容器,并以守护进程的方式在后台运行。

2401_86402614的博客 2117

AutoSAR实战:手把手教你配置PNC(Partial Network Cluster)实现精准休眠与唤醒

本文详细介绍了如何在AutoSAR中配置PNC(Partial Network Cluster)实现精准休眠与唤醒,通过DaVinci Configurator工具逐步指导,结合ComM模块的协同调试,优化车载电子系统的能耗管理。文章包含实战步骤、常见错误排查及功耗优化数据,适合汽车电子开发工程师参考。

weixin_33725239的博客 466

docker-compose down && docker-compose up -d --build到底是干什么的?使用场景是什么?底层原理是什么?

Docker:Docker 是一个容器化平台,它允许开发者将应用程序及其依赖打包成一个独立的“集装箱”,称为容器。这样可以确保应用在任何环境中都能一致运行。:Docker Compose 是 Docker 的一个工具,它允许你定义和管理多容器的应用程序。你可以通过一个文件配置多个服务(例如 Web 应用、数据库等),并一次性启动或停止它们。是一条常用的命令组合,用于停止并移除现有的 Docker 容器,然后重新构建镜像并启动新的容器。这在开发过程中更新代码、部署新版本或清理环境时非常有用。

长风破浪会有时的博客 1499

Moveit +Gazebo:搭建单臂机械臂仿真平台

Moveit +Gazebo:搭建单臂机械臂仿真平台

magic_invaid的博客 5290

docker-compose up -d和docker-compose up --build的补充

【代码】docker-compose up -d和docker-compose up --build的补充。

缘友一世的博客 1万+

从噪声中提取真相:LabVIEW振动信号积分处理的降噪艺术

本文深入探讨了LabVIEW在振动信号积分处理中的降噪技术,揭示了如何通过选择性频率加权从噪声中提取关键故障特征。详细介绍了时域和频域积分方法的实现原理及优化策略,并结合工业案例展示了多轴信号联合降噪的实际应用效果,为设备状态监测提供了高效解决方案。

weixin_29164185的博客 302

大智慧L2实时api接口的逐笔委托功能执行代码分享

用过l2行情接口的投资者应该都了解大部分的接口都是有逐笔委托功能的,那么大智慧L2实时api接口也有着很强大的逐笔委托功能,投资者可以通过这个逐笔委托功能可以看到一个股票的每天出现的全部委托指令,那么在这个逐笔委托功能里包含了委托价格、委托时间、委托量和委托方向四个要素!那么接下来小编就分享一下大智慧L2实时api接口的逐笔委托功能执行代码!那么在这里提个醒:投资者可以在大智慧L2实时api接口进行设置过滤,在逐笔委托列表里,就仅仅只会显示超过设置委托量或委托额的委托单,而不再显示小单。

Qq_2037696191的博客 3732

docker-compose up -d和docker-compose up --build的补充_docker compose up -d(1)

文件,并根据文件中定义的服务配置重新构建容器的镜像。这意味着它会重新执行容器镜像的构建过程,包括下载依赖、安装软件、配置环境等步骤。文件中的服务容器,并以守护进程的方式在后台运行。命令用于重新构建并启动服务容器。命令用于启动已定义在。

2401_87288762的博客 1029

get_ccopt系列命令介绍

get_ccopt_property:用来获取cts阶段,clock tree上所有的参数信息,可以通过get_ccopt_property –help *获取所有参数。get_ccopt_skew_group_delay:用来获取skew group的相关信息,可以通过筛选出特定条件下skew_group的参数,如skew_group下latency最长是多少;get_ccopt_clock_tree_source_groups:获取clock tree的source group名字;

芯冰乐 280

Docker Compose高效运维秘诀(up -d命令深度解析)

掌握Docker Compose启动所有服务up -d技巧,提升容器编排效率。适用于多服务应用部署场景,一键后台启动并管理全部容器,节省运维时间,保障服务稳定运行。配置灵活、操作简洁,是DevOps高效协作的关键实践。值得收藏

FuncIsle的博客 1056

ZYNQ工业级串口方案:AXI UART 16550扩展RS-485实战(自动方向控制+Linux驱动)

可以轻松扩展出多路工业级串口。但常规方案需要手动控制收发方向(DE/RE引脚),存在实时性差、CPU占用高等痛点。本文从硬件逻辑设计到Linux驱动开发,完整实现了ZYNQ平台的RS-485工业通信方案。,解决了传统方案实时性差的痛点。所有代码均经过实际项目验证,可直接用于生产环境。:尝试将此设计扩展为多协议兼容接口(支持RS-422/RS-232切换)!等特性,依然是现场总线通信的首选。,通过硬件逻辑+Linux驱动协同设计,实现零延迟切换。在工业自动化、能源电力等场景中,RS-485凭借。

QQ_778132974的博客 830

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Docker Compose部署必看】:深入解析“docker-compose up -d”常见报错及解决方案

快速解决Docker Compose部署难题,深入剖析docker-compose up -d 报错原因排查全过程。涵盖网络冲突、镜像拉取失败等常见场景,提供精准命令与配置修正方案,提升容器编排效率,值得收藏。

ProceSeed的博客 1780

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Docker Compose实战指南】:掌握up -d命令的5大核心技巧与避坑策略

掌握Docker Compose启动所有服务up -d技巧,轻松实现多容器应用一键部署。涵盖开发、测试与生产环境的自动化编排,详解后台运行、依赖管理、配置优化等五大核心方法,提升运维效率,避免常见错误。实用指南值得收藏。

ByteShoal的博客 1437

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

docker-compose up -d <name>; No such service: <name>

问题描述 使用docker-compose up -d docker-compose.yml运行启动一个docker,报错: ERROR: No such service: docker-compose.yml 解决方案 正常启动并不需要指定docker-compose.yml文件,直接docker-compose up -d 就行了。 不过因此了解到docker-compose up ...

漫步量化 1万+

Docker Compose:从单容器到多容器一键部署

本文系统介绍了 Docker Compose 的定义、语法、核心命令及实际应用。 通过对比传统的 docker run 启动方式与基于 Compose 的配置式管理,展示了 Compose 在多容器场景下的巨大优势——配置集中、自动化管理、高可移植性。 以 WordPress + MySQL 部署为例,文章详细讲解了如何从零编写 compose.yaml 文件并实现一键启动,帮助读者快速上手 Compose 的使用与实践。

weixin_54946088的博客 997
上一篇: 【Docker Compose变量插值终极指南】:深入掌握${VAR}的5种高级用法与避坑技巧
下一篇: 如何用分层缓存提升CI/CD效率?Docker镜像优化实战揭秘
ProceSeed
博客等级 码龄1年 161粉丝 2185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值