0%

docker commit

docker如何将运行中的容器保存为docker镜像

1
2
$  docker commit <container id> <repo-name>:<tag>
$ docker save -o <repo-name>-<tag>.img <repo-name>:<tag>

Create a Container

1
2
$ docker create -it ubuntu:lastest
$ docker start ubuntu:lastest

is equal to

1
$ docker run -it ubuntu:lastest

Stop a Container

1
$ docker stop ubuntu:lastest

Delete the contaier

1
$ docker rm contaier_id

Export an contaier

1
$ docker export --output=test.tar contaier_id

Import an contaier

1
$ docker import test.tar - username/ubuntu:v1.0

Docker 快速删除所有容器

1
docker ps

查看所有容器

1
$ docker ps -a

进入容器
其中字符串为容器ID:

1
$ docker exec -it d27bd3008ad9 /bin/bash

停用全部运行中的容器:

1
$ docker stop $(docker ps -q)

删除全部容器:

1
$ docker rm $(docker ps -aq)

一条命令实现停用并删除容器:

1
$ docker stop $(docker ps -q) & docker rm $(docker ps -aq)

Docker清理命令

杀死所有正在运行的容器

1
docker kill $(docker ps -a -q)

删除所有已经停止的容器

1
docker rm $(docker ps -a -q)

删除所有未打 dangling 标签的镜像

1
docker rmi $(docker images -q -f dangling=true)

通过镜像的id来删除指定镜像

1
2
docker rmi <image id>

删除所有镜像

1
docker rmi $(docker images -q)

删除docker images中为none的镜像

1
2
3
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi

删除标签

1
$ docker rmi shaoguangleo/test:tag

注释与提示

解释如何计算和编程的内容并不属于本书范围,读者可以自行查阅读有关书籍。然而能写出好的程序并非一日之功,这是一门需要循序渐进的艺术,只有通过实践锻炼才能写出既短又好的程序。

超出0~360°范围的角度的三角函数

超出0~360°范围的角度经常出现在天文计算中,在例24.a中我们可以看到1992年10月13日太阳的平经度角是-2318.19281°。快速运动的天体,比如月球、木星的伽利略卫星或者行星的自转中甚至还会出现更大的角度(可以看例41.a中第9步中的角w的计算实例)。
把角度转化到0~360°范围之内有时是很必要的,因为一些计算器或者程序设计语言对于大的角度的三角函数计算结果是不准确的。例如,你可以试试计算3600030°的正弦。正确结果应该为0.5。

译者注:事实上,对于现代计算机而言,上一行所述的问题基本不存在。不过,很多情况下,我们仍需把一个角度转换到0到360度。

角度的表示方法

计算机不能直接计算出以度分秒方式表示的角度的三角函数。在使用三角函数之前,应该把角度转换成以度为单位的十进制小数形式。因此,在计算23°26′49″的余弦时要先把角度转化成为23.44694444°,然后再用余弦函数计算。
遗憾的是,几乎所有的电脑都是用弧度而不是度来计算,所以还应把度转为弧度单位,通常是一件麻烦的事情。

赤经

赤经通常用时、分、秒方式来表示。如果需要计算赤经的三角函数,需要把赤经转换成用度为单位来表示(然后再转换成以弧度为单位),请注意1h对应于15°。
例1.a ——计算 $\alpha$ = 9h 14m 55 s8的tan$\alpha$。我们首先把$\alpha$转化成以时为单位的十进制小数:9h 14m 55 s8=9+14/60+55.8/3600=9.248833333时然后再乘以15。$\alpha$=138.73250°然后在除以180/$\pi$得到以弧度为单位的57.295779513…。然后得出 tan$\alpha$=-0.877517

修正角所在的象限

