Linux命令:tar

tar是Linux中最流行的压缩、解压缩、打包、解包工具。麻雀虽小,五脏俱全,功能强大。 之前介绍的压缩命令gzip和bzip2只能针对一个文件进行压缩。当你想要压缩一大堆文件时,你得先将这一堆文件打成一个包。linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的(未压缩)。生成tar包后,就可以用其它的程序来进行压缩。 格式 1 $ tar [options]... [pathname...] 常用选项 -c : 建立新的包文件。 -r : 向包的末尾添加文件。 -t : 列出包中包含的文件。 -u : 如果文件比包中的文件新,那么更新包。 -x : 解包。 -f : 指定打包后的包名。 -j : 使用bzip2来压缩/解压包。 -z : 使用gzip来压缩/解压包。 -v : 压缩/解压缩过程可视化 示例 多个文件打包为一个文件: 1 2 3 $ tar -cvf pic.tar pic.png pic1.png pic2.png $ tar -cvf pic.tar *.png 注意: 选项-f不能缺少,而且其后必须紧跟包文件名。如果不指定-f选项,那么压缩结果将输出到标准输出设备。包后缀名最好为.tar,国际惯例。 查看包内内容: 选项-t可以查看包内内容。 1 $ tar -tf pic.tar 向包中追加一个文件: 选项-r可以向包中追加文件。

Linux命令:bzip2

bzip2是Linux里面压缩程序的另一个选择。它的压缩算法不同于gzip。与gzip相比有其优点,也有一些缺点。 bzip2的主要优点在于它压缩后文件的尺寸,对于相同文件,bzip2 压缩后的尺寸几乎总是小于gzip的压缩结果。有些时候,这个差距会相当大。这个优点对于网速慢的用户来说表现得尤为突出。需要提醒的是,当在 一些公共ftp 服务器上下载文件时,在.gz和.bz2文件中尽量选择.bz2文件是一种基本的网络礼节,因为这样可以减少服务器的负担以给更多人服务。 bzip2的缺点在于,它占用的CPU的使用率会比gzip更多。这就是说,压缩同一个文件,bzip2要比gzip使用更长的时间,占用更多的CPU资源。所以,当你在两者之中考虑选用哪种压缩程序的时候,需要衡量的是速度和压缩后的文件尺寸哪个对你来说更重要些。 格式 1 $ bzip2 [options]... [files]... 常用选项 -c : 将压缩的数据输出到屏幕上,不改动原始文件,可以通过数据流导向来处理。 -d : 解压缩文件。 -f : 强制压缩文件。不理会文件名称或者硬链接是否存在以及该文件是否为符号链接。 -k : 在压缩和解压缩的过程中不删除原文件。 -s : 在压缩过程中减少内存的使用。 -t : 检测一个压缩文件的一致性,看看文档是否有错误。 -v : 压缩过程可视化 **-# –fast –best:**压缩等级,-1最快,但压缩比最差,-9最慢,但压缩比最好。默认-6。 示例 压缩文件: 1 $ bzip2 -v pic1.png 大家可以看到,压缩后生成了压缩文件pic1.png.bz2,而源文件被删掉了。 使用选项-k可以保留源文件 1 $ bzip2 -kv pic2.png 解压缩文件: 1 $ bzip2 -d pic1.png.bz2 *注意:*和gzip一样,bizp2也仅能对单一文件进行压缩。

Linux命令:gzip

gzip可以说是应用度最广的压缩指令了!目前可以解开compress,zip与gzip等软件所压缩的档案。 格式 1 $ gzip [options]... [files or directory] 常用选项 -c : 将压缩的数据输出到屏幕上,不改动原始文件,可以通过数据流导向来处理。 -d : 解压缩文件。 -f : 强制压缩文件。不理会文件名称或者硬链接是否存在以及该文件是否为符号链接。 -k : 在压缩和解压缩的过程中不删除原文件。 -l : 列出压缩文件的信息 -r : 如果指定目录,那么gzip将递归压缩目录下的全部文件。 -t : 检测一个压缩文件的一致性,看看文档是否有错误。 -v : 压缩过程可视化 **-# –fast –best:**压缩等级,-1最快,但压缩比最差,-9最慢,但压缩比最好。默认-6。 示例 压缩一个文件: 1 $ gzip -v pic.png 大家可以看到,压缩后生成了压缩文件pic.png.gz,而源文件被删掉了。整个文件的压缩率只有0.6%,这是由于图片文件本来就是经过压缩的,文本文件的压缩率比较高。 使用选项-k可以保留源文件 1 $ gzip -kv pic.png 查看压缩文件的信息: 1 $ gzip -l pic.png.gz 解压缩文件: 1 $ gzip -d pic.

Gin框架中使用pprof

