Java基础

1.Finally执行流程

总结:finally在try和exception之后执行,尽量不要在finally里面进行return操作,finally 总是执行,除非程序或者线程被中断

2.强引用/软引用/弱引用/幻象引用(虚引用)

总结:

强引用:最常用

软引用:内存空间不足才会被回收,可用来实现很多内存敏感点的缓存场景

弱引用:比软引用的生命周期更短,不管内存是否有空现,都会立刻回收它

幻象引用(虚引用):提供了一种确保对象被finalize以后,做某些事情的机制,有人利用幻象引用监控对象的创建和销毁

3.自动拆箱和自动装箱

4.LruCache和DiskLruCache

5.Volatile关键字

(1)保证此变量对所有线程的可见性。当一个线程修改了这个变量的值,volatile保证了新值能立即同步到主内存以及每次使用前从主内存刷新(跳过CPU cache这一步)

(2)禁止指令重排序(CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)优化

6.transient关键字

总结:

(1)使用方法:

​ 类中的敏感数据变量标记为transient,不做序列化

(2)使用小结:

①一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

②transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。

③被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

transient:被标记为transient的变量不会被序列化

(3)被transient关键字修饰的变量真的不能被序列化吗?

若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关

7.ReentrantReadWriteLock

读锁(ReentrantReadWriteLock.WriteLock):共享锁,前提条件:

(1)没有其他线程的写锁

(2)没有写请求或者有写请求,但调用线程和持有锁线程是同一个

写锁(ReentrantReadWriteLock.ReadLock):排他锁

(1)没有其他线程的读锁,没有其他线程的写锁

读-写互斥、写-读互斥、写写互斥、读读共享

三个重要特性:

(1)公平选择性:支持非公平的(默认)和公平的锁获取方式,吞吐量还是非公平优于公平

(2)重进入:读锁和写锁都支持线程重进入

(3)锁降级:遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成为读锁

公平锁

8.ReentrantLock

总结:

ReentrantLock是基于AQS实现的,AQS的基础又是CAS

9.synchronized,wait,notify

10.公平锁和非公平锁

11.Unsafe和CAS

12.ThreadLocal

13.String/StringBuffer/StringBuilder的区别

总结:

StringBuffer线程安全,通过把各种修改数据的方法都加上synchronized关键字实现的。

StringBuilder非线程安全

String内部不可修改

StringBuffer和StringBuilder底层都是利用可修改的数组,二者都继承了AbstractStringBuidler。构建时初始字符串长度为16,如果确定拼接会发生非常多次而且大概可预计,那么可以指定合适的大小,避免多次扩容的开销。

14.hashCode和equals

总结:

hashCode()的作用是获取哈希码,实际上是返回一个int整数

equals()的作用是判断两个对象是否相等,如果对象重写了equals方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,等价于’’==’’

如果类使用在散列表(HashSet, HashTable, HashMap)的集合对象中,要判断两个对象是否相同,除了要覆盖equals之外,也要覆盖hashCode,否则equals()无效

复写hashCode的诀窍

1
2
3
4
5
6
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
return result;
}

15.sleep和wait的区别

(1)在等待时wait会释放锁,而sleep一直持有锁。wait通常被用于线程间交互,sleep通常用于暂停执行。

(2)sleep是Thread类的静态方法,wait是object方法

(3)wait/notify/notifyAll只能在同步c控制方法或者同步控制块里使用,而sleep可以在任何地方使用

(4)sleep必须捕获,而wait/notify/notifyAll不需要捕获异常

16.CyclicBarriar和CountdownLatch

CountdownLatch:一个线程(或者多个),等待另外N个线程完成某个事情之后才执行。内部使用AQS(AbstractQueuedSynchronizer)和CAS实现,AQS其中一个作用就是维护线程状态和获取释放锁。

CyclicBarriar:N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。基于ReentrantLock重入锁实现

17.IO/NIO/AIO

18.一个hello,world程序创建了几个线程

jdk1.8:5个线程

main:主线程

Reference Handler:处理引用对象本身的垃圾回收

Finalizer:处理用户的Finalizer方法

Signal Dispatcher:外部jvm命令的转发器

Attach Listener:jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程

19.注解

注解库:javapoet和asm

Docker常用命令

查看docker版本

1
2
3
4
docker  --version
docker-compose --version
docker-machine --version
docker info

docker常用命令

1
2
3
4
docker search <image>
docker pull imagename
docker images
docker ps -a