当已知一个角的正弦、余弦或正切值时,可以通过三角函数对应的反函数——如正弦对应的反正弦(arcsin),余弦对应的反余弦(arccos),正切对应的反正切(arctan)来得出角的大小。但是请注意在一些计算机上和一些程序设计语言中,尤其是大部分早期的微型计算机中都没有提供反正弦和反余弦函数。
反三角函数并不是单值函数,例如,如果sinα=0.5,那么$\alpha$可以是30°、150°、390°等等。基于这个原因,计算机中的反三角函数的取值范围只有0~360°的一半:反正弦和反正切的取值范围是在-90~+90°,而反余弦的取值范围则是0~180°。
例如,计算cos147°,结果是-0.8387,用反余弦函数计算-0.8387的结果正是147°,但是,cos213°的结果也是-0.8387,而我们用反余弦函数计算的结果则是147°。
因此当使用反正弦、反余弦和反正切的时候,必要时需要通过一个或多个值来弄清楚它代表的角度,消除结果的不确定性。另外,每个问题都要单独检查。
例如,公式(12.4)和(24.7)给出了天体赤纬的正弦。因为赤纬的取值范围在-90~+90°,所以反正弦函数可以在正确的象限算出赤纬,因此这里就不必进行检验。
公式(16.1)给出了角度差的余弦也是同样情况,实际上角度差的取值范围在0~180°,这正与反余弦函数的取值范围一致。
但是请看从赤经($\alpha$)赤纬($\beta$)转换到黄经($\beta$)黄纬($\lambda$)的公式:
$$
cosβsinλ=sinδsinε+cosδcosεsin$\alpha$
$$

$$
cosβcosλ=cosδcos$\alpha$
$$

令第一个方程为A,第二个方程为B,用A式除以B式,我们可以得到tanλ=A/B,则对A/B使用反正切函数可以求出角λ,该角的取值在-90~+90°范围内,角度结果可能会相差±180°(由于正切函数的周期为180°)。确定角所在的正确象限可以通过如下测试:如果B<0,求得的结果加上180°。不过一些程序设计语言(如C语言、javascript、VB)还提供了重要的第二个反正切函数ATAN2,这个函数有两个参数A和B,这个函数会求出正确的结果并转化到正确的象限。例如,设A=-0.45,B=-0.72,使用ATAN(A/B)=32°,而使用ATAN2(A,B)可以求得正确结果是-148°,或+212°。

负的角度值的输入

以度分秒方式表示的角度可以用三个独立的参数(D,M,S)输入。例如,21°44′07″可以用三个数字21,44,07输入,然后程序中使用H=D+M/60+S/3600转化成为以度为单位。
我们还应该仔细考虑负的角度的情况,比如角度是-13°47′22″,代表的是-13°,-47′和-22″,这样的话D=-13,M=-47,S=-22。所以的参数都应该有同样的正负号。
对-13°47′22″可能的错误理解是输入-13°,+47′和+22″,这样输入的结果实际上是-12°12′38″。

时间的幂

一些数值需要通过含有时间的幂(如T,T2,T3,……)的公式来计算,应当注意的是这样的多项式只是在T的值不是太大的情况下才是合理的,比如公式:
e=0.04629590-0.000027337T+0.0000000790T2 (1.1)
给出了天王星的轨道偏心率;T是以自2000年起算的儒略世纪数(每世纪36525天),显然该式只有在公元2000年前后,比如T在+30~-30范围内有效。如果|T|>30,这个公式就不再有效,比如T= -3305.8,公式的结果将是e=1。一个认为“计算机从不犯错的”人可能会认为T= -3305.8时,天王星轨道是抛物线,进而认为天王星起源于太阳系之外—这显然是伪科学。
实际上尽管行星轨道的偏心率e在超过了定义的时间上限后变化并不是有规律的,但是时间在很少的几个千年纪之内,偏心率是可以用像(1.1)那样的多项式精确表示的。
进一步的观察我们可以发现公式中有周期项(公式中的正弦和余弦项,在几个世纪内变化很小)和长期项的不同(如公式中含有T,T2,T3,……的项,它随着时间的增加快速增大)。当T很小的时候,T2项会变得很小,但是当|T|值很大的时候这一项会变得非常重要。因此当|T|值比较大的时候考虑含有T2等项的周期项是没有意义的,在计算中也不用考虑。

