【Docker笔记05】【网络模式】

一、前言

本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件,部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。

本系列仅为自身学习笔记记录使用,记录存在偏差,推荐阅读原视频内容或本文参考笔记。


二、简单介绍

docker安装并启动服务后,会在宿主机中添加一个虚拟网卡。

在Docker服务启动前,使用 ifconfig 或 ip addr 查看网卡信息:

  • ens33或eth0:本机网卡
  • lo:本机回环网络网卡
  • 可能有virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的virbr0网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用 yum remove libvirt-libs.x86_64)

使用 systemctl start docker启动Docker服务后,会多出一个 docker0 网卡。

作用:

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

Docker容器的网络隔离,是通过Linux内核特性 namespace和 cgroup 实现的。


Docker 启动后会产生一个 docker0 的虚拟网桥,如下图:
在这里插入图片描述

四、基本命令

  1. 查看docker 网络模式

    # 查看 docker 网络
    [root@localhost jdk]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    434c8b2478c5   bridge    bridge    local
    9a997978179d   host      host      local
    505d72cea94b   none      null      local
    # 查看 network 命令帮助
    [root@localhost jdk]# docker network  --help
    
    Usage:  docker network COMMAND
    
    Manage networks
    
    Commands:
      connect     Connect a container to a network
      create      Create a network
      disconnect  Disconnect a container from a network
      inspect     Display detailed information on one or more networks
      ls          List networks
      prune       Remove all unused networks
      rm          Remove one or more networks
    
    Run 'docker network COMMAND --help' for more information on a command.
    # 手动创建一个网络,可以看到默认创建网络使用的桥接模式
    [root@localhost jdk]# docker network create a_network
    0321393ceb8b7ffe1de1bb658ec683e7dba0f8403a0c474ee72c2bd896cf7438
    [root@localhost jdk]# docker network ls
    NETWORK ID     NAME        DRIVER    SCOPE
    0321393ceb8b   a_network   bridge    local
    434c8b2478c5   bridge      bridge    local
    9a997978179d   host        host      local
    505d72cea94b   none        null      local
    # 删除网络
    [root@localhost jdk]# docker network rm a_network 
    a_network
    [root@localhost jdk]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    434c8b2478c5   bridge    bridge    local
    9a997978179d   host      host      local
    505d72cea94b   none      null      local
    
    # 查看网络源数据
    [root@localhost jdk]# docker network inspect bridge 
    [
        {
            "Name": "bridge",
            "Id": "434c8b2478c521bcbd14e1bdbd9b9e0d6c393c0fc9039b878891ef130f813cb2",
            "Created": "2024-03-28T17:20:21.900870152+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.17.0.0/16",
                        "Gateway": "172.17.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {},
            "Options": {
                "com.docker.network.bridge.default_bridge": "true",
                "com.docker.network.bridge.enable_icc": "true",
                "com.docker.network.bridge.enable_ip_masquerade": "true",
                "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
                "com.docker.network.bridge.name": "docker0",
                "com.docker.network.driver.mtu": "1500"
            },
            "Labels": {}
        }
    ]
    
    
  2. Docker network 作用 :

    1. 容器间的互联和通信以及端口映射
    2. 容器IP变动时候可以通过服务名直接网络通信而不受影响。

五、网络分类

1. 简介

网络模式简介使用方式
bridge为每个容器分配、设置IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式使用 --network bridge 指定,默认使用 docker0
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的 IP 和端口使用 --network host 指定
none容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接、IP等使用 --network none 指定
container新创建的容器不会创建自己Id网络和配置自己的IP,而是和一个指定的容器共享IP,端口范围等使用 --network container:[容器Name 或 容器Id] 指定

2. 网络模式的作用

Docker 容器内的IP会改变,当启动多个 Docker 容器后,如果其中一个容器关闭或删除后,新启动的容器可能会占用原容器的IP。

如下:新建u1、u2 两个容器后,将u2 容器移除后新建u3 容器,u3 容器会占用 u2 容器原先的ip

