5分钟彻底搞懂Docker Compose网络别名,开发效率提升3倍的秘密

第一章:Docker Compose网络别名的核心概念

在使用 Docker Compose 编排多容器应用时,服务间的通信是关键环节。网络别名(network aliases)为容器提供了可读性强、易于维护的主机名,使得服务可以通过自定义的名称在同一个网络中被发现和访问。

网络别名的作用

  • 允许为服务在特定网络中定义一个或多个别名
  • 其他容器可通过该别名进行 DNS 解析并建立连接
  • 提升配置灵活性,支持同一服务在不同场景下使用不同名称
配置示例
以下是一个典型的 docker-compose.yml 配置片段,展示如何为服务设置网络别名:
version: '3.8'
services:
  web:
    image: nginx
    networks:
      app-network:
        aliases:
          - frontend
          - dashboard

  api:
    image: my-api-service
    networks:
      app-network:
        aliases:
          - backend
          - service-api

networks:
  app-network:
    driver: bridge
上述配置中,web 服务在 app-network 网络中拥有两个别名:frontend 和 dashboard。这意味着在该网络中的其他容器(如 api)可以通过这些别名访问 web 服务,例如通过 http://frontend:80 发起请求。

DNS 解析机制

Docker 内建的 DNS 服务器会自动将别名解析到对应容器的 IP 地址。这一机制对应用透明,无需额外配置。
服务名称网络可用别名
webapp-networkfrontend, dashboard
apiapp-networkbackend, service-api
graph LR A[Client Container] -->|Resolve 'frontend'| B[Docker DNS] B --> C[Web Service IP] D[API Service] -->|Call http://backend| C

第二章:深入理解Docker Compose网络别名机制

2.1 网络别名的工作原理与容器通信基础

在 Docker 容器网络中,网络别名(Network Alias)是服务发现和容器间通信的关键机制。当多个容器连接到同一个用户定义的桥接网络时,可以通过为容器分配别名,实现基于名称的访问。
别名注册与 DNS 解析
Docker 内置 DNS 服务器会自动将别名映射到对应容器的虚拟 IP。同一网络中的容器可通过别名直接通信,无需知晓具体 IP 地址。
docker run -d --name web-server --network mynet --alias web nginx
该命令启动容器并注册别名 web,其他容器可使用 http://web:80 访问。
通信流程示例
  • 容器 A 向容器 B 的别名发起请求
  • Docker DNS 返回容器 B 的虚拟 IP
  • 数据包通过虚拟网桥转发至目标容器
这种机制简化了微服务架构中的依赖配置,提升了网络拓扑的灵活性。

2.2 docker-compose.yml中networks与aliases的配置详解

在微服务架构中,容器间的通信依赖于网络配置。`docker-compose.yml` 中的 `networks` 允许自定义网络,实现服务隔离与互通。
自定义网络配置
networks:
  app-network:
    driver: bridge
该配置创建一个名为 `app-network` 的桥接网络,服务通过 `network_mode` 或 `networks` 字段加入此网络。
使用 aliases 设置服务别名
services:
  web:
    image: nginx
    networks:
      app-network:
        aliases:
          - frontend
          - api.gateway
`aliases` 允许为服务设置多个 DNS 别名,其他容器可通过这些别名访问服务,提升可读性与灵活性。
  • 别名支持多域名解析,便于服务发现
  • bridge 网络中,alias 可替代硬编码 IP 地址

2.3 容器间通过别名实现服务发现的底层流程

在 Docker 网络模型中,容器间通过别名实现服务发现依赖于内嵌的 DNS 机制。当容器加入自定义网络并设置别名时,Docker 内部 DNS 服务器会自动注册该别名与容器 IP 的映射关系。
DNS 解析流程
容器发起对别名的解析请求时,请求首先被转发至守护进程内置的 DNS 服务。该服务查询本地映射表并返回对应的 IP 地址,实现无须外部配置的服务定位。
配置示例
docker run -d --name web --network mynet --alias service.web nginx
上述命令将容器 web 在网络 mynet 中注册别名 service.web,其他容器可通过此别名直接访问。
映射关系表
别名容器名称IP 地址
service.webweb172.18.0.2

