ShawnYoung's Blog

love&&curiosity

Docker镜像讲解

镜像是什么

  • 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库、环境变量和配置文件。
  • 所有的应用,直接打包docker镜像,就可以直接跑起来!
  • 如何得到镜像:
    1. 从远程仓库下载
    2. 朋友拷贝给你
    3. 自己制作一个镜像DockerFile

Docker镜像加载原理

UnionsFS( 联合文件系统 Union Filesystem) )

联合文件系统:union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,union文件系统是docker镜像的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但在外面来看,只是看到一个文件系统,联合加载会把各层文件系统叠加,这样最终的文件系统会包含所有底层

的文件和目录

Docker镜像加载原理

docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要引导加载kernel,Linux刚启动会加载bootfs文件系统,Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型linux系统中/dev,/proc,/bin/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

虚拟机的Centos都是好几个G,为什么Docker这里才200M?

对于精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同发行版可以公用bootfs。。

虚拟机是分钟级,容器是秒级。

1
2
3
# 查看镜像信息
[root@localhost ~]# docker image inspect redis:latest

.分层理解

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层!

commit镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
# 查看运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01f17edc0c92 tomcat "catalina.sh run" 3 months ago Up 5 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat01
# 创建自己的tomcat镜像
[root@localhost ~]# docker commit -a="StephenShawn" -m="add webapps" 01f17edc0c92 tomcat01:0.1
sha256:5da731531f9fea322cbf4cb2a971c5924672001746de2871171537faf4e6abe9
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat01 0.1 5da731531f9f 14 seconds ago 684MB
tomcat 9.0 b8e65a4d736d 6 months ago 680MB
tomcat latest fb5657adc892 6 months ago 680MB


Docker的常用命令

一、帮助命令


1
2
3
docker version # 显示docker的版本
docker info
docker 命令 --help # 万能命令