避免幂计算

假设我们计算这样一个多项式:Y=A+BX+CX2+DX3+EX4
其中A,B,C,D,E是常数,X是变量。现在可以在计算机中一项项直接相加来求出每一个给定X的多项式的值。然而可以采用一些聪明的方法来避免计算X的幂,比如:
Y=A+X(B+X(C+X(D+EX)))
在这个式子中幂计算都消失了,采用了乘积来替代幂的计算。这种多项式的表示方法被称为Horner方法,这种方法因为避免了幂计算,所以特别适合自动计算。
不用幂计算,而采用计算A*A的方法来计算A的平方也是一个聪明的办法,我们使用这样一段程序在HP-85计算机上计算前200个正整数的平方:

FOR I=1 TO 200
K=I^2
NEXT I
完成计算需要费时10.75秒。但是,当我们把第二行换成K=I*I的话,完成整个计算只需费时0.96秒!

缩短一个程序

把程序写尽可能短小通常不仅是代表着艺术,而且在计算机内存受限情况下也是必须的。即使对于简单的计算,也存在一些把程序缩短的技巧。假设我们要计算下面多项相加的和S:

1
S=0.0003233sin(2.6782+15.54204T)+0.0000984sin(2.6351+79.62980T)+0.0000721sin(1.5905+77.55226T)+0.0000198sin(3.2588+21.32993T)+……

首先因为正弦的系数都是很小的数,可以通过采用以一个常数作为计数单位(在这个例子中是10-7)来避免输入那么多的数字,比如我们用3233来代替0.0003233。因此在计算了所有项之后,我们再把和除以10-7。
其次,在程序中声明全部数值项也是不明智的。相反,我们应该采用所谓的循环来完成计算。上面A*sin(B+CT)的每一项的A,B,C值应作为程序的数据部分。假如有50项,程序可以这样写:

1
2
3
4
5
6
7
8
9
Double s=0
Double data[50*3]={3233,2.6782,15.54204,……}; //每3个一组
int i,p;
for(i=0;i<50;i++)
{
p = i*3;
s += data[p]*sin( data[p+1]+data[p+2]*T );
}
s/=1e-7;

译者注:如果数据量较大,应考虑将数据与程序合理的分离;数据可以放在程序中的“数组”之中,如果数据量多达几万行或更多,多数情况下我们会考虑放在外部文件之中。

安全性测试

在可能出现“不可能”出现的情况下,需要进行安全性测试。例如,在迭代到特定数量之后计算停止却没有达到要求的精度。
或者考虑月掩星的情况,在程序中根据当地的环境来计算被掩恒星消失和再次出现的时间。然而,可能在给定的地点根本看不到这颗恒星被掩。在这种情况下,初切时间和终切时间根本就不存在,试着计算这两个时间会碰到计算一个负数的平方根的情况。为了避免出现这个问题,程序应该首先计算这颗恒星到月面中心的最短距离(从给定的地点观看),而且当且仅当这个距离小于月面半径的情况下才计算初切和终切时间。

调试