2.4 自定义网络与默认网络下别名的行为差异分析

在Docker网络模型中,服务别名在网络发现机制中扮演关键角色。默认桥接网络与自定义桥接网络对别名的处理存在显著差异。
默认网络中的别名限制
默认的bridge网络不支持为容器配置DNS别名,仅可通过--link实现有限的主机名解析,且不具备动态发现能力。
自定义网络的DNS增强
在自定义桥接网络中,每个容器可使用--network-alias设置多个别名,内嵌DNS自动解析:
docker run -d --name app --network mynet --network-alias web --network-alias api myimage
该命令使容器可通过app、web、api三个主机名在同一网络中被发现,提升服务灵活性。
  • 默认网络:无DNS别名支持,依赖静态/etc/hosts
  • 自定义网络:内置DNS服务器支持动态别名解析

2.5 实践:构建多容器应用并验证别名连通性

在 Docker 网络中,容器间通信常依赖自定义网络与服务别名。首先创建自定义桥接网络:
docker network create --driver bridge app-net
该命令创建名为 `app-net` 的隔离网络,支持容器通过别名直接通信。 启动两个容器并指定网络别名:
docker run -d --name service-a --network app-net --network-alias=backend nginx
docker run -d --name service-b --network app-net --network-alias=cache redis
--network-alias 参数为容器分配 DNS 别名,使其他容器可通过名称(如 backend)解析到对应 IP。 进入 service-a 容器测试连通性:
docker exec -it service-a ping cache
若返回 ICMP 响应,则证明别名解析与网络路径均正常,实现基于别名的服务发现机制。

第三章:网络别名在开发环境中的典型应用场景

3.1 微服务间调用时使用别名简化依赖配置

在微服务架构中,服务间通过网络地址直接调用会增加配置复杂度和耦合性。引入别名机制可将物理地址抽象为逻辑名称,提升可维护性。
服务别名配置示例

services:
  payment-service:
    alias: payments
    url: http://192.168.1.10:8080
  inventory-service:
    alias: inventory
    url: http://192.168.1.11:8080
该配置将实际服务地址映射为易记的别名。应用层通过payments即可访问支付服务,无需关注具体IP和端口。
优势分析
  • 降低服务依赖的硬编码风险
  • 支持灵活的服务迁移与替换
  • 便于多环境(测试/生产)统一配置管理

3.2 多实例负载均衡测试中的别名复用技巧

在多实例负载均衡测试中,合理利用别名复用可显著提升配置效率与可维护性。通过为服务实例定义统一别名,可在不同测试场景中动态映射实际节点,避免重复配置。
别名配置示例
aliases:
  web-service: ["192.168.1.10:8080", "192.168.1.11:8080", "192.168.1.12:8080"]
  db-master: "10.0.2.5:3306"
上述配置将多个真实IP绑定至web-service别名,测试框架可基于策略轮询调用,实现透明负载分发。别名抽象屏蔽了底层拓扑变化,便于横向扩展。
复用优势分析
  • 降低配置冗余:同一别名可在多处测试用例中复用
  • 提升可读性:语义化名称替代IP地址,增强脚本可理解性
  • 支持动态更新:无需修改代码即可调整后端实例映射

3.3 实践:利用别名模拟生产环境DNS解析行为

在本地开发中,常需模拟生产环境的域名解析行为。通过配置 DNS 别名(CNAME),可将测试服务指向真实域名,而无需修改实际部署。
DNS 别名的作用
别名记录允许将一个域名指向另一个域名,在开发阶段可用于模拟线上 CDN 或微服务间的调用路径。
配置示例
# 在本地 /etc/hosts 中添加映射
127.0.0.1   api.example.com

# 或使用容器网络别名(Docker Compose)
services:
  web:
    image: nginx
    networks:
      app-net:
        aliases:
          - api.production.internal
