【Docker 学习四】常用容器命令详解

说明:我们有了镜像才可以创建容量,linux,下载一个ubuntu或者Centos镜像来测试学习

运行容器docker run

1.通常是在新创建的容器中所使用的命令
2.它适用于在没有其他容器运行的情况下,想要创建一个容器,并且要启动它,然后在其上运行一个进程

用法

docker run命令之后,必须通过指定镜像来创建容器

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用选项

选项【Option】 简称 描述
–name 为容器指定名称,如tomcat01 tomcat02,用来区分容器
–detach -d 后台运行容器,并返回容器ID
–interactive -i 以交互模式运行容器,通常与 -t 同时使用
–tty -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
–publish-all -P 随机端口映射,容器内部端口随机映射到主机的端口
–publish -p 指定端口映射,格式为:主机(宿主)端口:容器端口
–volume -v 绑定一个卷
–env -e 设置环境变量

下载centos镜像

1
docker pull centos

说明:我们有了镜像才可以创建容量,linux,下载一个ubuntu或者Centos镜像来测试学习

新建容器并启动

1
2
3
docker run -it centos /bin/bash
# 进入容器之后出现容器ID c48140547374
# [root@c48140547374 /]#

后面的/bin/bash的作用是表示:载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上自杀了
这个/bin/bash就表示启动容器后启动bash

查看容器内部有啥

1
2
3
[root@c48140547374 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@c48140547374 /]#

从容器中退回主机(宿主)exit

1
2
3
[root@c48140547374 /]# exit
exit
[root@yulium ~]#

无需停止运行容器与退出

1
ctrl + p + q  # 快捷键

后台启动容器

1
2
# 命令 docker run -d 镜像名
docker run -d centos

问题:docker ps,发现centos停止
常见的坑了,docker容器使用后台运行,就必须要有一个前台进程,因为docker当时发现应用程序没有用到的时候,就自动停止
nginx,容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序

运行容器docker exec【常用:随便进入内部操作,随便退出,而且不会关闭容器】

运行的容器中执行命令
这命令适用于在已运行的容器中运行命令的情况
如果您已经拥有了一个正在运行的容器,并希望更改该容器或从中获取某些内容,那么使用docker exec命令就非常合适了

用法

1
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

常用选项

选项【Option】 简称 描述
–detach -d 后跟目录或文件路径,您可以说明要在哪个工作目录中运行命令
–interactive -i 确保了即使没有连接到正在运行的容器,STDIN(标准输入)也会处于打开状态
–tty -t 在容器中启动交互式的 bashshell
–workdir -w 后跟目录或文件路径,您可以说明要在哪个工作目录中运行命令
通常与 -i 同时使用

通常-i-t同时使用,两个参数的作用,为该docker创建一个伪终端,这样就可以进入到容器的交互模式

进入指定容器

1
2
docker exec -it c2887d35c71d /bin/bash
# [root@c2887d35c71d /]#

进入容器正在执行的终端docker attach

这命令适用于在正在执行容器中运行命令的情况
docker exec 区别:

一:进程情况
docker exec 进入容器后开启一个新的终端,可以在里面操作【常用】
docker attach 进入容器正在执行的终端,不会启动新的进程
二:退出容器情况
docker exec 退出容器之后容器还在运行
docker attach 退出容器之后容器停止运行

用法

1
docker attach [OPTIONS] CONTAINER

进入指定容器

1
2
docker attach c2887d35c71d 
# [root@c2887d35c71d /]#

测试这二者区别

docker exec命令进入容器

1
2
docker exec -it c2887d35c71d /bin/bash
# [root@c2887d35c71d /]#

进入容器之后ps -ef命令查看进程情况

1
2
3
4
5
[root@c2887d35c71d /]#
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:22 pts/0 00:00:00 /bin/bash
root 44 0 2 06:22 pts/1 00:00:00 /bin/bash
root 58 44 0 06:23 pts/1 00:00:00 ps -ef

说明用docker exec命令的时候,一般都是开启一个新的终端

docker attach命令进入容器

1
2
docker exec -it c2887d35c71d /bin/bash
# [root@c2887d35c71d /]#

进入容器之后ps -ef命令查看进程情况

1
2
3
4
5
[root@c2887d35c71d /]#
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:22 pts/0 00:00:00 /bin/bash
root 44 0 2 06:22 pts/1 00:00:00 /bin/bash
root 58 44 0 06:23 pts/1 00:00:00 ps -ef

说明用docker exec命令的时候,一般都是开启一个新的终端

列出容器信息 docker ps

用法

1
docker ps [OPTIONS]

常用选项

选项【Option】 简称 描述
–all -a 显示所有容器(包括未运行和正在运行)
–quiet -q 只显示容器 ID
–last -n 显示 n 个上次创建的容器(包括所有状态)
–latest -l 显示最新创建的容器(包括所有状态)
–size -s 显示总文件大小

列出运行状态的容器的标题

参数 描述
CONTAINER ID 容器ID
IMAGE 使用的镜像
COMMAND 启动容器时运行的命令
CREATED 容器的创建时间
STATUS 容器状态
created(已创建),restarting(重启中),running(运行中),removing(迁移中),removing(迁移中),exited(停止),exited(停止)
PORTS 容器的端口信息和使用的连接类型(tcp\udp)
NAMES 自动分配的容器名称

列出正在运行状态的容器docker ps

1
2
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

列出正在运行的容器(包括未运行的状态)docker ps -a

1
2
3
docker ps -a 
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# c48140547374 centos "/bin/bash" 4 minutes ago Exited (0) About a minute ago nifty_darwin

列出所有创建的容器 ID

1
2
docker ps -a -q  # 或者docker ps -aq
# c48140547374

删除容器docker rm

删除一个或多个容器