运行nginx服务器

1
docker run -d -p 80:80 --name webserver nginx

停止服务器

1
docker stop webserver

删除服务器

1
docker rm webserver

docker命令

Docker简介

依赖于linux的cgroups和namespace

1
docker run -i -t ubuntu /bin/bash

Docker的基本组成

Docker Client/Docker Daemon

C/S架构

本地/远程

Docker Image

容器的基石(源代码)

层叠的只读文件系统

联合加载(union mount)

— 可写层

— add Apache

— add emacs

— rootfs(Ubuntu) <————基础镜像

— bootfs

Docker Container

通过镜像启动

启动和执行阶段

写时复用(copy on write)

Docker Registry

公有和私有

从DockerHub上下载

常用命令

1
2
3
4
5
6
7
8
9
10
11
docker version
docker search imagename
docker pull imagename
docker run imagename echo 'hello world'
docker ps
docker run learn/tutorial apt-get install -y ping
docker commit containerid learn/ping 修改镜像
docker run learn/ping ping www.baidu.com
docker inspect containerid 查看容器信息
docker images
docker push learn/ping 保存到dockerhub中

Docker容器相关技术简介

Namespaces命令空间

系统资源的隔离(包括进程、网络、文件系统)

(1)PID(Process ID) 进程隔离

(2)NET(Network) 管理网络隔离

(3)IPC 管理跨进程通信的访问

(4)MNT(Mount) 管理挂载点

(5)UTS(Unix Timesharing System) 隔离内核和版本标识

Cgroups 控制组

用来分配资源

来源于Google

(1)资源限制

(2)优先级限制

(3)资源计量

(4)资源控制

Docker容器的能力

(1)文件系统的隔离:每个容器都有自己的root文件系统

(2)进程隔离:每个容器都运行在自己的进程环境中

(3)网络隔离:容器间的虚拟网络接口和IP地址都是分开的

(4)资源隔离和分组:使用cgroup将cpu和内存之类的资源独立分配给每个Docker容器

Docker在Ubuntu中的安装

检查内核版本

1
uname -a

检查Device Mapper

1
ls -l /sys/class/misc/device-mapper

(1)ubuntu维护的docker版本安装

1
2
sudo apt-get install -y docker.io
source /etc/bash_completion.d/docker.io

(2)安装Docker维护的版本

1
2
sudo apt-get install -y curl
curl -sSL https://get.docker.com/ubuntu/ | sudo sh

使用非root用户

1
2
3
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart

Docker的客户端和守护进程

Remote API

Restful风格API

STDIN、STDOUT、STDERROR

Docker官方的Remote API Reference:

https://docs.docker.com/reference/api/docker_remote_api/

连接方式(Socket连接)

1
2
3
unix:///var/run/docker.sock(默认的连接方式)
tcp://host:port
fd://socketfd
1
ps -ef | grep docker

Remote API example:

1
nc -U /var/run/docker/docker.sock

Docker的远程访问

修改docker配置(vim /etc/default/docker)

1
sudo service docker restart

客户端的远程访问

1
2
curl http://10.211.55.5:2375/info
docker -H tcp://10.211.55.5:2375 info

Docker_HOST环境变量

Docker守护进程的配置和操作

1
2
3
4
ps -ef | grep docker
sudo service docker stop
sudo service docker start
sudo service docker restart

以守护的形式运行docker

docker -d [OPTIONS]

运行相关:

-D,–debug=false

-e,–exec-driver=”native”

-g,–graph=”/var/lib/docker”

–icc=true

-l,–log-level=”info”

–label=[]

-p,–pidfile=”/var/run/docker.pid”

Docker服务器连接相关:

-G,–group=”docker”

-H,–host=[]

–tls=false

–tlscacert=”/home/sven/.docker/ca.pem”

–tlscert=”/home/sven/.docker/cert.pem”

–tlskey=”/home/sven/.docker/key.pem”

–tlsverify=false

RemoteAPI相关:

–api-enable-cors=false

存储相关:

-s,–storage-driver=””

–selinux-enabled=false

–storage-opt=[]

Registry相关:

–insecure-registry=[]

–registry-mirror=[]

网络设置相关:

-b,–bridge=””

–bip=””

–fixed-cidr=””

–fixed-cidr-v6=””

–dns=[]

–dns-search=[]

–ip=0.0.0.0

–ip-forward=true

–ip-masq=true

–iptables=true