上述配置使容器内请求 api.production.internal 时被解析到对应服务,实现与生产环境一致的域名访问逻辑。
应用场景
  • 前端应用对接后端 API 的域名白名单校验
  • 第三方 OAuth 回调域名匹配
  • 证书通配符域名验证

第四章:优化与调试网络别名配置的最佳实践

4.1 如何避免别名冲突与命名混乱问题

在大型项目中,模块和变量的命名若缺乏规范,极易引发别名冲突。统一命名约定是首要原则,推荐采用语义清晰、层级明确的命名方式。
命名规范建议
  • 使用小写字母加下划线(snake_case)命名变量
  • 包名应简洁且唯一,避免通用词汇如 utils
  • 导出符号使用大驼峰(PascalCase)以增强可读性
代码示例:Go 中的包别名管理
import (
    "github.com/project/utils"
    dbutils "github.com/project/database/utils"
)
上述代码通过显式指定别名 dbutils 避免两个 utils 包的导入冲突。别名仅在当前文件有效,不影响其他包的引用逻辑。
常见冲突场景对照表
场景风险解决方案
同名包导入编译报错使用别名区分
全局变量重名覆盖隐患限定作用域或重命名

4.2 使用docker network inspect诊断别名生效状态

在容器网络调试中,验证服务别名是否正确生效是关键步骤。`docker network inspect` 命令可详细查看网络内容器的配置信息,包括IP地址、端口映射及**网络别名(Aliases)**。
查看网络详情
执行以下命令可获取指定网络的完整配置:
docker network inspect my_network
输出中重点关注 `Containers` 字段,每个容器条目会列出其分配的IPv4/IPv6地址以及配置的别名列表。若某容器设置了别名如 `db-primary`,则应在对应容器的 `Aliases` 数组中出现。
别名解析验证流程
  • 启动两个容器并连接至同一自定义网络,其中一个设置别名
  • 使用 docker exec 进入客户端容器
  • 通过 ping db-primary 测试解析
  • 若失败,立即运行 docker network inspect 确认别名是否存在
该命令是排查容器间DNS通信问题的核心工具,确保服务发现机制正常运作。

4.3 动态更新别名时的服务可用性保障策略

在动态更新服务别名过程中,保障服务的持续可用性是系统稳定性设计的关键环节。为避免因别名切换导致的请求中断,需引入平滑过渡机制。
双注册与流量切换
在目标服务实例启动后,同时向注册中心注册新旧两个别名,确保旧别名仍可接收流量。通过权重逐步将流量从旧别名迁移至新别名。
// 示例:服务别名更新时的注册逻辑
func UpdateServiceAlias(oldAlias, newAlias string) {
    RegisterWithWeight(oldAlias, 100) // 初始旧别名权重100
    RegisterWithWeight(newAlias, 0)    // 新别名初始权重0
    GraduallyShiftWeight(oldAlias, newAlias, 10) // 每10秒调整权重
}
该代码实现权重渐变控制,参数 oldAlias 和 newAlias 分别表示新旧别名,10 表示每次迁移间隔时间(秒),确保流量平稳过渡。
健康检查与回滚机制
  • 持续监控新别名下实例的健康状态
  • 若检测到异常,立即停止权重上升并触发自动回滚
  • 保留旧实例至少一个完整生命周期,防止雪崩

4.4 实践:结合CI/CD流水线自动化验证别名配置

在现代DevOps实践中,域名别名(CNAME)配置的准确性直接影响服务发布的一致性与可用性。通过将别名验证嵌入CI/CD流水线,可在部署前自动检测DNS配置错误,防止因配置遗漏导致的线上故障。
自动化验证流程设计
流水线中新增验证阶段,利用脚本查询目标域名的CNAME记录,并比对预期值。若不匹配,则中断部署并告警。
# 验证CNAME配置示例
dig +short CNAME www.example.com | grep -q "prod-cdn.example.net"
if [ $? -ne 0 ]; then
  echo "CNAME验证失败:www.example.com 未指向 prod-cdn.example.net"
  exit 1
