当前位置: 首页 > 编程日记 > 正文

Docker网络解决方案-Flannel部署记录

Docker跨主机容器间网络通信实现的工具有Pipework、Flannel、Weave、Open vSwitch(虚拟交换机)、Calico实现跨主机容器间的通信。其中Pipework、Weave、Flannel,三者的区别是:

Weave的思路

1
2
在每个宿主机上布置一个特殊的route的容器,不同宿主机的route容器连接起来。 route拦截所有普通容器的ip请求,并通过udp包发送到其他宿主机上的普通容器。
这样在跨机的多个容器端看到的就是同一个扁平网络。 weave解决了网络问题,不过部署依然是单机的。

flannel的思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
但在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使
这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。
  
Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得"同属一个内网""不重复的"IP地址,并让属于不同节
点上的容器能够直接通过内网IP通信。
  
Flannel实质上是一种"覆盖网络(overlay network)",即表示运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和
identifiers做映射来资源定位。也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。
  
原理是每个主机配置一个ip段和子网个数。例如,可以配置一个覆盖网络使用 10.100.0.0/16段,每个主机/24个子网。因此主机a可以接受10.100.5.0/24,主机B可以
接受10.100.18.0/24的包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel 使用udp来封装ip数据报,转发到远程主机。选择
UDP作为转发协议是因为他能穿透防火墙。例如,AWS Classic无法转发IPoIP or GRE 网络包,是因为它的安全组仅仅支持TCP/UDP/ICMP
  
flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。
etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。为了
提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。

默认的节点间数据通信方式是UDP转发.在Flannel的GitHub页面有如下的一张原理图:

对上图的简单解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1)数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
2)Flannel通过Etcd服务维护了一张节点间的路由表,在稍后的配置部分我们会介绍其中的内容。
3)源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,
然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器。
这样整个数据包的传递就完成了,这里需要解释三个问题:
1)UDP封装是怎么回事?
在UDP的数据内容部分其实是另一个ICMP(也就是ping命令)的数据包。原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务
还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在。
2)为什么每个节点上的Docker会使用不同的IP地址段?
这个事情看起来很诡异,但真相十分简单。其实只是单纯的因为Flannel通过Etcd分配了每个节点可用的IP地址段后,偷偷的修改了Docker的启动参数。
在运行了Flannel服务的节点上可以查看到Docker服务进程运行参数(ps aux|grep docker|grep "bip"),例如“--bip=182.48.25.1/24”这个参数,它限制了所在节
点容器获得的IP范围。这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。
3)为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡?
例如现在有一个数据包要从IP为172.17.18.2的容器发到IP为172.17.46.2的容器。根据数据发送节点的路由表,它只与172.17.0.0/16匹配这条记录匹配,因此数据从docker0
出来以后就被投递到了flannel0。同理在目标节点,由于投递的地址是一个容器,因此目的地址一定会落在docker0对于的172.17.46.0/24这个记录上,自然的被投递到了docker0网卡。

pipework的思路

pipework是一个单机的工具,组合了brctl等工具,可以认为pipework解决的是宿主机上的设置容器的虚拟网卡、网桥、ip等,可以配合其他网络使用。详情可参考:Docker网络详解及pipework源码解读与实践

如果容器数量不多,想简单的组一个大的3层网络,可以考虑weave
如果容器数量很多,而且你们的环境复杂,需要多个子网,可以考虑open vswitch或者fannel
weave的总体网络性能表现欠佳, flannel VXLAN 能满足要求,一般推荐用flannel

------------------------------------------------------------------------------------------------------------------------

Flannel环境部署记录

1)机器环境(centos7系统)

1
2
182.48.115.233     部署etcd,flannel,docker      主机名:node-1   主控端(通过etcd)
182.48.115.235     部署flannel,docker            主机名:node-2   被控端