Go语言内置了获取程序运行数据的工具,包括以下两个标准库: runtime/pprof: 采集工具型应用运行数据进行分析 net/http/pprof: 采集服务型应用运行时数据进行分析 pprof开启后,每隔一段时间(10ms)就会收集当前的堆栈信息,获取各个函数占用的CPU以及内存资源,然后通过对这些采样数据进行分析,形成一个性能分析报告。 性能优化主要有一下几个方面: CPU Profile:报告程序的CPU使用情况,按照一定频率去采集应用程序在CPU和寄存器上面的数据。 Memory Profile(Heap Profile):报告程序的内存使用情况。 Block Profiling: 报告goroutines不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈。 Goroutine Profiling: 报告goroutines的使用情况,有哪些roroutines,它们的调用关系是怎样的。 注意:我们只应该在性能测试的时候才在代码中引入pprof 下载Gin框架专用pprof包并在项目中添加 go get https://github.com/gin-contrib/pprof 添加pprof之后的代码如下: package main import ( "net/http" "github.com/gin-contrib/pprof" "github.com/gin-gonic/gin" ) func main() { app := gin.Default() pprof.Register(app) // 性能 app.GET("/test", func(c *gin.Context) { c.String(http.StatusOK, "test") }) app.Run(":3000") } 编译并运行代码。代码运行之后可以看到系统自动增加了很多/debug/pprof的API。通过这些API我们可以看到需要的数据。 在浏览器里访问/debug/pprof, 通过这个页面我们可以看到我们需要的所有数据: 使用go tool pprof采集数据 再新建一个终端窗口输入以下命令,获取当前协程的堆栈信息:

Dockerfile常用指令

Dockerfile使用基本的基于DSL(Domain Specific Language)语法的指令来构建一个Docker镜像。 FROM FROM一定是第一条指令,用来指定一个基准镜像。如果不想使用基准镜像,那么可以使用scratch,它是一个虚拟镜像,表示一个空白的镜像 FROM <registry>:<tag> RUN RUN指令用来在容器构建过程中运行一个命令。 RUN <command> RUN ["<executable>","<param1>","<param2>"] # 在第一个方式中,command通常是一个shell命令,以`/bin/sh -c`的方式运行。 每个RUN指令都会生成一层文件系统,所以常规的做法是将多个命令在一个RUN指令中执行 RUN ["/bin/bash","-c","apt-get update && apt-get install -y redis-server"] EXPOSE EXPOSE指令用来设置对外的端口。 EXPOSE <port>[/protocol] 其中protocol是指协议,值为tcp或udp,默认为tcp。多个端口以空格分隔可以同时暴漏多个端口。 CMD CMD指令用于指定一个容器启动时要运行的命令。 CMD ["/bin/bash"] CMD ["/bin/bash","-c","apt update"] // 指定参数 使用docker run命令可以覆盖CMD命令,如果我们在Dockerfile中指定了CMD命令,而同时在docker run命令行中也指定了要运行的命令,命令行中指定的命令会覆盖Dockerfile中的命令。 在Dockerfile中只能指定一条CMD命令,如果指定了多条CMD命令,也只有最后一条指令会被执行。如果想在启动容器时运行多个进程或者多条命令,可以考虑使用类似Supervisor这样的服务管理工具。 ENTRYPOINT ENTRYPOINT指令也用于指定一个容器启动时要运行的命令。 ENTRYPOINT ["/usr/sbin/nginx"] ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] // 指定参数 ENTRYPOINT指令与CMD指令非常类似,但ENTRYPOINT指令提供的命令不会被docker run命令行中提供的指令覆盖,docker run命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中指定的命令。 如果确实需要,可以在运行时通过docker run中的--entrypoint标志覆盖ENTRYPOINT指令。 WORKDIR WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和CMD指定的程序会在这个目录下执行。也可以为最终的容器设置工作目录。 ENV ENV指令用来在镜像构建过程中设置环境变量 ENV RVM_PATH /home/rvm 这个新的环境变量可以在后续的任何RUN指令中使用。这些环境变量会被持久的保存到从我们的镜像创建的任何容器中。

Docker进入运行中容器的几种种方式

不论是开发人员还是运维人员,都经常有进入运行中容器的诉求。进入Docker容器比较常见的几种做法如下: 使用SSH 使用nsenter,nsinit等等第三方工具 使用docker attach 使用docker exec (推荐) 一.SSH 在虚拟机时代,SSH是我们最常用的登录远程服务器的方式,在docker容器中通过安装SSH Server也可以保证多人同时进入同一个容器且互相之间不受干扰。但是在使用docker时是不建议这么使用的,主要存在以下问题: 增加容器的资源开销。 容易增加容器受到恶意攻击的概率。 不符合Docker所倡导的一个容器一个进程的原则。 二.nsenter,nsinit等第三方工具 关于nsenter的相关内容请参考如下文章: nsenter 如果之前没有安装过nsenter,那么按下面步骤安装即可(注意是主机而非容器或镜像),具体的安装命令如下: $ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz $ tar -xzvf util-linux-2.24.tar.gz $ cd util-linux-2.24/ $ ./configure --without-ncurses $ make nsenter $ sudo cp nsenter /usr/local/bin 安装好nsenter之后可以查看一下该命令的使用。 nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来拿到该PID。 docker inspect命令使用如下: $ sudo docker inspect --help inspect命令可以分层级显示一个镜像或容器的信息。比如我们当前有一个正在运行的容器 可以使用docker inspect来查看该容器的详细信息。 $ sudo docker inspect 44fc0f0582d9 由其该信息非常多,此处只截取了其中一部分进行展示。如果要显示该容器第一个进行的PID可以使用如下方式 $ sudo docker inspect -f {{.