fi
该脚本使用 dig 查询CNAME记录,grep -q 判断是否包含预期值,失败时返回非零状态码以触发流水线中断。
集成至CI/CD阶段
  • 在部署后但流量切换前执行验证
  • 支持多环境独立配置(如staging、production)
  • 结合通知机制,及时反馈结果

第五章:总结与未来工作方向

性能优化的持续探索
在高并发系统中,数据库连接池配置直接影响响应延迟。例如,使用 Go 语言时可通过以下方式优化 sql.DB 设置:
// 设置最大空闲连接数
db.SetMaxIdleConns(10)
// 允许最大打开连接数
db.SetMaxOpenConns(100)
// 连接最长生命周期
db.SetConnMaxLifetime(time.Hour)
此类调整已在某电商平台订单服务中验证,QPS 提升达 37%。
可观测性体系构建
现代分布式系统必须集成监控、日志与追踪。推荐采用如下技术组合:
  • Prometheus 收集指标数据
  • Loki 处理结构化日志
  • Jaeger 实现分布式追踪
  • Grafana 统一可视化展示
某金融客户通过该方案将故障定位时间从平均 45 分钟缩短至 8 分钟。
边缘计算场景拓展
随着 IoT 设备激增,将推理任务下沉至边缘节点成为趋势。下表对比主流边缘框架能力:
框架延迟(ms)设备支持模型格式
TensorFlow Lite23Android, iOS, MCU.tflite
ONNX Runtime19Linux, Windows, ARM.onnx
实际部署中,结合 Kubernetes Edge API 可实现批量配置更新与健康检查自动化。
Pytest与Jenkins实战:构建自动化测试与持续集成工作流 单元测试是软件质量保障的基石,它通过验证代码最小单元的准确性来确保功能正确性。其核心原理在于隔离测试、快速反馈和自动化执行,能有效提升代码可靠性与可维护性。在工程实践中,一个强大的单元测试框架是实现这一目标的关键技术支撑。Pytest作为Python生态中主流的测试框架,凭借其零样板代码、灵活的Fixture机制和丰富的插件生态,极大地简化了测试编写与管理,提升了测试效率。持续集成(CI)则将自动化测试的价值进一步放大,它通过自动化流水线,确保每次代码变更都能触发完整的构建与测试流程,从而实现快速的质量反馈 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化 第二百零一十一 软件开发模型01

编号类型模型领域模型中的知识点/因素/参数关联知识和法律法规1传统顺序模型瀑布模型 (Waterfall)通用软件开发、硬件紧密耦合系统、政府/军工项目、需求稳定的传统信息系统严格线性阶段:可行性研究→需求分析(SRS,含功能/非功能/接口/约束,使用IEEE 830模板)→系统设计(概要设计HLD:架构、模块划分、数据库ER图;详细设计LLD:伪代码、类图、接口定义)→实现(编码规范、代码审查、静态分析工具SonarQube)→测试(单元测试JUnit、集成测试、系统测试、验收测试UAT,测试计划提前编写

weixin_49199313的博客 149

Docker 中给命令起别名

docker 中给命令起别名

ONEBEYONDFANS的博客 1334

基于555定时器的呼吸灯电路

呼吸灯是指LED灯在芯片的控制下完成由亮到暗的逐渐变化,感觉就像人在呼吸,其广泛使用在手机上,起到一个通知提醒的作用。呼吸灯在许多灯光装饰上也有大量使用,如音响、汽车广告牌等,在生活中较为常见。...

qq1074237849的博客 9495

docker:打包和别名

上周公司让做一个项目迁移,将项目迁移到docker中,其中涉及到了打包和别名,但是公司的内容不能拿出来了,所以用我自己的项目做一个记录。以上就是最近遇到的有关别名和打包遇到的问题。

weixin_50835854的博客 1063

Mac 不小心断开移动硬盘导致磁盘无法读取和加载(顺利解决!)

Mac移动硬盘不正确断开连接导致无法读取加载的解决方法,亲测有效

Robin_Pi的博客 1万+

SAP 财务快速记账之--科目分配模型(Account assignment model )

SAP FICO 运维解决方案

lijinbao171022的博客 1767

docker-命令别名

修改/root/.bashrc文件。

m0_74462339的博客 343

NOIP2008年普及组初赛题目答案及解析

NOIP2008年初赛详细题解

城南蝈蝈 926

Docker命令起别名

本文介绍了在Linux系统中为docker命令设置别名的方法:1)通过vi编辑器打开.bashrc文件;2)添加两个别名配置,将"dps"映射为格式化输出的docker ps命令,将"dis"映射为docker images命令;3)使用source命令使配置生效;4)最后可通过输入别名命令来验证设置是否成功。这种方法能简化常用docker命令的输入,提高工作效率。