–ipv6=false

–mtu=0

Docker Command Line Reference:

https://docs.docker.com/reference/commandline/cli

启动配置文件

/etc/default/docker

DOCKER_OPTS =

容器的基本操作

启动容器:

1
docker run image [command] [arg]

启动交互式容器:

1
docker run -i -t image /bin/bash

-i –interactive=true|false 默认是false

-t –tty=true|false 默认是false

查看容器

-a 列出所有的容器 -l列出最新创建的容器

1
docker ps [-a] [-l] 

查看运行的容器

1
docker ps  

查看所有的容器

1
docker ps -a 

查看最近运行的容器

1
2
docker ps -l 
docker insepct containerId or containerName

Docker自定义容器名

1
docker run --name=test -i -t ubuntu /bin/bash

重新启动已经停止的容器:

1
docker start [-i] 容器名

删除已经停止的容器

1
docker rm containerId

Docker守护式容器

1
docker run -i -t image /bin/bash

Ctrl+P Ctrl+Q

重新进入容器

1
docker attach containerId

启动守护式容器

1
docker run --name dc1 -d ubuntu /bin/sh "while true;do echo hello world; sleep 1;done"

容器日志:

docker logs [-f] [-t] [–tail] 容器名

-f –follows=true|false 默认为false

-t –timestamps=true|false 默认为false

–tail=”all”

查看容器内的进程:

1
docker top containerId or containerName

在运行的容器内启动新进程

1
2
docker exec [-d] [-i] [-t] 容器名  [command] [arg...] 785d8f10f6ad
docker exec -i -t test01 /bin/bash

停止守护式容器

发送信号,等待容器停止

1
docker stop 容器名

直接停止容器

1
docker kill 容器名

在容器中部署静态网站

设置容器的端口映射

run [-P] [-p]

-P,–publish-all=true|false 默认为false 暴露所有的端口

docker run -P -i -t ubuntu /bin/bash

-p,–publish=[]

containerPort

​ docker run -p 80 -i -t ubunbu /bin/bash

hostPort:containerPort

​ docker run -p 8080:80 -i -t ubuntu /bin/bash

ip:containerPort

​ docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash

ip:hostPort:containerPort

​ docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

Nginx部署流程

1.创建映射80端口的交互式容器

1
docker run -p 80 --name web -i -t ubuntu /bin/bash

2.安装Nginx

1
apt-get install -y nginx

3.安装文本编辑器vim

1
apt-get install -y vim 

4.创建静态页面

1
2
3
4
5
mkdir -p /var/www/html

cd /var/www/html

vim index.html

5.修改nginx配置文件

1
2
3
4
5
6
7
whereis nginx

ls /etc/nginx/sites-enabled

vim /etc/nginx/sites-enabled/default

root /var/www/html;

6.运行nginx

1
2
3
nginx 

ps -ef

7.验证网站访问

查看端口的映射情况

1
docker port web

80/tcp -> 0.0.0.0:49167

查看容器中进程的运行情况

1
docker top web

查看容器的ip地址

1
2
3
docker inspect web
docker exec web nginx
docker top web

查看和删除镜像

1
2
3
docker info
sudo ls -l /var/lib/docker/aufs
sudo ls -l /var/lib/docker/aufs/mnt

docker images:

-a,–all=false

-f,–filter=[]

–no-trunc=false 指定不使用截断的形式

-q,–quiet=false 只显示镜像的唯一id

1
2
docker inspect container/image
docker rmi image:

-f,–force=false Force removal of the image

–no-prune=false Do not delete untagged parents

删除所有的镜像

1
docker rmi $(docker images -q)

构建镜像

保存对容器的修改,再次使用

自定义镜像的能力

以软件的形式打包并分发服务及其运行环境

docker commit 通过容器构建

docker build 通过dockefile文件构建镜像

docker commit [OPTIONS] containner[repository[:TAG]]

-a,–author=”” Author

eg “xxx@xxx.com

-m,–message=”” commit message

-p,–pause=true Pause container during commit

eg:

(1)docker run -it -p 80 –name commit_test ubuntu /bin/bash

(2)apt-get nginx

(3)docker commit commit_test -a “test” -m “test” dormancypress/commit_test1

(4)docker images

(5)docker run -d –name nginx_web1 -p 80 dormancypress/commit_test1 nginx -g “daemon off;”

创建dockerfile

##First Dockerfile

FROM ubuntu:14.04