在程序写完之后必须要检查被称为Bug的错误。定位和修改程序中Bug的过程被称为调试。在无论使用什么程序设计语言编程,可能会有如下几种类型的Bug:

  • 语法错误:不符合程序设计语言的规则,比如拼写错误、遗漏了括号,或者编程语言的保留字。
  • 语义错误:比如遗漏程序行,例如在程序中不存在800行的情况下有GOTO 800语句。
  • 运行错误:在程序运行中出现的错误。例如:A=SQR(B),在程序中计算B的平方根,但是B的值为负值。
  • 其他编程错误:下面的几种错误经常会发生:
    • 错把字母“o”当作数字“0”输入,或者把字母“I”当作数字“1”输入。
    • 同一变量名在程序中使用了两次(变量代表不同意思)。
    • 输入数值常数的的错误(比如错把127.3当作127.03,或者错把15当作0.15),把*错当+。
    • 使用单位错误。例如一个角没有用弧度而是用度来作为单位,或者赤经用时做单位而没有转换成度或者弧度。
    • 角定位在错误象限。请见“修正角所在的象限”一节。
    • 数值舍入错误。例如一个人在计算d的余弦值,在d很小的情况下使用cos()效果不好。实际上如果d非常小,它的余弦值就几乎等于1,而且除弦值随d变化非常缓慢。在这种情况下计算出来余弦值是不准确的。
    • 比如,cos15″=0.99999997,而cos0″的准确值为1。如果想计算角度d的值非常小,可以通过其他方法来计算d的余弦值。比如,可以参考第16章。
    • 一个不能保证覆盖各种情况的迭代过程。请见第5章(迭代)和第29章(Kepler方程的解法)。

检查结果

当然,一个程序不仅要在“语法”正确,还要给出正确的结果。要用已知的方法检查你的程序,比如,如果你写了一个程序计算行星位置或者月相的时间,应该把计算结果和天文年历上给出的数值进行比较。
要在一些“特殊”情况下检查你的程序。比如,你的程序在赤纬为负值的情况下计算结果是否仍然正确?或者,在赤纬在0°和-1°之间是否正确?或者,观测者的纬度正好为0时是否正确?或者,时间为负值时是否正确?

参考徐剑伟翻译的天文算法,

docker镜像操作

获取镜像

1
$ docker pull NAME[:TAG]

We should specificate the tag when deploy in real task

查看镜像

1
2
3
$ docker images
$ docker inspect image
$ docker history image

搜素一个镜像

1
$ docker search imagename

This will list official image by default.

删除一个镜像

1
$ docker rmi imagename

Create the image

Method 1

提交更改并保存在contaier为一个镜像,假定为mynewimage

When you modify something in a container, you will get a new container id, remember it to create a new image.

1
$ docker commit -m message -a author CONTAINER_ID mynewimage:TAG

Method 2

you can using a template to import an image.

保存镜像到一个tar文件

保存该镜像到一个tar文件

1
$ docker save mynewimage > /tmp/mynewimage.tar

导入一个镜像

然后拷贝到另外一台主机,使用下述命令进行载入:

1
$ docker load < /tmp/mynewimage

推送一个镜像

1
2
$ docker tag test:lastest username/test:lastest
$ docker push username/test:lastest

docker镜像操作

获取镜像

1
$ docker pull NAME[:TAG]

We should specificate the tag when deploy in real task

查看镜像

1
2
3
$ docker images
$ docker inspect image
$ docker history image

搜素一个镜像

1
$ docker search imagename

This will list official image by default.

删除一个镜像

1
$ docker rmi imagename

Create the image

Method 1

提交更改并保存在contaier为一个镜像,假定为mynewimage

When you modify something in a container, you will get a new container id, remember it to create a new image.

1
$ docker commit -m message -a author CONTAINER_ID mynewimage:TAG

Method 2

you can using a template to import an image.

保存镜像到一个tar文件

保存该镜像到一个tar文件

1
$ docker save mynewimage > /tmp/mynewimage.tar

导入一个镜像

然后拷贝到另外一台主机,使用下述命令进行载入:

1
$ docker load < /tmp/mynewimage

推送一个镜像

1
2
$ docker tag test:lastest username/test:lastest
$ docker push username/test:lastest

docker命令不需要敲sudo的方法

由于docker daemon需要绑定到主机的Unix socket而不是普通的TCP端口,而Unix socket的属主为root用户,所以其他用户只有在命令前添加sudo选项才能执行相关操作。

如果不想每次使用docker命令的时候还要额外的敲一下sudo,可以按照下面的方法配置一下。

  1. 创建一个docker组

    1
    $ sudo groupadd docker
  2. 添加当前用户到docker组

    1
    $ sudo usermod -aG docker $USER
  3. 登出,重新登录shell

  4. 验证docker命令是否可以运行

    1
    $ docker run hello-world