m0_62785037的博客 717

cosi-corr操作详细步骤

cosi-corr是一个可以加载到ENVI的软件包,由加利福尼亚理工学院的François Ayoub,  Sébastien Leprince,  and Lionel Keene开发,并且提供源代码,该软件受到了NSF的资助。软件的主要功能是可以满足各种影响的正射校正和影像配准。 针对下载下来的软件包参考《cosi-corr_guide.pdf》,进行配置使用具体详细过程如下: (本机环境

u013299471的专栏 1万+

延迟相乘叠加求和 DMAS (Field II 仿真代码)

(Delay Multiply and Sum, DMAS)算法,最初是为雷达微波系统设计的,研究者们对 DMAS 波束合成方法进行了修改,并应用超声成像。结果表明,DMAS 波束合成在模拟和实验中的表现都优于传统的延时叠加(Delay and Sum, DAS),这种新方法带来的主要改进是对比度分辨率明显提高(即主瓣和侧瓣更窄),从而增加了动态范围,提高了 B 型超声图像质量。与传统 DAS 相似,DMAS 算法通过对来自超声换能器阵元的信号应用几何计算延迟来聚焦接收到的波束。

weixin_38452364的博客 3083

linux:docker compose如何定义network的名称

在networks自定义网路中指定name属性,这样就不会使用默认的名称生成策略了。

Cloud Flower的博客-专注unity 1070

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 185

NIKKEAutoScript 进阶玩法:Docker 部署、多实例顺序执行与游戏多开实战教程

NIKKEAutoScript(NKAS)是一款面向《胜利女神:NIKKE》的自动日常脚本,支持 PC 客户端与安卓模拟器,功能覆盖日常收菜、前哨基地、模拟室、竞技场与剧情活动。对进阶用户来说,真正拉开效率差距的三大能力是:**Docker 部署**、**多实例顺序执行**和**游戏多开**——一套机器即可托管多个角色,7×24 小时自动完成日常任务 🚀 [![NIKKEAutoScript

gitblog_00093的博客 12

系统架构最佳实践 -- 统一身份认证系统

设计和实现一个高效、安全的统一身份认证系统需要考虑到系统架构设计、用户认证与授权、用户身份管理、安全性保障、日志记录与审计、高可用性与容错性,以及用户体验优化等多个方面。通过合理的架构设计、安全措施和用户体验优化,可以构建一个满足用户需求、提供安全可靠的身份认证服务的系统。本文将总结统一身份认证系统的架构设计与实践经验,帮助读者了解如何设计和实现一个高效、安全的统一身份认证系统。统一身份认证系统应支持详细的日志记录和审计功能。通过合理的身份认证策略和授权机制,可以确保用户身份的准确性和信息的安全性。

xiaoli8748的专栏 1705

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Kafka核心原理与实战:从消息队列架构到高吞吐调优全解析

消息队列是分布式系统解耦与削峰填谷的关键基础设施,而Kafka凭借其高吞吐、海量堆积与消息回溯能力,成为日志采集、事件驱动和实时计算场景的首选。理解Kafka,先要把握它的底层模型:顺序写磁盘、页缓存与零拷贝共同支撑了极致性能,分区与副本机制则解决了水平扩展和高可用问题。在实际工程中,Producer端的acks与幂等配置、Consumer端的偏移量提交与再均衡,都直接影响消息不丢不重的语义。本文从架构原理、核心机制到生产环境部署与排障实践,系统梳理Kafka的完整知识框架,并对比RabbitMQ、Rock

weixin_34265814的博客 340

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Docker的常见命令以及命令别名

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。然后,执行命令使别名生效。

杜小帅的博客 882

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Docker学习(11)------Docker 容器别名使用

操作环境 Centos 7 Docker version 17.04.0-ce, build 4845c56 操作步骤 我们发现在docker 宿主机重启后或者docker 服务重启后,docker container的ip会发生改变,所以在docker 内部通过ip从一个container来连接另一台container就不适用了, 这里我们使用--link参

bobpen的专栏 6392

Linux系统下为常用Docker命令设置别名

在使用Docker的过程中,你可能会发现一些命令特别长,每次输入都特别麻烦。别担心,提供了一个非常实用的功能——命令别名(alias),可以帮助我们简化这些繁琐的命令。通过简单的几步操作,你就可以为Docker命令设置一个更短、更易记的名字,比如把变成dis,让操作变得更加高效。

2201_75490194的博客 508

Docker——设置别名

1.进入root下的.bashrc文件。

LIUCHANGSHUO的博客 509

Docker Compose

Compose 项目是Docker官方的主要用于容器集群快速编排。从功能上看,跟中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。什么是编排容器?比如我们一个应用有多个微服务,但是这些微服务都部署在docker上,这时候我们需要创建容器并且启动或者暂停,只能一个一个的启动,这样对于运维来说是非常的麻烦,所以这时候就出现了docker-compse 用来快速创建,启动,停止容器等操作。

myli92的博客 4645

Docker网络别名到底怎么用?90%开发者忽略的关键细节

掌握Docker Compose网络别名的正确用法,解决容器间通信难题。适用于微服务互联、开发环境调试等场景,通过自定义别名简化服务调用。配置简单且提升可读性,90%开发者忽略的关键细节值得收藏。

FastDebug的博客 814

【Docker基础】Docker容器间通信:DNS解析与别名机制详解

Docker的DNS解析与别名机制为容器间通信提供了灵活、高效的解决方案。在实际应用中,建议结合Docker Compose等工具管理网络配置,遵循最小权限原则分配别名,并注意监控DNS相关性能指标。在现代微服务架构中,容器间的通信是构建分布式系统的基石。Docker作为最流行的容器化平台,提供了多种容器间通信机制,其中基于DNS解析的通信方式因其灵活性和易用性而备受青睐。默认情况下,不同网络中的容器不能直接通信。为现有容器添加网络别名。

IT成长日记的博客 1627

Docker Compose网络别名配置全攻略,告别容器间连接失败难题

掌握Docker Compose网络别名配置,轻松解决容器间通信难题。本文详解服务发现、自定义网络中别名设置方法,提升微服务协作效率,告别连接失败。实用技巧值得收藏。

InitFlow的博客 793

Docker Compose 网络设置

一些场景下,默认的网络配置满足不了我们的需求,此时我们可使用networks命令自定义网络。networks命令允许我们创建更加复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,我们还可使用networks将服务连接到不是由Compose管理的、外部创建的网络。如下,我们在其中定义了两个自定义网络。复制代码version: '2'services:proxy:networks:- frontapp:networks:- front- backdb:networks:- back。

weixin_42907150的博客 3523

docker-compose network名称定义

docker-compose启动的网络名称: 1、没有自定义网络名 $ cat docker-compose.yaml version: '2' services: zookeeper1: image: zookeeper container_name: zookeeper1 environment: - ZOO_MY_ID=1 - ZOO_SERVERS=server.1=zookeeper1:2888:3888 实际使用的网络是:&

wwqcherry的博客 5427
上一篇: 【微服务部署必看】:Docker Compose中depends_on如何精准控制服务依赖?
下一篇: 还在手动docker rmi?自动化清理镜像缓存的6种高阶策略
QuickTrans
博客等级 码龄1年 149粉丝 2018原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值