2)node-1(182.48.115.233)机器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
设置主机名及绑定hosts
[root@node-1 ~]# hostnamectl --static set-hostname  node-1
[root@node-1 ~]# vim /etc/hosts
182.48.115.233    node-1
182.48.115.233    etcd
182.48.115.235    node-2
 
关闭防火墙,如果开启防火墙,则最好打开2379和4001端口
[root@node-1 ~]# systemctl disable firewalld.service
[root@node-1 ~]# systemctl stop firewalld.service
 
先安装docker环境
[root@node-1 ~]# yum install -y docker
 
安装etcd
k8s运行依赖etcd,需要先部署etcd,下面采用yum方式安装:
[root@node-1 ~]# yum install etcd -y
   
yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,编辑配置文件:
[root@node-1 ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
[root@node-1 ~]# cat /etc/etcd/etcd.conf
#[member]
ETCD_NAME=master                                            #节点名称
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                  #数据存放位置
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"             #监听客户端地址
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001"           #通知客户端地址
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
   
启动etcd并验证状态
[root@node-1 ~]# systemctl start etcd
   
[root@node-1 ~]# ps -ef|grep etcd
etcd     28145     1  1 14:38 ?        00:00:00 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001
root     28185 24819  0 14:38 pts/1    00:00:00 grep --color=auto etcd
[root@node-1 ~]# lsof -i:2379
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
etcd    28145 etcd    6u  IPv6 1283822      0t0  TCP *:2379 (LISTEN)
etcd    28145 etcd   18u  IPv6 1284133      0t0  TCP localhost:53203->localhost:2379 (ESTABLISHED)
........
   
[root@node-1 ~]# etcdctl set testdir/testkey0 0
0
[root@node-1 ~]# etcdctl get testdir/testkey0
0
[root@node-1 ~]# etcdctl -C http://etcd:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy
[root@node-1 ~]# etcdctl -C http://etcd:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy
 
安装覆盖网络Flannel
[root@node-1 ~]# yum install flannel
  
配置Flannel
[root@node-1 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
[root@node-1 ~]# vim /etc/sysconfig/flanneld
# Flanneld configuration options
  
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
  
# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"
  
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
 
配置etcd中关于flannel的key(这个只在安装了etcd的机器上操作)
Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置('/atomic.io/network/config'这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错):
[root@node-1 ~]# etcdctl mk /atomic.io/network/config '{ "Network": "182.48.0.0/16" }'
"Network""182.48.0.0/16" }
温馨提示:上面flannel设置的ip网段可以任意设定,随便设定一个网段都可以。容器的ip就是根据这个网段进行自动分配的,ip分配后,容器一般是可以对外联网的(网桥模式,只要宿主机能上网就可以)
 
启动Flannel
[root@node-1 ~]# systemctl enable flanneld.service
[root@node-1 ~]# systemctl start flanneld.service
[root@node-1 ~]# ps -ef|grep flannel
root      9305  9085  0 09:12 pts/2    00:00:00 grep --color=auto flannel
root     28876     1  0 May15 ?        00:00:07 /usr/bin/flanneld -etcd-endpoints=http://etcd:2379 -etcd-prefix=/atomic.io/network
启动Flannel后,一定要记得重启docker,这样Flannel配置分配的ip才能生效,即docker0虚拟网卡的ip会变成上面flannel设定的ip段
[root@node-1 ~]# systemctl restart docker

3)node-2(182.48.115.235)机器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
设置主机名及绑定hosts
[root@node-2 ~]# hostnamectl --static set-hostname  node-2
[root@node-2 ~]# vim /etc/hosts
182.48.115.233    node-1
182.48.115.233    etcd
182.48.115.235    node-2
 
关闭防火墙,如果开启防火墙,则最好打开2379和4001端口
[root@node-2 ~]# systemctl disable firewalld.service
[root@node-2 ~]# systemctl stop firewalld.service
 
先安装docker环境
[root@node-2 ~]# yum install -y docker
 
安装覆盖网络Flannel
[root@node-2 ~]# yum install flannel
  