# 启动两个容器 u1 和 u2
[root@192 ~]# docker run --name u1 -it ubuntu /bin/bash
root@a40f76b02f32:/# [root@192 ~]# 
[root@192 ~]# docker run --name u2 -it ubuntu /bin/bash
root@28f1845f8908:/# [root@192 ~]# 
[root@192 ~]# 
[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
28f1845f8908   ubuntu    "/bin/bash"   4 seconds ago    Up 3 seconds              u2
a40f76b02f32   ubuntu    "/bin/bash"   11 seconds ago   Up 10 seconds             u1
[root@192 ~]# 
# 查看 u2 容器的 ip 信息 : 172.17.0.3
[root@192 ~]# docker inspect 28f1845f8908 | tail -n 20
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:11:00:03",
                    "NetworkID": "dd2946f2d5feb529b371f4106d068184117ae41117470754225e28e8403ed46b",
                    "EndpointID": "fdd0c6a54e4af8f5636cafe71d07baa870579503e83af1ecec6595e210f6240d",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null,
                    "DNSNames": null
                }
            }
        }
    }
]
# 查看 u1 容器的 ip 信息 : 172.17.0.2
[root@192 ~]# docker inspect a40f76b02f32 | tail -n 20
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:11:00:02",
                    "NetworkID": "dd2946f2d5feb529b371f4106d068184117ae41117470754225e28e8403ed46b",
                    "EndpointID": "c01654faf05f3bc8e509ce057f6671a439d6615499f4cfdea74808d50f89948f",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null,
                    "DNSNames": null
                }
            }
        }
    }
]
# 移除 u2 容器
[root@192 ~]# docker rm -f u2
u2
# 新建 u3 容器
[root@192 ~]# docker run --name u3 -it ubuntu /bin/bash
root@cdb7a6902
[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
cdb7a69023b0   ubuntu    "/bin/bash"   21 seconds ago   Up 19 seconds             u3
a40f76b02f32   ubuntu    "/bin/bash"   3 minutes ago    Up 3 minutes              u1
# u3 容器ip已经占用了 u2 容器ip
[root@192 ~]# docker inspect cdb7a69023b0 | tail -n 20
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:11:00:03",
                    "NetworkID": "dd2946f2d5feb529b371f4106d068184117ae41117470754225e28e8403ed46b",
                    "EndpointID": "f8374d1ad6e676d80592d0333b53b53c3ec2bdb17176156ff4a38d1798598709",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null,
                    "DNSNames": null
                }
            }
        }
    }
]

3. 详细介绍

3.1 bridge 模式

  1. Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一个宿主机内的容器接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
  2. docker run的时候,没有指定–network的话,默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig就苦役看到docker0和自己create的network
  3. 网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配:
    1. 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫 veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做 veth pair)。
    2. 每个容器实例内部也有一块网卡,容器内的网卡接口叫做eth0。
    3. docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

在这里插入图片描述


如下,可以得知,宿主机的 eth0@if21veth1138365@if20 是一一对应关系, 即上面途中中 eth0 和 veth 的映射关系:

宿主机 通过 ip addr | tail -n 4 命令可以看到 21: veth1138365@if20 内容, 如下

[root@192 ~]# ip addr | tail -n 4
21: veth1138365@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether da:b9:2f:97:a3:b0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::d8b9:2fff:fe97:a3b0/64 scope link 
       valid_lft forever preferred_lft forever

容器中通过 ip addr 命令可以看到 20: eth0@if21: 的内容,

[root@192 ~]# docker run -it tomcat:7 /bin/bash
root@47ea54bf9136:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

3.2 host 模式

  1. 直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。
  2. 容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network space。
  3. 容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。

在这里插入图片描述


如下:

# 使用 host 模式启用 tomcat,可以直接通过宿主机IP + 8080 端口访问 tomcat
[root@192 ~]# docker run -d --network host --name tom_host tomcat:7 

需要注意:

  1. 通过 docker inspect tom_host 命令查看通过 host 模式启动的容器,可以看到其网络模式为 host,并且因为容器使用的主机的网络IP(可以直接通过宿主机IP + 8080 端口访问 tomcat) ,所以 Gateway、IPAddress 都为空

    在这里插入图片描述

  2. 如果在 docker run 命令中同时使用了 --network host 和 -p端口映射,则会出现如下警告:

    [root@192 ~]# docker run -d -p 8083:8080 --network host --name tom_host1 tomcat:7 
    WARNING: Published ports are discarded when using host network mode
    1f16087c5322ed824f4ae9068788064dec16fe652f2429e3deb811b659735b3a
    

    因为此时已经使用了host模式,本身就是直接使用的宿主机的IP和端口,此时的-p端口映射就没有了意义,也不会生效,端口号还是会以主机端口号为主。

    正确做法是:不再进行-p端口映射,或者改用bridge模式

