Docker NetWork (网络)

news2024/11/20 23:35:59

Docker 为什么需要网络管理

容器的网络默认与宿主机及其他容器都是相互隔离的,但同时我们也要考虑下面的一些问题, 比如

  • 多个容器之间是如何通信的
  • 容器和宿主机是如何通信的
  • 容器和外界主机是如何通信的
  • 容器中要运行一些网络应用(如 nginx、web 应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用应该如何实现。
  • 容器不想让它的网络与宿主机、与其他容器隔离应该如何实现
  • 容器根本不需要网络的时候应该如何实现
  • 容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应该如何实现
  • ········

上述的这些问题都需要我们对容器的网络进行合理的管理才能解决,这就体现出了容器网络管理的重要性。

Docker 网络架构简介

Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。

Docker 为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和驱动。

CNM

Docker 网络架构采用的设计规范是 CNM(Container Network Model)。CNM 中规定了 Docker 网络的基础组成要素:Sandbox、Endpoint、Network。
在这里插入图片描述

  • Sandbox:提供了容器的虚拟网络栈,也即端口、套接字、IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
  • Network:Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。
  • Endpoint:就是虚拟网络的接口,就像普通网络接口一样,Endpoint 的主要职责是负责创建连接。Endpoint 类似于常见的网络适配器,那也就意味着一个 Endpoint 只能接入某一个网络, 当容器需要接入到多个网络,就需要多个 Endpoint。如上图所示,容器 B 有两个 Endpoint 并且分别接入 Networkd A 和 Network B。那么容器 A 和容器 B 之间是可以实现通信的,因为都接入了 NetworkA。但是容器 A 和容器 C 不可以通过容器 B 的两个 Endpoint 通信。

Libnetwork

Libnetwork 是 CNM 的一个标准实现。Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库,Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基于 Ingress 的容器负载均衡,以及网络控制层和管理层等功能。

驱动

驱动主要负责实现数据层相关内容,例如网络的连通性和隔离性是由驱动来处理的。驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,例如桥接网络和覆盖网络。Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。例如 Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver 等等。每个驱动负责创建其上所有网络资源的创建和管理。

常见网络类型

bridge 网络

bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。

host 网络

当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择。

Container 网络

这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

none 网络

Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。容器完全网络隔离。

overlay 网络

借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个Docker 守护进程连接在一起,使集群服务能够相互通信。当我们需要运行在不同 Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。
在这里插入图片描述

另外,在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,它是一个网
桥设备,主要用于 Docker 各容器及宿主机的网络通信。

Docker 网络管理命令

docker network create

  • 功能:创建自定义网络。
  • 语法:
    docker network create [OPTIONS] NETWORK
    
  • 说明:DRIVER 是 bridge 或 overlay,即内置网络驱动程序 (bridge 和 overlay 是内置的)。如果你安装了第三方或自己定制的网络驱动程序,也可以在此指定该 DRIVER。如果不指定 --driver 选项,命令会自动为你创建 bridge 网络。当你安装 Docker Engine 时,它会自动创建一个 bridge 网络。这个网络与 Docker Engine 传统上依赖的 docker0 网桥相对应。当你用 docker run 启动一个新容器时,它会自动连接到这个桥接网络。你无法删除这个默认的 bridge 网络,但可以使用网络创建(network create)命令创建新的网络。
    这个 overlay 网络会在讲容器编排之 SWARM 的时候提到!现在就不讲了!
  • 参数:
    • -d–driver:网络驱动。默认是 bridge 网络,即桥接网络。
    • –gateway:网关地址。
    • –subnet:表示网段的 CIDR 格式的子网。就是 IP 地址加子网掩码那一套。不写这个参数 Docker 会分配
    • –ipv6:启用 ipv6。
  • 演示:
    如下图:我们使用 docker network create 创建了一个自己的 bridge 网络,并且指定了子网为:192.168.0.0/16
docker network ls
docker network create -d bridge --subnet 192.168.0.0/16 mybridge

在这里插入图片描述


可以看到不指定 -d 默认就是 bridge 网络,不指定 subnet Docker 会给你分配!

docker network create mybridge2
docker network inspect mybridge2

在这里插入图片描述

docker network inspect

  • 功能:查看一个或者多个网络的详细信息。
  • 语法:
    docker network inspect [OPTIONS] NETWORK [NETWORK...]
    
  • 参数:
    • -f–format:指定返回数据的格式,如:json。
  • 演示:
    我们使用 docker network inspect 命令查看刚刚创建的网络的详细信息,可以看到有:Name,Driver,Subnet 等等信息。
docker network inspect mybridge

在这里插入图片描述

docker network connect

  • 功能:将容器连接到网络。可以是网络的名称或者网络的 ID。一旦连接成功,容器就可以与同一网络中的其他容器通信!
  • 语法:
    docker network connect [OPTIONS] NETWORK CONTAINER
    
  • 参数:
    • –ip:指定 IP 地址。创建网络的时候不是可以指定 Subnet 嘛,将容器连接到网络的时候就可以给这个容器指定 ip 地址!
    • –ip6:指定 IPv6 地址。
  • 演示:

如下图:我们提前使用 busybox 镜像运行一个容器,然后将 mybusybox1 这个镜像连接到 mybridge 这个桥接网络!

docker run -itd --name mybusybox1 busybox:1.36.1
docker network ls
docker network connect mybridge mybusybox1

在这里插入图片描述
我们输入 ifconfig 查看网卡信息!可以看出除了我们指定的 mybridge 对应的网络接口 eth1,本地环回的网络接口 lo,还有一个网络接口 eth0。这个 eth0 是啥?怎么来的!

docker exec -it mybusybox1 sh

在这里插入图片描述

可以看到这个 eth0 的网段和 bridge 这个网络的网段是一样的!说明在容器启动的时候如果不指定网络就会使用 Docker 默认的 bridge 网络。

docker network ls
docker network inspect bridge

在这里插入图片描述


如下图,我们在启动的时候就指定网络,ifconfig 就不会有默认的那个 bridge 网络了!并且下面的例子中我们还指定了 IP 地址,就会使用我们自己指定的,而不是依赖于分配!

docker run -dti --network mybridge --ip 192.168.1.1 busybox:1.36.1
docker ps
docker exec -ti optimistic_mestorf
ifconfig

在这里插入图片描述

docker network disconnect

  • 功能:断开一个容器与网络的连接。
  • 语法:
    docker network disconnect [OPTIONS] NETWORK CONTAINER
    
  • 演示:
    如下图:断开这个容器和 mybridge 的网络连接之后就只有 lo 这个本地环回的网络接口了!
docker ps
docker network disconnect mybridge optimistic_mestorf
docker exec -it optimistic_mestorf sh
ifconfig

在这里插入图片描述

docker network rm

  • 功能:删除一个或者多个网络。
  • 语法:
    docker network rm NETWORK [NETWORK...]
    
  • 别名:
    docker network remove
    
  • 演示:

如下图:运行的容器正在使用的网络不能被删除!

docker network connect mybridge optimistic_mestorf
dcoker network rm mybridge

在这里插入图片描述
将容器停掉之后就能正常删除了!
在这里插入图片描述

docker network prune

  • 功能:删除不使用的网络。
  • 语法:
    docker network prune [OPTIONS]
    
  • 参数:
    • -f–force:不提示。
  • 演示:
    除了一些默认的网络删不掉,只删除了 mybridge2,因为已经停止的容器关联的网络不算不使用!
    在这里插入图片描述

docker network ls

  • 功能:列出网络。
  • 语法:
    docker network ls [OPTIONS]
    
  • 别名:
    docker network list [OPTIONS]
    
  • 参数:
    • -f–filter:指定过滤条件。例如:driver=bridge
    • –format:指定返回的格式,如:json。
    • –notrunc:不截断。
    • -q–quiet:仅仅显示网络的 ID。
  • 演示:

没啥好演示的!

Docker Bridge 网络

Docker Bridge 网络采用内置的 bridge 驱动,bridge 驱动底层采用的是 Linux 内核中Linux bridge 技术。就网络而言,bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离。Docker Container 的 bridge 桥接模式可以参考下图:
在这里插入图片描述

创建的容器在没有使用 --network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络,即下面的 name 为 bridge 的网络。

root@iZ2vc00qqd4k31b8nozw2eZ:~# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
8ee1d035458f   bridge            bridge    local
a866c212ef00   docker_gwbridge   bridge    local
37669a4fefb9   host              host      local
vk0v2szbizgh   ingress           overlay   swarm
ffc1e938d56c   none              null      local

默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。

Docker在主机上创建一个名为docker0的虚拟网桥,这个网桥在容器内的网络和宿主机网络之间将作为接口的主节点,允许Docker去分配虚拟的子网给即将启动的容器。每当有一个Docker容器创建时,Docker0会为其接口分配一个IP地址(默认容器接口地址与Docker0处于同一子网下),用于主机与Docker容器的通信。同时,你也可以根据需要自定义桥接网络,创建具有特定配置的网络,以满足特定的应用需求。这些自定义的桥接网络也是基于docker0这个内核网桥进行构建的。

在这里插入图片描述


DNS 解析

Docker 自定义桥接网络是支持通过 Docker DNS 服务进行域名解析的,也就是说我们可以直接使用容器名进行通信,因为 DNS 服务可以解析容器名到 IP 地址的映射, 但是默认的 bridge 网络是不支持 DNS 的。

如下图:我们创建一个桥接网络 mybridge 然后使用 busybox 镜像创建并运行一个容器,使用 mybridge 桥接网络。然后我们复制当前会话!再使用 busybox 镜像创建并运行一个容器,也使用 mybridge 网络!

docker network create mybridge
docker run -ti --name mybusybox1 --network mybridge busybox:1.36.1
docker run -ti --name mybusybox2 --network mybridge busybox:1.36.1

可以看到在同一自定义桥接网络下,能够使用容器名直接 ping 通。
在这里插入图片描述

在这里插入图片描述

端口暴露和转发

端口暴露有 2 种方式,在启动容器的时候添加端口参数,一种 -P 暴露所有端口,一种是** -p **暴露指定端口

  • -P
    将指定的容器端口映射至主机所有地址的一个动态端口,“动态端口” 指随机端口,具体的映射结果可使用docker port 命令查看。
  • -p <hostPort>:<containerPort>
    将容器端口 <containerPort> 映射至指定的主机端口 <hostPort>

端口转发:连接 bridge 网络的容器只能与连接在当前网络中的容器进行通信。如果一个容器想要对外提供一些网络服务的话,需要进行端口转发才可以实现。端口转发将 Docker 容器的端口映射到宿主机的端口上,那么任何发送到宿主机该端口的流量,都会被转发到容器的端口中。如下图所示,两个容器内部均开放 80 端口,它们分别映射到宿主机的 8088 和 8089 端口, 即表示任何发送到 8088 端口的流量都会转发到 Container 1 容器的 80 端口, 发送到 8089 端口的流程都会转发到 Container 2 容器的 80 端口。
在这里插入图片描述
端口转发我们很早之前就使用过了,这里不再演示!

docker Host 网络

Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统, 但是如果基于 host 网络模式,容器将不会获得一个独立的 Network Namespace,而是和宿主机共用同一个 Network Namespace,容器将不会虚拟出自己的网卡,IP 等,而是直接使用宿主机的 IP 和端口。

在这里插入图片描述

  • 之前我们提到 bridge 网络在通信的时候需要进行端口转发以及 NAT 地址转换,这势必会消耗掉一些资源以及性能。
  • 那么直接使用 host 网络最大的好处就是性能好,如果容器对网络传输效率有较高的要求,建议选择 host 网络。当然也会牺牲一些东西,比如要考虑端口冲突问题,其他服务已经被占用的端口就不能再使用了。

使用很简单,指定 --network=host 就行,使用 ifconfig 可以看到网卡信息和宿主机是一毛一样的!!因为
if config 打出来的内容很多,这里就不再演示了!

docker run -ti --name mybusybox1 --network host busybox:1.36.1

docker Container 网络

Docker Containerother container 网络模式是 Docker 中一种较为特别的网络的模式。之所以称为 other container 模式,是因为这个模式下的 Docker Container,会使用其他容器的网络环境。之所以称为 “特别”,是因为这个模式下容器的网络隔离性会处于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。Docker Containerother container 网络模式可以参考下图:

在这里插入图片描述
Docker Containerother container 网络模式实现逻辑如下:

  1. 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
  2. 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用 other container 的 namespace。

如下图:我们使用桥接网络 mybridge 创建容器 mybusybox1 然后再创建一个容器 mybusybox2 使用 mybusybox1 的网络。

docker run -tid --name mybusybox1 --network mybridge busybox:1.36.1
docker run -ti --name mybusybox2 --network container:mybusybox1 busybox:1.36.1

在这里插入图片描述

可以看到这两个容器的 IP 地址,MAC 地址是一毛一样的
在这里插入图片描述


下面我们将 mybusybox1 这个容器停止!可以看到 mybsuybox2 就只剩本地环回的网络接口了!

docker stop mybusybox1

在这里插入图片描述


我们重启 mybusybox1mybusybox2 容器网络就能重新恢复啦!!!

使用场景

在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输效率较高。但是两个容器之间存在依赖,如果依赖容器重启了,会导致另外一个服务的网络不可用。

docker none 网络

docker none 网络:none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何
网卡。

docker run -tid --name mybusybox1 --network none busybox:1.36.1

使用场景

  • 针对一些对安全性要求比较高并且不需要联网的应用, 可以使用 none 网络, 比如生成随机密码, 避免生成密码被第三方获取。
  • 一些第三方的应用可能需要 docker 帮忙创建一个没有网络的容器, 网络由第三方自己来配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS hsp制作与引用

1. HarmonyOS hsp制作与引用 1.1 介绍 HSP动态共享包&#xff08;模块&#xff09;,应用内HSP指的是专门为某一应用开发的HSP&#xff0c;只能被该应用内部其他HAP/HSP使用&#xff0c;用于应用内部代码、资源的共享。应用内HSP跟随其宿主应用的APP包一起发布&#xff0c;与该…

「deepin生态共建小组」正式启动招募!三大生态共建项目,速来 !

基于社区开源精神&#xff0c;为提高大家对deepin生态建设的参与感&#xff0c;应用商店将正式开放众多软件给广大开源爱好者进行维护。参与小组工作可获得多项专属小组福利&#xff0c;工作项目分为玲珑格式迁移、wine应用打包、deb原生应用维护。 招募条件 1&#xff09;不限…

【C/C++笔试练习】OSI分层模型、源端口和目的端口、网段地址、SNMP、状态码、tcp报文、域名解析、HTTP协议、计算机网络、美国节日、分解因数

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;OSI分层模型&#xff08;2&#xff09;源端口和目的端口&#xff08;3&#xff09;网段地址&#xff08;4&#xff09;SNMP&#xff08;5&#xff09;状态码&#xff08;6&#xff09;tcp报文&#xff08;7&#xff09;域…

使用python setup.py报错:Upload failed (403) / Upload failed (400)

当前报错的环境 Python 3.9.19twine1.15.0 本地~/.pypirc已正确配置了用户名和密码&#xff0c;用在pypi.org注册&#xff1a; [pypi]username skylerhupassword ${password}执行 python setup.py sdist upload -r pypi 打包上传到仓库报错。 在不久之前同样的环境&#…

C语言扫雷游戏完整实现(上)

文章目录 前言一、新建好头文件和源文件二、实现游戏菜单选择功能三、定义游戏函数四、初始化棋盘五、 打印棋盘函数六、布置雷函数七、玩家排雷菜单八、标记功能的菜单九、标记功能菜单的实现总结 前言 C语言从新建文件到游戏菜单&#xff0c;游戏函数&#xff0c;初始化棋盘…

网工交换基础——生成树协议(01)

一、生成树的技术概述 1、技术背景 二层交换机网络的冗余性导致出现二层环路&#xff1a; 人为因素导致的二层环路问题&#xff1a; 二层环路带来的网络问题&#xff1a; 生成树协议的概念&#xff1a; STP(Spanning Tree Protocol)是生成树协议的英文缩写。该协议可应用于在网…

如何分析和优化慢sql语句

前言 sql查询速度比较慢容易成为性能瓶颈,这时我们可以优化我们的sql语句或数据库表 一般sql语句执行很慢的种类分为: 1.聚合查询 2.多表查询 3.表数据量过大查询 4.深度分页查询 这四种的前三种都可以通过优化sql语句来优化sql查询速度 正文 聚合查询 我们可以通过尝…

机器人视觉教学实训平台

一&#xff1a;功能概述 1.1、功能简介 机器人视觉教学实训平台基于睿尔曼机器人与海康机器视觉产品&#xff0c;面向机器人视觉系统应用而开发设计&#xff0c;产品涵盖机器人系统、工业视觉系统、自动化控制系统、计算机编程系统&#xff0c;可以在一台设备上进行多种与机器…

C++初阶学习第三弹——类与对象(上)——初始类与对象

前言&#xff1a; 在前面&#xff0c;我们已经初步学习了C的一些基本语法&#xff0c;比如内敛函数、函数重载、缺省参数、引用等等&#xff0c;接下来我们就将正式步入C的神圣殿堂&#xff0c;首先&#xff0c;先给你找个对象 目录 一、类与对象是什么&#xff1f; 二、类的各…

Git 工作原理

Git 工作原理 | CoderMast编程桅杆https://www.codermast.com/dev-tools/git/git-workspace-index-repo.html Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库 Git 一…

如何优雅的实现 iframe 多层级嵌套通讯

前言 在前端开发项目中&#xff0c;不可避免的总会和 iframe 进行打交道&#xff0c;我们通常会使用 postMessage 实现消息通讯。 如果存在下面情况&#xff1a; iframe 父子通讯iframe 同层级通讯iframe 嵌套层级通讯 当面对这种复杂的情况的时候&#xff0c;通讯不可避免…

Uptime Kuma 使用指南:一款简单易用的站点监控工具

我平时的工作会涉及到监控&#xff0c;而站点是一个很重要的监控项。项目上线后&#xff0c;我们通常会将站点监控配置到云平台上&#xff0c;以检测各站点的连通性。但随着项目不断增多&#xff0c;云平台上的配额就有点捉急了。针对这个情况&#xff0c;我们可以试试这个开源…

李沐49_样式迁移——自学笔记

样式迁移 将样式图片中的样式迁移到内容图片上&#xff0c;合成图片&#xff0c;例如将照片转换成漫画形式或者是油画风。 基于CNN的样式迁移 读取图片和样式风格 %matplotlib inline import torch import torchvision from torch import nn from d2l import torch as d2ld…

Facebook的魅力魔法:探访数字社交的奇妙世界

1. 社交媒体的演变与Facebook的角色 在数字化时代&#xff0c;社交媒体已经成为我们日常生活中不可或缺的一部分。而在众多的社交媒体平台中&#xff0c;Facebook 以其深厚的历史和广泛的影响力&#xff0c;成为了全球数亿用户沟通、分享和互动的主要场所。从其初创之时起&…

【学习AI-相关路程-自我总结-相关入门-自我学习-NVIDIA-Jetson】

【学习AI-相关路程-自我总结-相关入门-自我学习】 1、前言2、思考前进方向3、学习路线1、基础知识阶段2、初级准备阶段3、中级学习阶段4、高级实战阶段 4、自我的努力5、学习平台6、自己总结 1、前言 最近AI相关比较火的&#xff0c;对于程序员&#xff0c;或者走这行的人来说…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

群组分析方法

目录 1.什么是群组分析方法 2.基本原理 3.群组分析方法分类 3.1.层次方法 3.2.划分方法 3.3.密度基方法 ​​​​​​​3.4.模型基方法 4.群组评估 5.应用步骤 1.什么是群组分析方法 群组分析&#xff08;Cluster Analysis&#xff09;是数据分析中的一种重要方法&…

git lab 2.7版本修改密码命令

1.gitlab-rails console -e production Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux] GitLab: 14.9.0-jh (51fb4a823f6) EE GitLab Shell: 13.24.0 PostgreSQL: 12.7 2根据用户名修改密码 user User.find_by(username: ‘username’) # 替换’use…

ABAP 遗传算法求解

本文无文本解析&#xff0c;结尾处有简单装箱问题的示例&#xff0c;该算法收敛结果较慢&#xff0c;仅供ABAP爱好者参考&#xff0c;实践&#xff0c;实际应用建议使用线性规划。可直接复制后在系统中使用。 对象自定义逻辑版本-截图 对象自定义逻辑版本-对象描述 INIT I…

Navicat连接SQLSever报错:[08001] MicrosoftTCP Provider 远程主机强迫关闭了一个现有的连接

Navicat连接SQLSever报错&#xff1a;[08001] [Microsoft][SQL Server Native Client 10.0]TCP Provider: 远程主机强迫关闭了一个现有的连接 问题分析 旧版的MSSQL 如果不是最新版的&#xff0c;可以去这安装以下即可。 最新版的MSSQL 如果是安装最新版的MSSQL连接不上很正…