MAINTAINER dormancypress “xxx@xxx.com

RUN apt-get update

RUN apt-get install -y nginx

EXPOSE 80

mkdir -p dockerfile/df_test1

cd dockerfile/df_test1

vim Dockerfile

docker build [OPTIONS] PATH | URL | -

–force-rm=false

–no-cache=false

–pull=false

-q,–quiet=false

–rm=true

-t,–tag=””

docker build -t=’dormancypress/df_test1’ .

获取和推送镜像

查找镜像

Docker Hub:

https://registry.hub.docker.com

docker search [OPTIONS] TERM

–automated=false Only show automated builds

–no-trunc=false Don’t truncate output

-s,–stars=0 Only displays with at least X stars

拉取鏡像

docker pull

使用–registry-mirror选项加速下载

(1)修改:/etc/default/docker

(2)添加:DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR

https://www.daocloud.io

vim /etc/default/docker

DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR

sudo service docker restart

ps -ef | grep docker

docker push dormancypress/nginx

Docker指令

指令格式

(1)# Comment 注释

(2)INSTRUCTION argument 指令

基础镜像,必须是dockerfile中第一条指令

FROM

FROM :

制定镜像的作者信息, 包含镜像的所有者和联系信息

MAINTAINER

指定当前镜像中运行的命令(构建时运行)

RUN (shell指令)

/bin/sh -c command

RUN echo hello

RUN [“executable”,”param1”,”param2”] (exec模式)

RUN[“/bin/bash”,”-c”,”echo hello”]

指定运行该镜像的容器使用的端口

EXPOSE […]

CMD(运行时运行)(会被docker run中指定的启动命令覆盖)

CMD“executable”,”param1”,”param2”

CMD command param1 param2 (shell模式)

CMD[“param1”,”param2”] (作为ENTRYPOINT指令的默认参数)

不会被docker run中指定的启动命令覆盖(可以使用docker run –entrypoint覆盖)

ENTRYPOINT“executable”,”param1”,”param2”

ENTRYPOINT command param1 param2(shell模式)

CMD和ENTRYPOINT组合使用

docker run -p 80 -d –name ep_test2 dormancypress/df_test5 -g “daemon off;”

ADD包含类似tar的解压功能

ADD

ADD “…”

如果单纯复制文件,Docker推荐使用COPY

COPY

COPY [““…”“] (适用于文件路径中有空格的情况)

———————-dockerfile——————————–

##first dockerfile for test

FROM ubuntu:14.04

MAINTAINER dormancypress “xxxx@xxxx.com

RUN apt-get update

RUN apt-get install -y nginx

COPY index.html /usr/share/nginx/html/

EXPOSE 80

ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]

添加卷

VOLUME [“/data”]

从镜像创建一个新容器时,在容器内部设置工作目录。也可以在构建中,为后续的工作指定工作目录

需要注意:通常使用绝对路径,如果使用相对路径,通常路径会传递下去

WORKDIR /path/to/workdir

用来设置环境变量

ENV

ENV =

指定镜像会以什么样的用户运行

USER daemon

USER user USER uid

USER user:group USER uid:gid

USER user:gid USER uid:group

为镜像添加触发器

当一个镜像被其他镜像作为基础镜像时执行

会在构建过程中插入指令

ONBUILD [INSTRUCTION]

—————-dockerfile—————–

#first dockerfile for test

FROM ubuntu:14.04

MAINTAINER dormancypress “xxx@xxx.com

RUN apt-get update

RUN apt-get install -y nginx

ONBUILD COPY index.html /usr/share/nginx/html/

EXPOSE 80

ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]

Dockerfile的构建过程

(1)从基础镜像运行一个容器

(2)执行一条指令,对容器做出修改

(3)执行类似docker commit的操作,提交一个新的镜像层

(4)再基于刚提交的镜像运行一个新容器

(5)执行dockerfile中的下一条指令,直至所有指令执行完毕

构建缓存

不使用构建缓存 docker build –no-cache

——————–dockerfile—————-

FROM ubuntu:14.04

MAINTAINER dormancypress “xxx@xxx.com

ENV REFRESH_DATE 2015-04-01

RUN apt-get update

RUN apt-get install -y nginx

EXPOSE 80

查看镜像的构建过程

docker history image

Docker容器的网络基础

ifconfig 查看网络配置

sudo apt-get install bridge-utils 网桥管理工具

sudo brctl show

修改docker0地址:

sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

添加虚拟网桥

sudo brctl addbr br0

sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

更改docker守护进程的启动配置

/etc/default/docker中添加DOCKER_OPS值

-b=br0

容器的互联

用于测试的Docker镜像Dockefile

FROM ubuntu:14.04

RUN apt-get install -y ping

RUN apt-get update

RUN apt-get install -y nginx

RUN apt-get install -y curl

EXPOSE 80

CMD /bin/bash

默认允许所有容器互联

–icc=true 默认

docker run -it –name cct1 dormancypress/cct

nginx

ctrl+p ctrl+q

docker run -it –name cct2 dormancypress/cct

ifconfig

使用代号,避免其他容器访问该容器时,由于容器重新启动产生的ip地址变化的问题

docker run –link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]

拒绝容器间互联

vim /etc/default/docker

DOCKER_OPTS = “–icc=true”

sudo service docker restart

允许特定容器间的连接

–icc=false –iptables=true

–link

sudo /etc/default/docker

DOCKER_OPTS =”–iptables=true,–icc=false”

sudo iptables -L -n

清空iptables的设置

sudo iptables -F

Docker容器与外部网络的连接

ip_forward

–ip-forward=true 决定系统是否会转发流量

sysctl net.ipv4.conf.all.forwarding

iptables

是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能

(1)表(table)

(2)链(chain)

(3)规则(rule)

ACCEPT REJECT DROP

filter表中包含的链:

INPUT

FORWARD

OUTPUT

sudo iptables -t filter -L -n

允许端口映射访问

docker run -it -p 80 –name cct5 dormancypress/cct

docker port cct5

限制ip访问容器

数据卷

数据卷是经过特殊设计的目录,可以绕过联合文件系统(ufs),为一个或多个容器提供访问

数据卷的特点