3.3 none 模式

none 模式会禁用网络功能。在none模式下,并不为docker容器进行任何网络配置。进入容器内,使用 ip addr查看网卡信息,只能看到 lo(本地回环网络127.0.0.1网卡)。

如下:

[root@192 ~]# docker run -d --network none --name tom_none tomcat:7 
e41b460b6c11a032f97e4ae8172a434a8832dda98673beb366112c400862a3d1
[root@192 ~]# 
[root@192 ~]# 
[root@192 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND             CREATED          STATUS          PORTS     NAMES
e41b460b6c11   tomcat:7   "catalina.sh run"   3 seconds ago    Up 2 seconds              tom_none
19929b93c3c1   tomcat:7   "catalina.sh run"   10 minutes ago   Up 10 minutes             tom_host
[root@192 ~]# 
[root@192 ~]# 
[root@192 ~]# 
[root@192 ~]# docker exec -it tom_none /bin/bash
root@e41b460b6c11:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

3.4 container 模式

新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。

新创建的容器不会创建自己的网卡、IP,而是和一个指定的容器共享IP、端口范围。两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。
在这里插入图片描述

[root@192 ~]# docker run -it --name alpine_bridge alpine /bin/sh

# 指定和 alpine_bridge 容器共享网络
[root@192 ~]# docker run -it --network container:alpine_bridge --name alpine_container alpine /bin/sh
/ # [root@192 ~]# 
[root@192 ~]# 
[root@192 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND             CREATED          STATUS          PORTS      NAMES
5c43081ef94c   alpine     "/bin/sh"           3 seconds ago    Up 3 seconds               alpine_container
4f6f1d00e4ca   alpine     "/bin/sh"           35 seconds ago   Up 34 seconds              alpine_bridge

此时使用 ip addr查看两台容器的网络,会发现两台容器的eth0网卡内的IP等信息完全相同。

如果关掉了alpine_bridge 容器,因为alpine_container的网络使用的alpine_bridge 共享网络,所以关掉 alpine_bridge 后,alpine_container的eth0网卡也随之消失了。


需要注意:

  1. 如下:因为 container 模式下两个容器公用 IP 端口信息,因此启用第二个容器时因为 8080 端口被占用导致启动失败。
    [root@192 ~]# docker run -d  --name tom_bridge tomcat:7 
    67e7f5ae6f9ed22f535b975f096dc3d1553c5a6ec1c2e1f5dd8562f83361a987
    [root@192 ~]# 
    [root@192 ~]# docker ps
    CONTAINER ID   IMAGE      COMMAND             CREATED          STATUS          PORTS      NAMES
    67e7f5ae6f9e   tomcat:7   "catalina.sh run"   3 seconds ago    Up 3 seconds    8080/tcp   tom_bridge
    e41b460b6c11   tomcat:7   "catalina.sh run"   3 minutes ago    Up 3 minutes               tom_none
    19929b93c3c1   tomcat:7   "catalina.sh run"   13 minutes ago   Up 13 minutes              tom_host
    [root@192 ~]# docker run -d -p 8081:8080 --network container:tom_bridge --name tom_container tomcat:7 
    docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
    See 'docker run --help'.
    

3.5 自定义网络模式

# 创建两个容器
[root@192 ~]# docker run -d --name tom1 tomcat:7 
b1bfe74b3fb47974159ce1c5be9e98a87dfca7467bb0c585b566ae36417ddb64
[root@192 ~]# docker run -d --name tom2 tomcat:7 
3c7bd1ccfbc636a48127af15b759eda4858057e9c6f73346d59a34d3b0fb0dbd
[root@192 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND             CREATED          STATUS          PORTS      NAMES
3c7bd1ccfbc6   tomcat:7   "catalina.sh run"   54 seconds ago   Up 53 seconds   8080/tcp   tom2
b1bfe74b3fb4   tomcat:7   "catalina.sh run"   58 seconds ago   Up 57 seconds   8080/tcp   tom1
[root@192 ~]# docker exec -it  tom1 /bin/bash
# 通过 容器名无法互相 ping 通,如果通过固定IP则容器的固定IP会变化
root@b1bfe74b3fb4:/usr/local/tomcat# ping tom1
ping: tom1: Name or service not known

# 1. 自定义网络模式,默认使用的是桥接模式
[root@192 ~]# docker network create kingfish_network
0e49e8d8480d630ef3d97caf5eec330c9a11a249211f53b49609eeecc2a7ad81
[root@192 ~]# docker network ls
NETWORK ID     NAME               DRIVER    SCOPE
dd2946f2d5fe   bridge             bridge    local
9a997978179d   host               host      local
0e49e8d8480d   kingfish_network   bridge    local
505d72cea94b   none               null      local

# 使用自定义的网络模式创建容器
[root@192 ~]# docker run -d --network kingfish_network --name tom_1 tomcat:7 
5492cafbe433e4e47fc0f95a182954eb6a0213dd9838f16df054ff6009e54937
[root@192 ~]# docker run -d --network kingfish_network --name tom_2 tomcat:7 
da0cd3f3641aaca58adb2c464f4f1d43e059aec7dcd151fe03aae901f95ab1d5
# 进入其中一个容器
[root@192 ~]# docker exec -it tom_1 /bin/bash
# 可以通过容器名称 PING 通服务
root@5492cafbe433:/usr/local/tomcat# ping tom_2
PING tom_2 (172.18.0.3) 56(84) bytes of data.
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=3 ttl=64 time=0.142 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=4 ttl=64 time=0.213 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=5 ttl=64 time=0.061 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=6 ttl=64 time=0.059 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=7 ttl=64 time=0.063 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=8 ttl=64 time=0.178 ms
64 bytes from tom_2.kingfish_network (172.18.0.3): icmp_seq=9 ttl=64 time=0.637 ms

需要注意:

  1. docker中还有一个 --link 进行容器网络互联,但是已经被标记为过时的,可能会在将来的版本中移除这个功能,推荐使用自定义网络替换link。Link 命令的使用如下:
    # 启动一台mysql容器
    # --name 为容器指定一个别名
    docker run --name mysql-matomo -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.28
    
    # 启动另一个容器,通过--link连接到mysql容器
    # --link 容器名称:本容器连接对方时的别名
    docker run -d -p 8888:80 --link mysql-matomo:db --name matomo matomo:4.9.0
    
    # 此时,在matomo容器中,便可以通过 db 这个hostname连接到mysql-matomo容器,而无须再通过ip
    # 连接地址:db:3306
    

六、参考内容

B 站 尚硅谷 Docker 视频
https://www.yuque.com/tmfl/cloud/dketq0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0.5米多光谱卫星影像在农业中进行地物非粮化、非农化监测

一、引言 随着科技的发展&#xff0c;卫星遥感技术已经成为了农业领域中重要的数据来源。其中&#xff0c;多光谱卫星影像以其独特的优势&#xff0c;在农业应用中发挥着越来越重要的作用。本文将重点探讨0.5米加2米多光谱卫星影像在农业中的应用。 二、多光谱卫星影像概述 多…

金融汽车科技LLM

汇丰银行 众安保险 1. AIGC重塑保险价值链 小额高频 2.构建智能应用的技术方案演进 增加微服务 长记忆&#xff1a;向量库短记忆&#xff1a;对话历史&#xff0c;思考路径&#xff0c;执行历史 中台架构设计 蔚来汽车在大模型的应用实践 公司介绍 应用架构 应用实践 4.大…

【洛谷 P8700】[蓝桥杯 2019 国 B] 解谜游戏 题解(字符串+映射+周期性)

[蓝桥杯 2019 国 B] 解谜游戏 题目背景 题目描述 小明正在玩一款解谜游戏。谜题由 24 24 24 根塑料棒组成&#xff0c;其中黄色塑料棒 4 4 4 根&#xff0c;红色 8 8 8 根&#xff0c;绿色 12 12 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排…

学习率对精度和损失的影响研究

1 问题 在学习深度学习的过程中&#xff0c;欲探究优化器的学习率对精度和损失的影响。 2 方法 测试不同学习率下网络的性能。 控制其余变量&#xff1a; Beach_size256optimizer torch.optim.SGD网络为三层全连接网络&#xff08;784->512->10&#xff09;训练周期100 …

MySQL MHA高可用数据库

文章目录 MySQL MHA高可用数据库搭建MySQL MHA模拟故障故障修复&#xff1a; MySQL MHA高可用数据库 MHA&#xff08;MySQL High Availability&#xff09;是一个开源的高可用解决方案&#xff0c;用于实现MySQL主从复制集群的故障自动切换。MHA的主要目的是确保MySQL数据库集…

规划控制如何兼顾安全与舒适性

规划控制如何兼顾安全与舒适性 附赠自动驾驶学习资料和量产经验&#xff1a;链接 **导读&#xff1a;**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的&#xff0c;但是这中间可能就忽视了舒适性。 因此&#xff0c;今天我想给大家分享的是&#xff0c;自动驾驶研发如何…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

@JsonProperty和@JSONField注解的区别

JSON&#xff08;JavaScript Object Notation&#xff09; json是一种常见的数据交换的轻量级数据格式。HTTP协议传输数据可以有多种数据格式&#xff0c;比如下面几种常见数据传输格式&#xff0c;除此之外还有其他的数据交换格式。 数据传输类型编码类型示例表单格式applic…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

金三银四面试题(九):JVM常见面试题(3)

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大&#xff0c;多用于面试中JVM部分的热身运动&#xff0c;开胃菜&#xff0c;但是大家已经要认真准备。 你能保证GC 执行吗&#xff1f; 不能&#xff0c;虽然你可以调用System.gc() 或者Runtime.gc()&#xff0c…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括&#xff1a; Apache spark用于大数据处理&#xff0c;数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

nginx的缓存和gzip

nginx的缓存 缓存的基本思想是利用客户端访问的时间局限性&#xff0c;将客户端访问过的内容做一个副本&#xff0c;在一定时间内存放到本地&#xff0c;当改数据下次被访问时&#xff0c;不必连接到后端服务器反复去查询数据&#xff0c;而是由本地保存的副本响应数据。 保存…

node:ReferenceError: XMLHttpRequest is not defined

node&#xff1a;ReferenceError: XMLHttpRequest is not defined 1 前言 node执行如下代码&#xff1a; new XMLHttpRequest()报错提示&#xff1a;ReferenceError: XMLHttpRequest is not defined 2 解决 2.1 可能原因是没有安装xmlhttprequest npm install xmlhttpreq…

空格隔开的多个数据,可以用多个scanf()读取,也可以用一个scanf()读取

概要&#xff1a; 如果输入数据有多个&#xff0c;且用空格隔开 读取的时候&#xff0c;可以用多个scanf()读取 也可以用一个scanf()读取&#xff0c;在这个scanf()内部使用空格即可 一、用多个scanf()读取 1、代码 #include<stdio.h> int main() {int line[3];int…

window配置RUST开发环境详解

1.先安装VS2022: 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux (microsoft.com) 2.下载Rustup-init.exe Other Installation Methods - Rust Forge 3.运行rustup-init.exe开始安装rust开发环境: 安装成功出现下图所示 %USERPROFILE%\.cargo\bin 添加cargo安装路…

内网穿透时报错【Bad Request This combination of host and port requires TLS.】的原因

目录 前言&#xff1a;介绍一下内网穿透 1.内网直接https访问&#xff08;可以正常访问&#xff09; 程序配置的证书 2.内网穿透后,通过外网访问 3.原因 4.内网非https的Web应用&#xff0c;使用https后&#xff0c;也变成了https访问 5.题外话 感觉自己的web应用配置了…

155 Linux C++ 通讯架构实战10,工具telent 和 wireshark的使用

telnet工具使用介绍 windows 上开启telnet linux 上开始telnet 使用telnet //是一款命令行方式运行的客户端TCP通讯工具&#xff0c;可以连接到服务器端&#xff0c;往服务器端发送数据&#xff0c;也可以接收从服务器端发送过来的信息&#xff1b; //类似nginx5_1_1_clie…

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…

为 Linux 中的 Docker 配置阿里云和网易云国内镜像加速下载中心

由于默认情况下&#xff0c;Docker 的镜像下载中心默认为国外的镜像中心&#xff0c;使用该镜像中心拉去镜像会十分缓慢&#xff0c;所以我们需要配置国内的 Docker 镜像下载中心&#xff0c;加速 Docker 镜像的拉取。Docker 的国内镜像下载中心常用的有&#xff1a;阿里云、网…

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中&#xff0c;文件上传是一项常见的功能需求&#xff0c;用于允许用户向服务器提交文件&#xff0c;如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言&#xff0c;提供了方便且高效的方式来处理文件上传操作。其中&#xff0c;r.F…