MacOSX 好工具

软件相关

Homebrew

Homebrew号称macOS缺失的软件包管理器。

安装方法为:

1
2
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

详情见 Brew

MacPorts

MacPorts是开源社区发起的一项方便开发者在Shell下进行软件的编译、安装和升级等操作的开源项目,旨在方便Mac环境下的开发者。更多的关于MacPorts的信息,你可以登陆官网查看MacPorts

软件卸载

通过drag,drop来卸载软件,与安装一样简单,参考软件 Zapper

AppZapper. Simply drag one or more apps onto AppZapper. Then, watch as it finds the extra files and lets you delete them with on click.

终端工具

终端除了系统自带的terminal比较好用,还有一个iTerm基本属于神器,推荐。

go2shell

用过Linux基本知道邮件就可以打开终端,这个在MacOSX中可以通过go2shell来弥补。

下载网址 https://zipzapmac.com/Go2Shell,下载后安装即可,可以通过下面的命令来打开配置窗口。

1
$ open -a Go2Shell --args config

文档工具

Mac下最好的Latex编辑器

首选MacTex,当然TexShop也特别好,关于详细的讨论参考 https://discussions.apple.com/message/18653515#18653515

搜索相关

Alfred 3 for Mac

极其强悍的效率工具,建议使用。

支持文件搜索、网页收拾、收藏夹搜索、计算器、联系人搜索、剪贴板搜索等。

Alfred is an award-winning app for Mac OS X which boosts your efficiency with hotkeys, keywords, text expansion and more. Search your Mac and the web, and be more productive with custom actions to control your Mac.

package control

不得不说,sublime是一个神器,并且支持N多扩展和插件。

其中Package Control包管理插件就特别赞。

支持添加/删除/禁用/查找插件的功能。

安装方法参考 https://packagecontrol.io/installation

命令行打开sublime

如果是在默认shell下,

1
sudo ln -s "/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl" /usr/bin/subl

使用zsh的可以使用以下命令

1
2
3
alias subl="'/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl'"
alias nano="subl"
export EDITOR="subl"

显示CPU架构的有关信息 lscpu

Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。
lscpusysfs/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读 。
命令输出的信息包含cpu数量,线程,核数,socket和Nom-Uniform Memeor Access(NUMA),缓存等等。

官方定义为:

lscpu - display information about the CPU architecture

参数基本用处不大,默认即可,部分参数可以查看offline和online的设备信息。

默认实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ lscpu
Architecture: x86_64 #架构信息
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 64 #逻辑cpu颗数
On-line CPU(s) list: 0-63
Thread(s) per core: 2 #每个核心线程
Core(s) per socket: 16 #每个cpu插槽核数/每颗物理cpu核数
Socket(s): 2 #cpu插槽数
NUMA node(s): 2
Vendor ID: GenuineIntel #cpu厂商ID
CPU family: 6 #cpu系列
Model: 63 #型号
Model name: Intel(R) Xeon(R) CPU E5-2698 v3 @ 2.30GHz
Stepping: 2 #步进
CPU MHz: 1290.335 #cpu主频
BogoMIPS: 4604.47
Virtualization: VT-x #cpu支持的虚拟化技术
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 40960K
NUMA node0 CPU(s): 0-15,32-47
NUMA node1 CPU(s): 16-31,48-63

其中几个概念需要理解清楚,基本比较重要的都有了备注。

其中第一个为CPU(s),这个值为Socket * Core * Thread得出,也就是逻辑的CPU个数。

1
2
3
4
5
CPU(s):                64   #逻辑CPU数
On-line CPU(s) list: 0-63
Thread(s) per core: 2
Core(s) per socket: 16
socket: 2

而其他几个概念为:

  • Socket : 物理上的CPU插槽的数量,也就是物理的实体概念
  • Core:即平常说的单核、多核、四核等,即每个CPU上的核数
  • Thread:每个core上的线程数,即超线程。