(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中、

(2)数据卷可以在容器之间共享和重用

(3)可以对数据卷里的内容直接进行修改

(4)数据卷的变化不会影响镜像的更新

(5)卷会一直存在,即使挂载数据卷的容器已经被删除

sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash

指定访问权限

sudo docker run -it -v ~/datavolume:/data:ro –name dvt1 ubuntu /bin/bash

使用Dockerfile构建包含数据卷的镜像:

VOLUME[“/data”]

# For data volume Test

FROM ubuntu:14.04

VOLUME [“/data/test”,”/data/test01”]

CMD /bin/bash

docker run -it –name dvt5 –volumes-from dvt4 ubuntu /bin/bash

数据卷的备份和还原

备份:

docker run –volumes-from [container name] -v $(pwd):/backup ubuntu

tar cvf /backup/backup.tar [container data volume]

docker restart dvt5

docker attach dvt5

启动容器进行备份

docker run –volumes-from dvt5 -v ~/backup:/backup –name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume

典型容器集群管理工具

(1)容器调度

Docker Swarm k8s Apache Mesos CoreOS Fleet Openstack Magnum

(2)配置管理(同步集群状态)

Etcd Zookeeper Consul

(3)服务发现

Etcd Haproxy Consul

(4)日志/监控/报警

ELK stack cAdvisor Prometheus

云集规模容器管理系统

(1)容器调度

(2)服务发现

(3)网络配置

(4)安全配置

(5)负载均衡

(6)数据持久化

(7)容错/高可用

(8)日志管理/容器监控

Docker Machine

一条命令,多环境部署

支持列表

VirtualBox Vmware Microsoft Hyper-V openstack Microsoft Azure RackSpace

Google Cloud Platform Amazon Web Services DigitalOcean

下载Docker machine

(1)curl -L https://github.com/docker/machine/releases/download/v0.4.0/dockder-machine_linux-amd64 > /user/local/bin/docker-machine

(2)chmod +x /user/local/bin/docker-machine

(3)docker-machine -V

(4)docker-machine create -d virtualbox test

(5)docker-machine ls

Docker machine命令集

start/stop/restart/kill

active/config/env/inspect/ip/status/url -获取Docker machine信息

ssh 远程登陆Docker Machine

scp 本机与Docker Machine或Docker Machine之间传输文件

(1)docker-machine env test

通过本机的Docker客户端连接远端的Docker Machine

(1)eval “$(docker-machine env test)”

(2)docker run -d -t index.alauda.cn/library/ubuntu bash

(3)docker ps

(4)docker-machine ssh test

Docker Compose

定义和运行多个Docker容器的工具

一个文件-docker-compose.yml

一条命令-docker-compose up

curl -L https://xxxx

docker-compose.yml

image:ubuntu:latest

build:/path/to/build/dir

dockerfile:使用指定的Dockerfile

command:覆盖默认命令

容器配置:

links:

-db:database

external_links:

-project_redis_1

ports:

-“3000”

-“8000:80”

expose:

- “3000”

volumes:

- /var/lib/mysql:/var/lib/mysql

environment:

- MYSQL_USER = mysql

docker-compose.yml

web:

build: .

ports:

​ - “5000:5000”

volumes:

​ - .:/code

links:

​ - redis

redis:

image:redis

Docker Compoase命令集

管理镜像 -build/pull

管理服务 -up/start/stop/kill/rm/scale

服务状态 -ps/logs/port

一次性命令 -run

Docker Swarm

容器管理技术

Kubernetes

(1)开源Docker容器编排系统

(2)轻量级、简单

(3)公有云、私有云以及混合云中部署

(4)模块化(modular),可插拔化,可挂接,可组合

(5)自动恢复,自动重启,自动复制

kubectl get nodes

kubectl get events

Pods

创建,调度以及管理的最小单元

共存的一组容器的集合

容器共享PID,网络,IPC及UTS命令空间

容器共享存储卷

短暂存在(pending running succeed fail)

kubectl create -f pod.yaml

kubectl get pods

kutectl delete pods nginx

kubectl get pods redis -o yaml

Labels

用以标示对象(如Pod)的key/value对

组织并选择对象子集

Replication Controllers

确保在任一时刻运行指定数目的Pod

Services

抽象了一系列Pod并定义其访问规则

固定IP地址和DNS域名

通过环境变量和DNS发现服务

负载均衡

外部服务 ClusterIP,NodePort,LoadBalancer

Docker常用命令:

https://www.jianshu.com/p/5caa68150661

常用命令

docker run -p 0.0.0.0:6000:6000 –name “test” -it centos

docker exec -it 4d34fbf944a5 /bin/bash

安装portainer管理平台

1
2
3
4
5
6
7
8
9
10
11
# 搜索镜像
docker search portainer
# 拉去镜像
docker pull portainer/portainer
# 运行镜像
# (1)本机模式
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer
# (2)远程模式
docker run -d -p 9000:9000 --restart=always --name prtainer portainer/portainer
# 访问Portainer容器
http://ip:9000

FFMPEG命令详解

FFMPEG详解

ffmpeg使用语法:

ffmpeg [[options][`-i’ input_file]]… {[options] output_file}…

如果没有输入文件,那么视音频捕捉就会起作用。

作为通用的规则,选项一般用于下一个特定的文件。如果你给 –b 64选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。

缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。

3.选项

a) 通用选项

-L license

-h 帮助

-fromats 显示可用的格式,编解码的,协议的。。。

-f fmt 强迫采用格式fmt

-I filename 输入文件

-y 覆盖输出文件

-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持

-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持

-title string 设置标题

-author string 设置作者

-copyright string 设置版权

-comment string 设置评论

-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置,只需要输入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

-hq 激活高质量设置

-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

b) 视频选项

-b bitrate 设置比特率,缺省200kb/s

-r fps 设置帧频 缺省25

-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576

-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777

-croptop size 设置顶部切除带大小 像素单位

-cropbottom size –cropleft size –cropright size

-padtop size 设置顶部补齐的大小 像素单位

-padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)

-vn 不做视频记录

-bt tolerance 设置视频码率容忍度kbit/s

-maxrate bitrate设置最大视频码率容忍度

-minrate bitreate 设置最小视频码率容忍度

-bufsize size 设置码率控制缓冲区大小

-vcodec codec 强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。

-sameq 使用同样视频质量作为源(VBR)

-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率

-passlogfile file 选择两遍的纪录文件名为file

c)高级视频选项

-g gop_size 设置图像组大小

-intra 仅适用帧内编码

-qscale q 使用固定的视频量化标度(VBR)

-qmin q 最小视频量化标度(VBR)

-qmax q 最大视频量化标度(VBR)

-qdiff q 量化标度间最大偏差 (VBR)

-qblur blur 视频量化标度柔化(VBR)

-qcomp compression 视频量化标度压缩(VBR)

-rc_init_cplx complexity 一遍编码的初始复杂度

-b_qfactor factor 在p和b帧间的qp因子

-i_qfactor factor 在p和i帧间的qp因子

-b_qoffset offset 在p和b帧间的qp偏差

-i_qoffset offset 在p和i帧间的qp偏差

-rc_eq equation 设置码率控制方程 默认tex^qComp

-rc_override override 特定间隔下的速率控制重载

-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full

-dct_algo algo 设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC

-idct_algo algo 设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM

-er n 设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE

-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)

-bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4

-mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD

-4mv 使用4个运动矢量 仅用于mpeg4

-part 使用数据划分 仅用于mpeg4

-bug param 绕过没有被自动监测到编码器的问题

-strict strictness 跟标准的严格性

-aic 使能高级帧内编码 h263+

-umv 使能无限运动矢量 h263+

-deinterlace 不采用交织方法

-interlace 强迫交织法编码仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大

-psnr 计算压缩帧的psnr

-vstats 输出视频编码统计到vstats_hhmmss.log

-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开

D)音频选项

-ab bitrate 设置音频码率

-ar freq 设置音频采样率

-ac channels 设置通道 缺省为1

-an 不使能音频纪录

-acodec codec 使用codec编解码

E)音频/视频捕获选项

-vd device 设置视频捕获设备。比如/dev/video0

-vc channel 设置视频捕获通道 DV1394专用

-tvstd standard 设置电视标准 NTSC PAL(SECAM)

-dv1394 设置DV1394捕获

-av device 设置音频设备 比如/dev/dsp

F)高级选项

-map file:stream 设置输入流映射

-debug 打印特定调试信息

-benchmark 为基准测试加入时间

-hex 倾倒每一个输入包

-bitexact 仅使用位精确算法 用于编解码测试

-ps size 设置包大小,以bits为单位

-re 以本地帧频读数据,主要用于模拟捕获设备

-loop 循环输入流。只工作于图像流,用于ffserver测试

Git资源

gitlog

Git原理详解及实用指南

git操作区

  • 工作区(coding)
  • 暂存区(after Add)
  • 本地仓库(after Commit)
  • 远程仓库(after Push)

新建代码库

1
2
3
4
# 在此目录新建一个git代码库
git init
# 新建一个目录,将其初始化未git代码库
git init project-name

配置

1
2
3
4
5
6
7
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
# 设置提交代码时的用户信息
git config [--global] user.name "name"
git config [--global] user.email "email address"

增加/删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
git add -p
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]

代码提交

1
2
3
4
5
6
7
8
9
10
11
12
13
# 提交暂存区到仓库区
git commit -m [message]
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
# 提交时显示所有diff信息
git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
git commit --amend [file1] [file2] ...

查看信息

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
# 显示有变更的文件
git status
# 显示当前分支的版本历史
git log
# 显示commit历史,以及每次commit发生变更的文件
git log --stat
# 搜索提交历史,根据关键词
git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
git log --follow [file]
git whatchanged [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 显示过去5次提交
git log -5 --pretty --oneline
# 显示所有提交过的用户,按提交次数排序
git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
git blame [file]
# 显示暂存区和工作区的差异
git diff
# 显示暂存区和上一个commit的差异
git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[filename]
# 显示当前分支的最近几次提交
git reflog

暂存操作

操作 bash
创建 git stash(git stash save “日志信息”)
查看 git stash list
应用 git stash apply stash@{num}
删除 git stash drop stash@{num}
还原上一个暂存并删除暂存(如无conflict) git stash pop

撤销修改

未提交到暂存区(未add)

1
2
## 如果没有 -- 的话就变成切换分支了
git checkout -- filename.txt

未提交到仓库(未commit)

1
2
3
# 首先用reset来把修改撤回到工作区,再使用checkout命令撤回工作区的修改。这里的reset相当于add的反操作。
git reset HEAD filename.txt
git checkout -- filename.txt

已经提交到仓库

1
2
# --hard表示强制回退,丢弃本地的修改,回退后,该版本号之后的提交都将不可见
git reset --hard xxxxxx

撤销之前某一个提交

1
2
# 撤销的同时,会创建一个新的提交,这是一个安全的方法,因为它不会重写提交历史。
git revert xxxxx

合并commit

1
2
# 如果要撤回目前的commit,可以把它合并到上一个commit中,在出现的两个提交信息的pick改为fixup
git rebase -i HEAD~

分支操作

操作 bash
查看分支 git branch
查看所有分支 git branch -a
在targe分支上创建分支,没有则从当前分支 git branch branch-name target-branch
创建并切换分支 git checkout -b branch-name
合并某分支到当前分支 git merge branch-name
删除分支,只能删参与了合并的 git branch -d branch-name
强行删除 git branch -D branch-name
删除远程分支 git push origin : remote-branch-name

远程仓库操作

操作 bash
克隆 git clone url
添加远程仓库 git remote add name url
删除远程仓库 git remote rm name
拉取 git pull remote-branch-name local-branch-name
推送本地所有分支到远程 git push –all origin
推送到远程同名分支 git push origin local-branch-name
推送本地分支到远程master git push origin local-branch-name:master
把当前本地分支推送并创建到远程 git push origin
检出远程分支 git checkout -b new-local-branch-name origin/remote-branch-name

其他

1
2
# 生成一个可供发布的压缩包
git archive

提交格式

  • feat: 新特性,添加功能

  • fix: 修改bug

  • refactor: 代码重构

  • docs: 文档修改

  • style: 代码格式修改, 注意不是 css 修改

  • test: 测试用例修改

  • chore: 其他修改, 比如构建流程, 依赖管理.

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
## 跳到之前的分支
git checkout -

# 查看历史
## 每个提交在一行内显示
git log --oneline
## 在所有提交日志中搜索包含[homepage]的提交
git log --all --grep='homepage'
## 获取某人的提交日志
git log --author="yaogerjiang"

## 获取所有操作历史
git reflog
## 重置到相应提交
git reset HEAD@{4}
## ...或者...
git reset --hard <提交的哈希值>

## 本次仓库混乱
git fetch origin
git checkout master
git reset --hard origin/master

## 查看我的分支和master的不同
git diff master..my-branch

## 编辑上次提交
git commit --amend -m "更好的提交日志"

## 在上次提交中附加一些内容,保持提交日志不变git add . && git commit --amend --no-edit

## 空提交 -- 可以用来重新触发CI构建
git commit --allow-empty -m "chore: re-trigger build"

# 清理
git fetch -p

CentOS8配置mysql

安装MySQL8.0

使用最新的包管理器安装MySQL

1
sudo dnf intall @mysql

开机启动

运行以下命令来启动MySQL服务并使用它在启动时自动启动

1
sudo systemctl enable --now mysqld

检查MySQL是否正在运行

1
sudo systemctl status mysqld

添加密码及安全设置

运行mysql_secure_installation脚本

1
sudo mysql_secure_installation

步骤如下:

1.要求你配置VALIDATE PASSWORD component(验证密码组件): 输入y ,回车进入该配置

  • 选择密码验证策略等级, 我这里选择0 (low),回车
  • 输入新密码两次
  • 确认是否继续使用提供的密码?输入y ,回车
  • 移除匿名用户? 输入y ,回车
  • 不允许root远程登陆? 我这里需要远程登陆,所以输入n ,回车

2.移除test数据库? 输入y ,回车

3.重新载入权限表? 输入y ,回车

配置远程登录

如果需要设置root账户远程登陆,上一步骤中,不允许root远程登陆?这一步需要设为n。
接下来本机登录MySQL,将root用户的host字段设为’%’,意为接受root所有IP地址的登录请求:
本机登录MySQL

1
mysql -uroot -p<上面步骤中设置的密码>

接着继续执行mysql语句,将将root用户的host字段设为’%’:

1
2
3
use mysql;
update user set host='%' where user='root';
flush privileges;

设置完成后输入exit退出mysql,回到终端shell界面,接着开启系统防火墙的3306端口:

1
2
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload

关闭MySQL主机查询dns

MySQL会反向解析远程连接地址的dns记录,如果MySQL主机无法连接外网,则dns可能无法解析成功,导致第一次连接MySQL速度很慢,所以在配置中可以关闭该功能。

打开/etc/my.cnf文件,添加以下配置:

1
2
[mysqld]
skip-name-resolve

重启服务

1
sudo systemctl restart mysqld

Centos8编译安装FFMpeg

下载
1
wget http://www.ffmpeg.org/releases/ffmpeg-4.1.6.tar.gz
解压
1
tar -xvf ffmpeg-4.1.6.tar.gz
进入解压后的文件夹,编译安装
1
2
cd ffmpeg-4.1.6/`
`./configure && make && make install
查看ffmpeg版本号
1
ffmpeg -version
下载视频

不改变编码方式
ffmpeg -i 视频url -c copy video_name.mp4