docker

Docker 简介

Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 中的名词概念

  • 镜像 Image:镜像就是一个模板,docker通过这个模板创建多个容器提供相应的服务。
  • 容器 Container:容器可以理解成一个简易的Linux系统。docker利用容器技术可以独立运行一个或者一组应用,容器之间相互隔离互不影响。
  • 仓库 Repository:仓库是用来存放镜像的地方。

Hello World

以下默认Docker已安装并配置完成

Docker安装成功后,运行 docker run hello-world

image-20220819160913762

显示**Hello from Docker!**表示Docker已经安装成功并正确运行!

Run流程及Docker原理

Run 流程

  • 1、在本地寻找镜像
  • 2、若本地存在镜像,则直接加载运行镜像;若本地无镜像,则向远程仓库拉取镜像到本地运行。

Docker 原理

Docker是一个 Client-Server结构的系统,通过守护进程运行在宿主机上,通过Socket从客户端访问。

DockerServer 接收到 DockerClient的指令就会执行这个命令。

Docker为什么比虚拟机快?

  • Docker有比虚拟机更少的抽象层

    认识Docker | Kevin's Notes

  • Docker使用的是宿主机的内核,虚拟机需要Guest OS

所以说,新建一个容器的时候,docker不需要像虚拟机一样加载一个操作系统内核。

Docker 常用命令

帮助命令

1
2
3
docker version         #显示docker的版本信息
docker info #显示docker的详细信息
docker 命令 --help # 显示命令用法

镜像命令

docker images 查看所有本地镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\Users\DaneSun> docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 10 months ago 13.3kB

# 解释
REPOSITORY # 镜像的仓库源
TAG # 镜像标签
IMAGE ID # 镜像id
CREATED # 镜像创建时间
SIZE # 镜像大小

#可选项
-a, --all # 列出所有镜像源
-q, --quiet # 只显示镜像id

docker search 搜索镜像

1
2
3
4
5
6
7
C:\Users\DaneSun>docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source... 13038 [OK]
...

# 可选项,通过搜索过滤
--filter=STARTS=3000 # 搜索starts>=3000的镜像

docker pull 拉取镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# docker pull 镜像名[:tag]	(tag默认为latest)
C:\Users\DaneSun>docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
32c1bf40aba1: Pull complete # 分层下载,docker image 的核心 联合文件系统
3ac22f3a638d: Pull complete
b1e7273ed05e: Pull complete
20be45a0c6ab: Pull complete
410a229693ff: Pull complete
1ce71e3a9b88: Pull complete
c93c823af05b: Pull complete
c6752c4d09c7: Pull complete
d7f2cfe3efcb: Pull complete
916f32cb0394: Pull complete
0d62a5f9a14f: Pull complete
Digest: sha256:ce2ae3bd3e9f001435c4671cf073d1d5ae55d138b16927268474fc54ba09ed79 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址

docker rmi 删除镜像

1
2
3
docker rmi -f 容器id					# 删除指定容器的id
docker rmi -f 容器id 容器id 容器id # 删除多个容器id
docker rmi -f $(docker images -aq) # 删除全部容器

容器命令

有了镜像才可以创建容器,下载一个centos镜像来测试学习

1
docker pull centos

新建容器并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run [可选参数] images

# 参数说明
--name="Name" 容器名,用来区分容器
-d 后台方式运行
-it 交互方式运行
-p 指定端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口

-P 随机指定端口

# 测试,启动进入centos容器
C:\Users\DaneSun>docker run -it centos /bin/bash
[root@5737fb70ddd4 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

列出所有正在运行的容器

1
2
3
4
# docker ps
-a #列出正在运行的容器+历史运行过得容器
-n=? #显示最近创建的容器
-q #只显示容器编号

退出容器

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

删除容器

1
2
docker rm 容器id					# 删除指定容器,不能删除正在运行的容器 -f强制
docker rm -f $(docker ps -aq) # 强制删除所有运行过的容器

启动和停止容器

1
2
3
4
docker start 容器id		# 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id # 强制停止容器

常用其他命令

后台启动容器

1
2
3
4
docker run -d centos

# 问题:ps 发现centos停止
# docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

1
2
3
4
5
6
7
8
9
docker logs -f -t --tail 容器id

# 编写shell脚本
"while true;do echo hello;sleep 1;done"

# 参数说明
-t #带时间戳显示
-f #滚动显示
--tail number #显示条数

查看容器中进程信息

1
docker top 容器id

查看镜像元数据

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
210
docker inspect 容器id

C:\Users\DaneSun>docker inspect 04d24326f250
[
{
"Id": "04d24326f250bfb41ee59f89246eadd4ca8ebf9b6c32cb8c2db8a92125768540",
"Created": "2022-08-20T11:09:51.0341612Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello;sheep 1;done;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 7179,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-08-21T01:17:34.0320318Z",
"FinishedAt": "2022-08-20T11:24:10.0829421Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/04d24326f250bfb41ee59f89246eadd4ca8ebf9b6c32cb8c2db8a92125768540/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/04d24326f250bfb41ee59f89246eadd4ca8ebf9b6c32cb8c2db8a92125768540/hostname",
"HostsPath": "/var/lib/docker/containers/04d24326f250bfb41ee59f89246eadd4ca8ebf9b6c32cb8c2db8a92125768540/hosts",
"LogPath": "/var/lib/docker/containers/04d24326f250bfb41ee59f89246eadd4ca8ebf9b6c32cb8c2db8a92125768540/04d24326f250bfb41ee59f89246eadd4ca8ebf9b6c32cb8c2db8a92125768540-json.log",
"Name": "/jolly_williamson",
"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": [
42,
156
],
"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/330c0b25223aa657152f969090f245c12f3ce09f984c32285d4fab42d5a640b6-init/diff:/var/lib/docker/overlay2/f2973a21455e72bb98ab5a6fceece5092844baa19d817389886e7399b4eef285/diff",
"MergedDir": "/var/lib/docker/overlay2/330c0b25223aa657152f969090f245c12f3ce09f984c32285d4fab42d5a640b6/merged",
"UpperDir": "/var/lib/docker/overlay2/330c0b25223aa657152f969090f245c12f3ce09f984c32285d4fab42d5a640b6/diff",
"WorkDir": "/var/lib/docker/overlay2/330c0b25223aa657152f969090f245c12f3ce09f984c32285d4fab42d5a640b6/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "04d24326f250",
"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 hello;sheep 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": "2524ac96a31e69cfcc1dc0b7b3060f08264f0d88c7d58eb05067e37aa6bb525b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/2524ac96a31e",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "29865cd32352bb631dbefd016d66516067ce39d995f969f19f5eb995277bf023",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ee41b9926cf9dca8a882df69e63a4d7fc455497d49ab64cf1a79454cb8b9ff70",
"EndpointID": "29865cd32352bb631dbefd016d66516067ce39d995f969f19f5eb995277bf023",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]

进入正在运行的容器

1
2
3
4
5
6
7
# 容器运行时,需要进入容器修改当前配置

# 方式一,进入容器新开终端
docker exec -it 容器id bashShell

# 方式二,进入容器正在运行任务的终端
docker attch 容器id bashShell

从容器文件拷贝到主机上

1
2
3
docker cp 容器id:容器内路径 目的主机路径

# 拷贝是一个手动过程,可以通过卷技术实现自动同步

更新日志:

  • 2022.08.20 Docker基本概念、原理
  • 2022.08.22 Docker基本常用命令