配置Flannel
[root@node-2 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
[root@node-2 ~]# vim /etc/sysconfig/flanneld
# Flanneld configuration options
  
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
  
# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"
  
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
 
启动Flannel
[root@node-2 ~]# systemctl enable flanneld.service
[root@node-2 ~]# systemctl start flanneld.service
[root@node-2 ~]# ps -ef|grep flannel
root      3841  9649  0 09:11 pts/0    00:00:00 grep --color=auto flannel
root     28995     1  0 May15 ?        00:00:07 /usr/bin/flanneld -etcd-endpoints=http://etcd:2379 -etcd-prefix=/atomic.io/network
启动Flannel后,一定要记得重启docker,这样Flannel配置分配的ip才能生效,即docker0虚拟网卡的ip会变成上面flannel设定的ip段
[root@node-2 ~]# systemctl restart docker

4)创建容器,验证跨主机容器之间的网络联通性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
首先在node-1(182.48.115.233)上容器容器,如下,登陆容器发现已经按照上面flannel配置的分配了一个ip段(每个宿主机都会分配一个182.48.0.0/16的网段)
  
[root@node-1 ~]# docker run -ti -d --name=node-1.test docker.io/nginx /bin/bash
5e403bf93857fa28b42c9e2abaa5781be4e2bc118ba0c25cb6355b9793dd107e
[root@node-1 ~]# docker exec -ti node-1.test /bin/bash
root@5e403bf93857:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2953: eth0@if2954: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP group default
    link/ether 02:42:b6:30:19:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 182.48.25.4/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:b6ff:fe30:1904/64 scope link
       valid_lft forever preferred_lft forever
  
  
接着在node-2(182.48.115.233)上容器容器
[root@node-2 ~]# docker exec -ti node-2.test /bin/bash
root@052a6a2a4a19:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP group default
    link/ether 02:42:b6:30:43:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 182.48.67.3/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:b6ff:fe30:4303/64 scope link
       valid_lft forever preferred_lft forever
  
root@052a6a2a4a19:/# ping 182.48.25.4
PING 182.48.25.4 (182.48.25.4): 56 data bytes
64 bytes from 182.48.25.4: icmp_seq=0 ttl=60 time=2.463 ms
64 bytes from 182.48.25.4: icmp_seq=1 ttl=60 time=1.211 ms
.......
root@052a6a2a4a19:/# ping www.baidu.com
PING www.a.shifen.com (14.215.177.37): 56 data bytes
64 bytes from 14.215.177.37: icmp_seq=0 ttl=51 time=39.404 ms
64 bytes from 14.215.177.37: icmp_seq=1 ttl=51 time=39.437 ms
.......
发现,在两个宿主机的容器内,互相ping对方容器的ip,是可以ping通的!也可以直接连接外网(桥接模式)
  
