Docker的常用命令

Docker的常用命令

帮助命令

1
2
3
docker version        ## 显示 docker 的版本信息
docker info ## 显示 docker 的系统信息,包括镜像和容器的数量
docker 命令 --help ## 帮助命令

帮助文档的地址:https://docs.docker.com/engine/reference/commandline/attach/

镜像命令

docker images 查看所有本地的主机上的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@chenb ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 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
8
9
10
11
12
13
14
15
[root@chenb ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10984 [OK]
mariadb MariaDB Server is a high performing open sou… 4152 [OK]

## 可选项
-f, --filter filter 条件查询镜像

--filter=STARS=300 ## 搜索出来的镜像就是STARS大于3000的
[root@chenb ~]# docker search mysql --filter=STARS=300
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10984 [OK]
mariadb MariaDB Server is a high performing open sou… 4152 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 814 [OK]
percona Percona Server is a fork of the MySQL relati… 541 [OK]

docker pull 下载镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 下载镜像 docker pull [镜像名称]:[标签tag]
[root@chenb ~]# docker pull mysql
Using default tag: latest ## 如果不写tag 默认就是latest
latest: Pulling from library/mysql
69692152171a: Already exists ## 分层下载,docker images的核心 联合文件系统
1651b0be3df3: Already exists
951da7386bc8: Already exists
0f86c95aa242: Already exists
37ba2d8bd4fe: Already exists
6d278bb05e94: Already exists
497efbd93a3e: Already exists
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969 ## 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest ## 真实地址

## docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

docker rmi 删除镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 删除指定的镜像
docker rmi -f [镜像名称或者镜像id] ## 这两个都是唯一的

## 删除多个的镜像
docker rmi -f [镜像名称或者镜像id] [镜像名称或者镜像id] [镜像名称或者镜像id]

## 删除全部的镜像
docker rmi -f ${docker image -aq}
## 解释
docker images是查询所有的镜像,显示完成的镜像信息
docker images -aq 是查询所有的镜像,只展示镜像的id
$()这个语法相当于传参,将docker images -aq查到的所有的镜像id传递进去,进而实现删除全部的镜像


## 可选项
-f, --force ## 强制删除镜像

容器命令

说明:有了镜像才可以创建容器

1
2
## 下载一个centos镜像
docker pull centos

新建容器并启动

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

## 参数说明
--name ## 容器名称 --name chenbin
-d ## 后台方式运行
-it ## 使用交互方式运行 ,运行后进入容器查看内容
-p(小写) ## 指定容器的端口,-p 8081:3306 将容器3306端口映射到宿主机8081端口
-p 主机名称:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P(大写) ## 随机指定端口

## 测试,启动并进入容器
[root@chenb ~]# docker run -it centos /bin/bash
[root@4b656c7fba77 /]# ls ## 查看容器内的centos,是简化版的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

## 从容器退回到主机
[root@4b656c7fba77 /]# exit
exit

列出所有的正在运行的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## docker ps 命令
空参数 ## 列出当前正在运行的容器
-a ## 列出当前正在运行的容器+带出历史运行过的容器
-n=? ## 显示最近创建的容器,这里可以显示个数 docker ps -n=2
-q ## 只展示容器的编号

## 列出最近一个创建的容器
[root@chenb ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3403a72d2e6a hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago nice_cerf

## 列数当前正在运行的容器
[root@chenb ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b656c7fba77 centos "/bin/bash" 7 minutes ago Up 7 seconds youthful_euler

## 列出当前正在运行的容器以及历史运行的容器
[root@chenb ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3403a72d2e6a hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago nice_cerf
4b656c7fba77 centos "/bin/bash" 7 minutes ago Up 22 seconds youthful_euler
b54010196e40 hello-world "/hello" 4 hours ago Exited (0) 4 hours ago amazing_davinci

退出容器

1
2
3
4
5
6
7
8
9
exit		## 直接容器停止并退出
Ctrl + P + Q ## 容器不停止退出

## 容器不停止退出
[root@chenb ~]# docker run -it centos
[root@f4fd17de8912 /]# [root@chenb ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4fd17de8912 centos "/bin/bash" 13 seconds ago Up 11 seconds eloquent_lamport
[root@chenb ~]#

删除容器

1
2
3
4
5
6
7
docker rm 容器id		## 删除指定的容器,不能删除正在运行的容器
## 参数
-f ## 强制删除容器,包括正在运行的容器
docker rm -f $(docker ps -aq) ## 删除所有的容器

## 了解一下其他的删除方式
docker ps -a -q|xargs docker rm

启动停止容器的操作

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

常用其他命令

后台启动容器

1
2
3
4
5
6
7
## docker run -d 镜像名
[root@chenb ~]# docker run -d centos
003e8a9edeb02c21a90e4095a43afb24739f2ddc7e02922c471f9219e6b9baee

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

查看日志命令

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
docker logs -f -t --tail 10 容器id

## 自己编写一段shell脚本
[root@chenb ~]# docker run -d centos /bin/bash -c "while true;do echo chenbin;sleep 1;done"

[root@chenb ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52abb4c0947e centos "/bin/bash -c 'while…" 11 seconds ago Up 11 seconds reverent_lamarr

## 显示日志
docker logs 容器id
## 参数
-f ## 显示详细的日志
-t ## 显示日志的时间戳
--tail 10 ## 显示十条日志
[root@chenb ~]# docker logs -f -t --tail 10 52abb4c0947e
2021-06-11T06:31:42.521532252Z chenbin
2021-06-11T06:31:43.523082239Z chenbin
2021-06-11T06:31:44.524774755Z chenbin
2021-06-11T06:31:45.526522304Z chenbin
2021-06-11T06:31:46.528119791Z chenbin
2021-06-11T06:31:47.529695288Z chenbin
2021-06-11T06:31:48.531427200Z chenbin
2021-06-11T06:31:49.533102391Z chenbin
2021-06-11T06:31:50.534717881Z chenbin
2021-06-11T06:31:51.536358743Z chenbin
2021-06-11T06:31:52.537925851Z chenbin
2021-06-11T06:31:53.539512280Z chenbin
2021-06-11T06:31:54.541127933Z chenbin

查看容器中的进程信息

1
2
3
4
5
## 命令 docker top 容器id
[root@chenb ~]# docker top 52abb4c0947e
UID PID PPID C STIME
root 19636 19599 0 14:31
root 19907 19636 0 14:34

查看容器的源数据

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

## 测试
[
{
"Id": "52abb4c0947e7df62caf67cd377bd598cb1e2b79b24b801c4188a7501690e597", ## 容器id
"Created": "2021-06-11T06:31:17.119837632Z", ## 创建时间
"Path": "/bin/bash", ## 终端地址
"Args": [ ## 运行时传递的参数
"-c",
"while true;do echo chenbin;sleep 1;done"
],
"State": { ## 容器状态信息
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 19636,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-06-11T06:31:17.483463392Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",## 镜像信息
"ResolvConfPath": "/var/lib/docker/containers/52abb4c0947e7df62caf67cd377bd598cb1e2b79b24b801c4188a7501690e597/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/52abb4c0947e7df62caf67cd377bd598cb1e2b79b24b801c4188a7501690e597/hostname",
"HostsPath": "/var/lib/docker/containers/52abb4c0947e7df62caf67cd377bd598cb1e2b79b24b801c4188a7501690e597/hosts",
"LogPath": "/var/lib/docker/containers/52abb4c0947e7df62caf67cd377bd598cb1e2b79b24b801c4188a7501690e597/52abb4c0947e7df62caf67cd377bd598cb1e2b79b24b801c4188a7501690e597-json.log",
"Name": "/reverent_lamarr",
"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/418744a41d65acd1a8eabf639c617e592f5b78442ed05fc28f5e2b1f20a1e9f5-init/diff:/var/lib/docker/overlay2/0472de804879fcd4ebbd5ede25af3e8fb7de6ae80948a07189c55f8662d9030b/diff",
"MergedDir": "/var/lib/docker/overlay2/418744a41d65acd1a8eabf639c617e592f5b78442ed05fc28f5e2b1f20a1e9f5/merged",
"UpperDir": "/var/lib/docker/overlay2/418744a41d65acd1a8eabf639c617e592f5b78442ed05fc28f5e2b1f20a1e9f5/diff",
"WorkDir": "/var/lib/docker/overlay2/418744a41d65acd1a8eabf639c617e592f5b78442ed05fc28f5e2b1f20a1e9f5/work"
},
"Name": "overlay2"
},
"Mounts": [],## 挂载数据卷信息
"Config": {
"Hostname": "52abb4c0947e",
"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/bash",
"-c",
"while true;do echo chenbin;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20201204",
"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": "4532d51d3e6ac5246ac71192e440855ac75893564bceefe97951e47c6af38298",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/4532d51d3e6a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "9cf41f6ba32bf5f5734746bf1cfaed8b39b52590ebd0dc5664df7ab7b59985ac",
"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": "342cc6f51acd9695558474aed8c1afd4e1dd758a17d42066939d8ed591a9ba55",
"EndpointID": "9cf41f6ba32bf5f5734746bf1cfaed8b39b52590ebd0dc5664df7ab7b59985ac",
"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
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## 我们通常容器都是使用后台运行的,需要进入容器,修改一些配置

## 命令
docker exec -it 容器id /bin/bash

## 测试
[root@chenb ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52abb4c0947e centos "/bin/bash -c 'while…" 10 minutes ago Up 10 minutes reverent_lamarr
[root@chenb ~]# docker exec -it 52abb4c0947e /bin/bash
[root@52abb4c0947e /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@52abb4c0947e /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:31 ? 00:00:00 /bin/bash -c while true;do echo chenbin;sleep 1;done
root 630 0 0 06:41 pts/0 00:00:00 /bin/bash
root 654 1 0 06:41 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 655 630 0 06:41 pts/0 00:00:00 ps -ef

## 方式二
docker attach 容器id
## 测试
[root@chenb ~]# docker attach 52abb4c0947e



## 两种进入容器内方式的区别
## docker exec ## 进入容器后开启一个新的终端,可以在里面操作(常用)
## docker attach ## 进入容器正在执行的终端,不会启动新的终端

从容器内拷贝文件到主机上

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
## 命令
docker cp 容器id:容器内路径 目的主机路径

## 测试

## 运行容器
[root@chenb home]# docker run -d -it centos /bin/bash
90a79ffae478ea39a9a1dbc64b77336e247c494e602eb8c8a4ae238ef6d38643

## 查看容器id
[root@chenb home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90a79ffae478 centos "/bin/bash" 18 seconds ago Up 18 seconds ecstatic_ganguly

## 直接进入容器正在运行的终端
[root@chenb home]# docker attach 90a79ffae478

## 进入容器内路径,穿件chen.java文件
[root@90a79ffae478 /]# cd /home
[root@90a79ffae478 home]# touch chen.java

## 退出容器
[root@90a79ffae478 home]# exit
exit

## 拷贝chen.java到主机的/home目录下
[root@chenb home]# docker cp 90a79ffae478:/home/chen.java /home

## 查看/home下文件,拷贝成功
[root@chenb home]# ls
chen.java
[root@chenb home]#

从主机内拷贝文件到容器中

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
## 命令
docker cp 主机路径 目的容器id:容器路径

##测试

[root@chenb home]# docker run -d -it centos /bin/sh
19a6b967298f8ebf415f8f349386d3c12da2666b4da03ec7413b8301b545267c
[root@chenb home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a6b967298f centos "/bin/sh" 4 seconds ago Up 3 seconds nifty_meitner
[root@chenb home]# touch chenb.java
[root@chenb home]# ls
chenb.java chen.java
[root@chenb home]# docker cp chenb.java 19a6b967298f:/home
[root@chenb home]# docker attach 19a6b967298f
sh-4.4# cd /
sh-4.4# pwd
/
sh-4.4# cd /homt
sh: cd: /homt: No such file or directory
sh-4.4# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
sh-4.4# cd /home
sh-4.4# ls
chenb.java

小结

img

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
attach					 ## 当前shell下 attach连接指定运行容器,不会重启开启一个新的终端
build ## 通过Dockerfile定制镜像
commit ## 提交当前容器为新的镜像
cp ## 从容器中拷贝指定文件或者目录到宿主机中
create ## 创建一个新的容器,同run命令,但不启动容器
diff ## 查看docker容器变化
events ## 从docker服务获取容器实时事件
exec ## 在已存在的容器上运行命令
export ## 导出容器的内容作为一个tar归档文件,对应【import】
history ## 展示一个镜像形成历史
images ## 列出当前镜像
import ## 从tar包中的内容创建一个新的文件系统镜像
info ## 展示系统相关信息
inspect ## 查看容器详细信息
kill ## kill指定的docker容器
load ## 从一个tar包中加载一个镜像,对应[save]
login ## 注册或者登录一个docker源服务器
logout ## 从当前Docker registry 退出
logs ## 输出当前容器日志信息
port ## 查看映射端口对应的容器内部源端
pause ## 暂停容器
ps ## 列出容器列表
pull ## 从docker镜像源服务器拉取指定镜像或者库镜像
push ## 推送指定镜像或者库镜像至docker源服务器
restart ## 重启运行的容器
rm ## 移除一个或者多个容器
rmi ## 移除一个或者多个镜像[无容器使用该镜像才可以删除,否则需删除相关容器才可继续 或 -f 强制删除]
run ## 创建一个新的容器并运行一个命令
save ## 保存一个镜像为一个tar包[对应load]
search ## 在docker hub中搜索镜像
start ## 启动容器
stop ## 停止容器
tag ## 给源中镜像打标签
top ## 查看容器中运行的进程信息
unpause ## 取消暂停容器
version ## 查看docker版本号
wait ## 截取容器停止时的退出状态值