二、镜像命令


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
# 查看镜像
docker images # 列出所有镜像
docker images -a
docker images -aq # 只显示镜像id
# 搜索镜像
docker search --filter=STARS=3000 #搜索镜像star大于3000
# 下载镜像
docker pull 镜像[:tag] # 如果不写tag 默认是 latest
[root@localhost ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载,docker image的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
# 删除镜像
docker rmi -f 容器id # 删除指定的镜像
docker rmi -f 容器id 容器id 容器id # 删除多个的镜像
docker rmi -f $(docker images -aq) # 删除全部镜像

三、容器命令

新建容器并启动

1
2
3
4
5
6
7
8
9
10
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台运行方式
-it 使用交互式运行 进入容器查看内容
-p 指定容器的端口 -p 8080:8080
—P 主机端口:容器端口
-p 容器端口
容器端口
-P 随机端口

列出所有的运行的容器

1
2
3
4
5
6
7
8
9
10
11
12
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带历史运行过的容器
-n=? # 最近创建过的容器
-q # 只显示容器的编号
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker ps -aq
1a8af1ce6330
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a8af1ce6330 centos "/bin/bash" 12 minutes ago Exited (127) About a minute ago zealous_bartik

退出容器

1
2
exit #直接容器停止并退出
Ctrl + P + Q #容器不停止退出

删除容器

1
2
3
docker rm 容器id       			# 删除指定容器
docker rm -f $(docker ps -aq) # 删除全部容器
docker ps -a -q|xargs docker run # 删除全部容器(linux命令)

启动和停止容器的操作

1
2
3
4
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id

四、常用其他命令

后台启动容器
1
2
3
4
5
# docker run -d 镜像名
[root@localhost ~]# docker run -d centos
# 问题docker ps ,发现 centos 停止了
# 常见的坑, docker 容器使用后台运行,就必须要有一个前台进程,docker 发现没有应用,就会自动停止
# nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
1
2
3
4
5
6
7
8
9
10
11
12
docker logs
# 自己编写一段shell脚本
[root@localhost ~]# docker run -d centos /bin/sh -c "while true; do echo test;sleep 1;done"
# 查看当前在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9916a0298bfd centos "/bin/sh -c 'while t…" 19 seconds ago Up 18 seconds condescending_curie
113e7bdad55e centos "/bin/bash" 12 minutes ago Up 12 minutes serene_pasteur
# 显示日志
-tf
--tail number # 要显示日志的条数
[root@localhost ~]# docker logs -f -t --tail 10 113e7bdad55e
查看容器中进程信息
1
2
3
4
# 命令 docker top 容器id
[root@localhost ~]# docker top 9916a0298bfd
UID PID PPID C STIME
root 180675 180655 0 20:05 root 183113 180675 0 20:44
查看镜像的元数据
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# 命令 docker inspect 容器id
[root@localhost ~]# docker inspect 9916a0298bfd
[
{
"Id": "9916a0298bfd3fb37d142bdd8bc056a5c943f8aa3c08bc7e1bb75081ee2a3ed0",
"Created": "2022-03-23T00:05:18.49632074Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo test;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 180675,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-03-23T00:05:19.263635448Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/9916a0298bfd3fb37d142bdd8bc056a5c943f8aa3c08bc7e1bb75081ee2a3ed0/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/9916a0298bfd3fb37d142bdd8bc056a5c943f8aa3c08bc7e1bb75081ee2a3ed0/hostname",
"HostsPath": "/var/lib/docker/containers/9916a0298bfd3fb37d142bdd8bc056a5c943f8aa3c08bc7e1bb75081ee2a3ed0/hosts",
"LogPath": "/var/lib/docker/containers/9916a0298bfd3fb37d142bdd8bc056a5c943f8aa3c08bc7e1bb75081ee2a3ed0/9916a0298bfd3fb37d142bdd8bc056a5c943f8aa3c08bc7e1bb75081ee2a3ed0-json.log",
"Name": "/condescending_curie",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/2db2e17cdb47f8a05997664e4e31dc8f59b611e2d23388bc52b56c4407d27cc3-init/diff:/var/lib/docker/overlay2/e75ba16da0fef020c7930a9b6190dbd33a83a8324702c144c689c5cd4e323146/diff",
"MergedDir": "/var/lib/docker/overlay2/2db2e17cdb47f8a05997664e4e31dc8f59b611e2d23388bc52b56c4407d27cc3/merged",
"UpperDir": "/var/lib/docker/overlay2/2db2e17cdb47f8a05997664e4e31dc8f59b611e2d23388bc52b56c4407d27cc3/diff",
"WorkDir": "/var/lib/docker/overlay2/2db2e17cdb47f8a05997664e4e31dc8f59b611e2d23388bc52b56c4407d27cc3/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "9916a0298bfd",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true; do echo test;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "f28f51fd2c85ab7e8ba88827ec901c9ef4b517428747bd1cdf5196810db622c7",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/f28f51fd2c85",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "41b020afb72dc9602f5a030e56d816692170c2f0427377829da822e62976732a",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "d91d646c67beba9f1d4aa5cfa191bad1f24cf153ae1c6e3a37cf34599502a27f",
"EndpointID": "41b020afb72dc9602f5a030e56d816692170c2f0427377829da822e62976732a",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
进入当前正在运行的容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bashShell
# 测试
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9916a0298bfd centos "/bin/sh -c 'while t…" About an hour ago Up About an hour condescending_curie
113e7bdad55e centos "/bin/bash" About an hour ago Up About an hour serene_pasteur
[root@localhost ~]# docker exec -it 9916a0298bfd /bin/bash
[root@9916a0298bfd /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:05 ? 00:00:01 /bin/sh -c while true; do echo test;sleep 1;done
root 4061 0 0 01:12 pts/0 00:00:00 /bin/bash
root 4088 1 0 01:12 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 4089 4061 0 01:12 pts/0 00:00:00 ps -ef

# 方式二
docker attach 容器id
正在执行当前的代码...
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内烤贝文件到主机上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

docker cp b4bb1f3f7685:/home/test.java /home
#进入docker容器内
[root@b4bb1f3f7685 /]# cd /home
[root@b4bb1f3f7685 home]# ls
# 创建java文件
[root@b4bb1f3f7685 home]# touch test.java
[root@b4bb1f3f7685 home]# ls
test.java
[root@b4bb1f3f7685 home]# exit
exit
docker cp 容器id:容器内部路径 目的的主路径
[root@localhost home]# docker cp b4bb1f3f7685:/home/test.java /home
[root@localhost home]# ls
shawn test.java

五、安装服务器软件

安装Tomcat
1
2
3
4
5
# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm 一般用来测试,用完就删除
#下载在启动
docker pull tomcat:9.0
安装es+kibana
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
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录 挂载
# --net somenetwork 网路配置

# 启动 elasticsearch
[root@localhost ~]# docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 启动了 linux就卡住了 docker stats 查看cpu的状态

# es 是十分耗内存的 1.xG 1核2G

# 查看 docker stats

# 测试一下es是否成功了
[root@localhost ~]# curl localhost:9200
{
"name" : "6620e2b536c4",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "9i4LLjxvTVKf46Hp1qHkqA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 赶紧关闭,增加内存的限制,修改配置文件 -e 环境配置修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -e "discovery.type=single-node" elasticsearch:7.6.2
可视化

docker 图形化界面管理工具!提供一个后台供我们操作

1
2
[root@localhost ~]# docker run -d -p 8090:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

rockylinux安装教程

[install on CentOS](Install Docker Engine on CentOS | Docker Documentation)

Uninstall old versions


1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

Install using the repository


1
2
3
4
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Install Docker Engine


1
2
sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Start Docker


1
sudo systemctl start docker

Uninstall Docker Engine

1
2
3
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

/var/lib/docker 为默认工作目录

阿里云镜像加速


1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rz9fml8b.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

逻辑与/或

  • 注意AND、OR必须大写,否则会被认为是普通的单词,而不是搜索指令
  • 与普通编程语言不一样的是,OR指令优先于AND指令
  • 简写:AND指令一般以空格代替,不明确写出。另外AND指令还可以用+代替。OR指令可用|代替
逻辑非:-

  • 样例:搜索引擎 历史 -文化 -中国历史 -世界历史
完整匹配 “ “

  • 样例:”world war I” 表示搜索一次世界大战
通配符:*?

  • 与我们通常的习惯一致,“*”代表一连串字符,“?”代表单个字符
site: 在某个网站或域名下搜索

  • 样例:搜索引擎 技巧 site:edu.cn
  • 这表示要在中文教育科研网站(edu.cn)上关于搜索引擎技巧的页面
filetype: 搜索某种类型的文件

  • 样例:天文学 filetype:pdf
  • 简写: 天文学:pdf
  • 这表示只搜索pdf文件
  • tips:样例 天文学三个字位置任意写
in指令: 位置关键词查找

  • intitle: 在网页标题中查找。这通常对讨论比较多的热门话题很有效。例如:intitle:”GeForce 7800”+测试
  • 例如:allintitile:”GeForce 7800” 测试 与 intitle:”GeForce 7800”+测试 的含义一致。但是,allintitile是排他的,不能加上其他非intitle方面的限制条件
  • inurl: 在网页的url地址中查找。例如:inurl:dowload 表示查找url中包含download的网页
  • allinurl: inurl的排他指令
  • inanchor: 在网页的链接锚中查找

  • 例如:link:www.newhua.com 表示所有指向“华军软件园”外部链接。

  • 例如:related:www.newhua.com 表示找和“华军软件园”类似的网页。
cache: 网页快照(略)

  • 查看网站的 Google 缓存版本,会直接显示缓存页面
  • cache:weibo.com 查看微博的谷歌快照
daterange 查找特定时间网页

  • 例如:”Spice Girls“ daterange:2450958-2450968。这里时间日期的格式是按天文学的儒略日
  • 儒略日数(Julian Day Number,JDN)的计算是从格林威治标准时间的中午开始,包含一个整天的时间,起点的时间(0日)回溯至儒略历的公元前4713年1月1日中午12点(在格里历是公元前4714年11月24日),这个日期是三种多年周期的共同起点,且是历史上最接近现代的一个起点。例如,2000年1月1日的UT12:00是儒略日2,451,545。
  • 世界时UT即格林尼治平太阳时间,是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式。以地球自转为基础的时间计量系统。
  • 格林尼治(Greenwich),是英国伦敦的一个区,位于伦敦东南、泰晤士河南岸
.. 表示数值范围

  • 例如:数码相机 600..900 万像素 3000..4000 元
  • 注意:“900”与“万”之间必须有空格。
@

  • 在用于搜索社交媒体的字词前加上@ trump @twitter 搜索trump的twitter
$

  • 在数字前加上$搜索特定价格 camera $400 搜索400$的camera
#

  • 搜索 # 标签 #throwbackthursday
  • 搜索标签throwbackthursday
info

  • 在网址前加info:,获取网站详情 info:github.com 搜索github网站详情
intext

  • 搜索查询词出现在页面正文(title)中的页面,支持中文和英文 SEO intext:搜索引擎 在正文包含【搜索引擎】的网页中搜索【SEO】
allintext

  • 即all+inanchor 页面正文包含多个关键词的页面 allintext:SEO 搜索引擎优化 相当于:intext:SEO intext:搜索引擎优化
inanchor

  • 搜索链接锚文字(即链接显示的文字)中包含搜索词的页面 inanchor:前端 搜索链接锚文字中包含【前端】的页面
allinanchor

  • 即all+inanchor 页面链接锚文字包含多个关键词的页面	allinanchor:SEO 搜索引擎优化	相当于:inanchor:SEO inanchor:搜索引擎优化
    
weather

  • weather/time/sunrise/sundown+城市名,返回城市的天气/时间/日出时间/日落时间
  • weather:beijing 显示北京的天气
music

  • music或者用songs,歌手名字+music/songs 周杰伦 music 返回周杰伦的各首歌曲

二进制

0b00000001

八进制

0o001(python)

十六进制

0xFE

原码

将数字表述为二进制数,方便人看

反码

1
2
正数与原码相同
负数符号位不变,其余位取反

补码

1
2
3
正数与原码相同
反码符号位不变其余位取反加一
补码的补码是原码

浮点数存储方式

算术运算

比较运算符

逻辑运算

  • &&
  • ||

位运算

  • &
  • |
  • ~
  • ^
  • >>
  • <<
0%