用法

1
2
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# docker rm 容器ID 容器ID 容器ID...

常用选项

选项【Option】 简称 描述
–force -f 强制删除

删除指定容器ID

1
docker rm c481    # 容器ID:c48140547374,可以简写c481,要写几个都可以

删除所有容器ID

1
docker rm $(docker ps -aq)

启动容器

用法

启动一个或多个已停止的容器

1
2
docker start [OPTIONS] CONTAINER [CONTAINER...]
# docker start 容器ID 容器ID 容器ID 容器ID

例子

1
docker start 容器id

停止容器

用法

停止一个或多个正在运行的容器

1
2
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# docker stop 容器ID 容器ID 容器ID 容器ID

例子

1
docker stop 容器id

重启容器

用法

重新启动一个或多个容器

1
2
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# docker restart 容器ID 容器ID 容器ID 容器ID

例子

1
docker restart 容器id

强制停止容器

用法

杀死(强制停止)一个或多个容器

1
2
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# docker kill 容器ID 容器ID 容器ID 容器ID

例子

1
docker kill 容器id

查看容器使用资源情况

该命令返回正在运行的容器的实时数据流

用法

1
2
docker stats [OPTIONS] [CONTAINER...]
# docker stats 容器ID 容器ID 容器ID 容器ID

列出容器使用的系统资源的标题

参数 描述
CONTAINER ID 容器ID
NAME 使用的镜像(容器名称)
CPU % CPU 的使用情况
MEM USAGE / LIMIT 当前使用的内存和最大可以使用的内存
MEM % 以百分比的形式显示内存使用情况
NET I/O 网络 I/O 数据
BLOCK I/O 磁盘 I/O 数据
PIDS PID 号

该命令用来显示容器使用的系统资源。

不带任何参数选项执行docker stats 命令:

1
2
3
docker stats
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
# 4r48ghr9d74 centos 0.05% 6.8 MiB / 25 GiB 0.02% 0 B / 0 B 1.503 MB / 0 B 109

查看容器进程

显示容器正在运行的进程

用法

1
2
docker top CONTAINER [ps OPTIONS]
# docker top 容器ID

列出所有运行的进程的标题

参数 描述
UID
PID
PPID
C
STIME
TTY
TIME
CMD

列出所有运行的进程

1
2
3
4
#  docker top 容器id
docker top 144af8aed639
# UID PID PPID C STIME TTY TIME CMD
# root 1016094 1016074 0 16:27 pts/0 00:00:00 /bin/bash

如果在一个已经停止的容器上使用 docker top 命令,则会报错

1
2
[root@localhost ~]# docker top e08201b591cd
Error response from daemon: Container e08201b591cdccd198fa32c4eedbda4a9ca6c81ce2c066e885c592aede52a8a6 is not running

查看容器的元数据(镜像详细信息)

使用 inspect 命令查看镜像详细信息,包括制作者、适应架构、各层的数字摘要等
默认情况下,将在 JSON 数组中呈现结果

用法

1
2
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# docker inspect 容器ID

常用选项

选项【Option】 简称 描述
–format -f 使用自定义模板设置输出格式: “json”:以 JSON 格式打印 “模板”
–size -s 如果类型是container,则显示总文件大小
–type 返回指定类型的JSON

查看镜像的详细信息

1
docker inspect 5d0da3dc9764
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
[
{
# 容器的完整id
"Id": "5d0da3dc976427a064137d58282de97b97365dea2705211ebfbad642079cc1b388",

# 创建时间
"Created": "2022-06-17T12:00:50.706906186Z",

# 脚本位置
"Path": "/bin/sh",

# 运行的脚本
"Args": [
"-c",
"while true;do echo shenzai;sleep 1;done"
],
"State": {
"Status": "running", # 状态,正在运行
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1909, # 父进程id
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-06-17T12:00:51.093617477Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},

# 来源镜像
"Image": "sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f",
"ResolvConfPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hostname",
"HostsPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hosts",
"LogPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388-json.log",


"Name": "/dreamy_almeida",
"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,
"Capabilities": null,
"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/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907-init/diff:/var/lib/docker/overlay2/7f79322e0f58d651a84a555dadd83d92537788172525945d3f538dd95dce336c/diff",
"MergedDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/merged",
"UpperDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/diff",
"WorkDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/work"
},
"Name": "overlay2"
},

"Mounts": [], # 挂载

# 基本配置
"Config": {
"Hostname": "cb6d7fbc3f27",
"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"
], # 基本环境变量,这里没有Java

# 基本命令
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo shenzai;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200611",
"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": "4d701985d7e77aa153790b697b2f38a61e20555c224b7675e4bf650b82799882",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/4d701985d7e7",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018",
"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": "22b0fd2290ccbc4e066a75d3f01bd8bf32ee4352c5bbcfc9f911287219219571",
"EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018",
"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
}
}
}
}
]

查看镜像的某一项信息:-f

1
2
docker inspect 5d0da3dc9764 -f {{".DockerVersion"}}
# 20.10.7

拷贝容器docker cp

用于容器与主机(宿主)之间复制文件/文件夹

用法

1
2
3
4
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# docker cp 容器ID:容器内部路径 目的的主机路径
# docker cp 主机路径 目的的容器ID:容器内部路径

从主机往容器中拷贝

举例子:将主机/www/runoob目录拷贝到容器96f7f14e99ab/www目录下。

1
docker cp /www/runoob 96f7f14e99ab:/www

将容器中文件拷往主机

举例子:将容器96f7f14e99ab/www目录拷贝到主机的/tmp目录中

1
docker cp  96f7f14e99ab:/www /tmp

从主机往容器中拷贝,而目录重命名为www

举例子:将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www

1
docker cp /www/runoob 96f7f14e99ab:/www

小结