查看两台宿主机的网卡信息,发现docker0虚拟网卡的ip(相当于容器的网关)也已经变成了flannel配置的ip段,并且多了flannel0的虚拟网卡信息
[root@node-1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1472
        inet 182.48.25.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:31ff:fe0f:cf0f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:31:0f:cf:0f  txqueuelen 0  (Ethernet)
        RX packets 48  bytes 2952 (2.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 2286 (2.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 182.48.115.233  netmask 255.255.255.224  broadcast 182.48.115.255
        inet6 fe80::5054:ff:fe34:782  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:34:07:82  txqueuelen 1000  (Ethernet)
        RX packets 10759798  bytes 2286314897 (2.1 GiB)
        RX errors 0  dropped 40  overruns 0  frame 0
        TX packets 21978639  bytes 1889026515 (1.7 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 182.48.25.0  netmask 255.255.0.0  destination 182.48.25.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 12  bytes 1008 (1008.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12  bytes 1008 (1008.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
 
通过下面命令,可以查看到本机的容器的ip所在的范围
[root@node-1 ~]# ps aux|grep docker|grep "bip"
root      2080  0.0  1.4 796864 28168 ?        Ssl  May15   0:18 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --insecure-registry registry:5000 --bip=182.48.25.1/24 --ip-masq=true --mtu=1472
 
这里面的“--bip=182.48.25.1/24”这个参数,它限制了所在节点容器获得的IP范围。
这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

转载于:https://www.cnblogs.com/Qing-840/p/9279492.html

相关文章:

【FFmpeg】警告:[hls] pkt.duration = 0, maybe the hls segment duration will not precise

1、问题描述 在使用ffmpeg编程生成m3u8文件时,报警告 [hls @ 0x7f26b4181840] pkt->duration = 0, maybe the hls segment duration will not precise2、原因分析 根据警告提示信息, AVPacket.duration的值设为了0,可能会导致hls在分段时时间不精确。 根据警告信息搜索…

反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

本文转载自Python编程时光&#xff08;ID:Python-Time&#xff09;冷知识系列&#xff0c;已经更新至第四篇。前三篇传送门在此&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人知的冷知识&#xff08;…

我学Delphi心得与笔记-------在控件上如何禁用Ctrl+V

项目中用到一个TJamShellList组件&#xff0c;此组件实现绑定查询图片&#xff0c;发现在使用CtrlC的同时也可以使用CtrlV结果将一个图处复制了多份&#xff0c;这样就不行了:( 于是&#xff0c;想了一个办法&#xff0c;禁用了CtrlV组合按键,代码如下: //在KeyDown事件中写如下…

15分钟带你入门sklearn与机器学习——分类算法篇

作者 | 何从庆本文转载自AI算法之心&#xff08;ID:AIHeartForYou&#xff09;【导读】众所周知&#xff0c;Scikit-learn&#xff08;以前称为scikits.learn&#xff09;是一个用于Python编程语言的免费软件机器学习库。它具有各种分类&#xff0c;回归和聚类算法&#xff0c;…

【FFmpeg】警告:[mpegts] H.264 bitstream error, startcode missing, size 0

1、问题描述 在使用FFmpeg编程,编码成h.264后,再封装成hls时,报警告 [mpegts] H.264 bitstream error, startcode missing, size 02、原因分析 根据警告提示信息可知:264位流错误,开始码丢失,大小为0。 根据警告信息搜索源码,在 FFmpeg-n4.2.2/libavformat/mpegtsenc…

svg: svg预定义的形状

SVG 有一些预定义的形状元素&#xff0c;可被开发者使用和操作&#xff1a;矩形 <rect>圆形 <circle>椭圆 <ellipse>线 <line>折线 <polyline>多边形 <polygon>路径 <path> 矩形 <rect x"20" y"20" width&qu…

[转]会自动消失的对话框API函数:MessageBoxTimeout

//以下两个函数由user32.dll导出&#xff0c;只是没有微软官方文档记载&#xff0c;大家在cpp中包含了以下部分&#xff0c;就可以调用MessageBoxTimeout了。 extern "C"{int WINAPI MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UI…

GitHub告急!黑客威胁程序员不交钱就删库

作者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;5月3日&#xff0c;当中国程序员正愉快地过五一节时&#xff0c;国外程序员突然发现自己GitHub上的代码不翼而飞&#xff01;自己的GitHub一秒变成悬疑片现场&#xff0c;不仅被黑客攻击删代码了&#…

【FFmpeg】ffmpeg中函数返回的错误码:AVERROR及AVERROR_*

1、AVERROR FFmpeg的错误码大部分使用的PIOSIX标准中错误码的负值。 AVERROR定义在文件 FFmpeg-n4.2.1/libavutil/error.h 中 #define AVERROR(e) (-(e)) // Returns a negative error code from a POSIX error code, to return from library functions. //FFmpeg库的错误…

entjs 键盘监听

1.应用在textfield中的回车方式&#xff1a; var siteName new Ext.form.Field({id: loadUrl,//表单元素最好使用Id&#xff0c;不然在IE浏览器中表单内容将变形fieldLabel: 密码,listeners : {specialkey : function(field, e) {if (e.getKey() Ext.EventObject.ENTER) {ale…

IIS 7.5 + FastCGI + PHP + Drupal 7 + Oracle

2019独角兽企业重金招聘Python工程师标准>>> 运行SQL命令行&#xff1a;conn system 删除drupal表空间:drop tablespace drupal INCLUDING CONTENTS; 创建drupal表空间: create tablespace drupal logging datafile d:\htdocs\db\drupal.dbf size 32m autoexten…

Yann LeCun推荐!自监督学习、全景FPN...内容平台的四大技术指南

编译整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;去年陷入“数据丑闻”后的 Facebook 日子并不好过&#xff0c;在这之后他们对外界强调的关键词大部分都是“隐私”和“安全”。即便如此&#xff0c;在刚刚过去的 Facebook F8 大会上&#xff0c;扎克伯…

【FFmpeg】打印日志函数分析(可以根据不同级别打印不同颜色的日志)

FFmpeg的打印日志实现在FFmpeg-n4.2.1/libavutil/log.c中。 一、设置log等级 1、设置日志级别 日志默认级别是AV_LOG_INFO static int av_log_level = AV_LOG_INFO;使用av_log_set_level将日志级别设置为调试级别(AV_LOG_DEBUG) av_log_set_level(AV_LOG_DEBUG);源码: …

创建MySQL数据库

创建数据库命令&#xff1a; CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_general_ci; 注意&#xff1a;COLLATE是校对集的意思&#xff0c;可以理解为&#xff0c;排序规则等。字符集选择utf8mb4 参考文档&#xff1a;永远不要在MySQL中使用utf8&…

Android 对象型数据库 db4o

你有木有烦恼过数据库的crud&#xff0c;有木有对sql很烦躁&#xff0c;Android虽然有封装好的ContentProvider&#xff0c;但是操作还是有点复杂了。不是很喜欢。 这两天花时间整了下DB4O&#xff0c;确实很不错&#xff0c;不用建表&#xff0c;不用写sql&#xff0c;只要写好…

【FFmpeg】设置H264参数

0、fffmpeg源码编译时,何时需要连接libx264库? ffmpeg其自带H.264解码功能,但是要实现H.264编码时就需要链接编码库libx264 ubuntu16.04安装libx264的库: sudo apt install libx264-148 sudo apt install libx264-dev一、设置x264参数的接口 // 获取编码器 AVCodec *co…

TIOBE 5 月编程语言排行榜:Python、C++竞争白热化,Objective-C已沦为小众语言

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;日前&#xff0c;TIOBE 编程语言社区最新发布了 2019 年 5 月排行榜。和 4 月榜单相比&#xff0c;5 月编程语言排行榜的 Top 10 位置并没有太大变化。但是在 C 和 Python 激烈的竞争局势下&#xff0c;随…

Caused by: org.xml.sax.SAXParseException: 不允许有匹配 [xX][mM][lL] 的处理指令目标。

版权声明&#xff1a;本文为 testcs_dn(微wx笑) 原创文章&#xff0c;非商用自由转载-保持署名-注明出处&#xff0c;谢谢。 https://blog.csdn.net/testcs_dn/article/details/81001749 Caused by: org.xml.sax.SAXParseException: 不允许有匹配 "[xX][mM][lL]" 的处…

Centos 64位使用 yum 会安装两个相同软件包的解决方法

Centos 64位使用 yum 会安装两个相同软件包的解决方法 - 后山一根葱Centos 64位使用 yum 会安装两个相同软件包的解决方法[Linux]post by 后山一根葱 / 2011-6-24 1:43 Friday系统环境&#xff1a;Centos 5.6 X86_64事项&#xff1a;关于yum install 安装两个相同软件包问题今天…

php的基础知识(四)

14、数组&#xff1a; 索引数组&#xff1a; 下标就是数字开始的。 $arr [a,b,c,1,2,3]; 关联数组&#xff1a; $arr [ a > b, c > d; e > f ]; 二维数组&#xff1a; 关联和索引混合的。 $arr [ a, b, c, d > [ e > h, f, g ], i, ]; 三维数组和多维数组。 …

【Ubuntu】解决问题:tcp :8080: bind: address already in use

1、问题描述 在ubuntu中启动一个web程序时报错 tcp :8080: bind: address already in use2、原因查找 查找占用8080的服务&#xff1a;sudo netstat -tanlp 注意&#xff1a;不加sudo权限时&#xff0c;不显示PID和程序名字 $ sudo netstat -tanlp 激活Internet连接 (服务器…

ICLR 2019最佳论文揭晓!NLP深度学习、神经网络压缩夺魁 | 技术头条

整理 | Linstansy责编 | Jane出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;【导语】ICLR 是深度学习领域的顶级会议&#xff0c;素有深度学习顶会 “无冕之王” 之称。今年的 ICLR 大会将于5月6日到5月9日在美国新奥尔良市举行&#xff0c;大会采用 Ope…

浅析flex中的焦点focus

一、无焦点的困扰——组件监听不到键盘事件原因&#xff1a;只有获得焦点的组件&#xff08;确切说是InteractiveObject&#xff09;才能监听到键盘事件的目标阶段&#xff1b;键盘事件&#xff08;flash.events.KeyboardEvent&#xff09;参与冒泡阶段&#xff0c;所以焦点组件…

专访NIPS主席:如何保证论⽂评审的公平性?| 人物志

记者 | 阿司匹林编辑 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;作为人工智能领域顶会 NIPS&#xff08;Conference and Workshop on Neural Information Processing Systems&#xff0c; 更名为 NeurIPS&#xff09;的主席&#xff0c;Terrence Sejnowsk…

【H.265】H.265(HEVC)编码过程和名词解释

一、H.265(HEVC)编码过程 和H.264一样,H.265编码由帧内预测、帧间预测、量化、线性变换等步骤。过程大致如下; 1、分块 一帧画面首先被切分成多个互不重叠的块状区域,称为编码单元(H.264称为宏块),分别传输给编码器。 2、帧内预测 图像序列的第一个画面(以及每一个可…

为什么大家都推荐我学Linux

2019独角兽企业重金招聘Python工程师标准>>> 最近朋友总是推荐我去学Linux&#xff0c;我本人虽说是计算机专业的&#xff0c;但是我感觉在上学的时候好像还真没学到东西&#xff0c;现在也是干着一份与计算机半毛钱关系都没有的工作。朋友总是说Linux多好&#xff…

认识HTML5的WebSocket 认识HTML5的WebSocket

2019独角兽企业重金招聘Python工程师标准>>> 在HTML5规范中&#xff0c;我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术&#xff0c;以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法&#xff0c;从客户端…

空字符串计数、让字典可排序...Python冷知识(五)

本文转载自Python编程时光&#xff08;ID: Python-Time&#xff09;冷知识系列&#xff0c;直至今日&#xff0c;已经更新至第五篇。前四篇给你准备好了&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人…

后端说:只是你不懂怎么用 headers!

事情是这样的&#xff0c;上一个项目我们的后端提供的接口&#xff0c;一次性返回了所有数据给我&#xff0c;分页功能是前端自己完成的。 那么这次来的新项目&#xff0c;换了个后端&#xff0c;写了另外的接口&#xff0c;我做项目的时候&#xff0c;还是用的之前的前端分页组…

【H2645】H.264的宏块和H.265的编码树单元总结

一、H.264宏块 1、什么是宏块? 先看下面两张图,就能大体知道宏块指的是哪了。 将连续几帧图像分为一组(GOP)在H264中称为一个序列(sequence); 将每帧图像(Frame)划拉几道分成片(slice); 将每片(slice)按照16x16的大小横着竖着划拉成宏块(Maroblock); 将宏块(Maroblock…