基础篇 Docker 常用命令
内容概述
# 1. 镜像和容器的关系
- 镜像(Image):容器的静态模板,包含了应用程序运行所需的所有依赖和文件。镜像是不可变的。
- 容器(Container):镜像的一个运行实例,具有自己的文件系统、进程、网络等,且是动态的。容器从镜像启动,并在运行时保持可变。
- 说明:一定是有了镜像才可以创建容器。

# 2. Docker 常用命令
# 2.1 辅助命令
Dokcer 安装完成后的辅助命令。
docker version # 显示版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 万能命令,查看命令参数等
1
2
3
2
3
# 2.2 Images 镜像命令
# images
查询镜像信息。
$ docker images
1
选项:
-a, --all列出所有镜像-q, --quiet只显示镜像的ID-aq列出所有镜像ID
[root@iByteHorizon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3 kB
# 解释
REPOSITORY # 镜像的仓库
TAG # 镜像的标签
IMAGE ID # 镜像的ID
CREATED # 镜像的创建时间
SIZE # 镜像的大小
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# search
搜索镜像。
$ docker search [options] 镜像名
1
选项:
-f, --filter后跟条件,筛选镜像--no-trunc显示完整的镜像信息
[root@iByteHorizon ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 10516 [OK]
mariadb MariaDB is a community-developed fork of M... 3927 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea... 772 [OK]
# 可选项,过滤参数
--filter=STARS=3000 # 搜索出来的镜像就是STARS大于等于3000
# docker search mysql --filter=STARS=3000
[root@iByteHorizon ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 10516 [OK]
mariadb MariaDB is a community-developed fork of M... 3927 [OK]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# pull
下载镜像。分层下载:是docker image 的核心,联合文件系统。
$ docker pull 镜像名[:TAG|@DIGEST]
1
[root@iByteHorizon ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest,最新版本
latest: Pulling from library/mysql
a076a628af6f: Pull complete # 分层下载,docker image 的核心,联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c # 文件签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 下面两个命令等价
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@iByteHorizon ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
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
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
# rmi
$ docker rmi 镜像名1|镜像ID1 镜像名2|镜像ID2
1
选项:
-f, --force强制删除
删除全部镜像
$ docker rmi -f $(docker images -aq)
1
# 2.3 Contrainer 容器命令
这里我们下载一个centos 镜像来演示。
$ docker pull centos
1
# 2.3.1 新建&启动容器
$ docker run [options] 镜像名|者镜像ID
1
选项:
--name="Contrainer Name",别名为容器起一个名字-d启动守护式容器(在后台启动容器)-P随机指定端口(大写的P)-p指定容器的端口,有以下四种方式:
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
1
2
3
4
2
3
4
# 启动并进入容器
[root@iByteHorizon ~]# docker run -it centos /bin/bash
[root@c37f7c157d64 /]# ls # 查看容器内的centos,基础版本。很多命令都是不完善的!
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退回主机
[root@c37f7c157d64 /]# exit
exit
# 主机目录信息
[root@iByteHorizon /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
docker run -d 常见坑:
[root@iByteHorizon /]# docker run -d centos
ccbf705a03d2001aa6383b29ee3e3922cdeb15c9e4f3085c8e82d23f0fc7b902 # 运行的容器ID
# 执行docker ps , 发现是空的,意味着centos 停止了?
# 执行docker ps -a ,发现历史执行容器存在。
# 常见的坑:docker 容器使用后台运行,就必须要一个前台进程(docker run -d -it centos),docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
1
2
3
4
5
6
7
2
3
4
5
6
7
docker run -d容器使用后台运行,就必须要求至少有一个前台进程,docker发现没有应用,就会自动停止。
# 2.3.2 查看运行的容器
$ docker ps [options]
1
选项:
- 默认,列出当前正在运行的容器
-a列所所有容器,包括正在运行的和历史运行过的容器-q静默模式,只显示容器编号-n=显示最近创建的容器个数
[root@iByteHorizon /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iByteHorizon /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c37f7c157d64 centos "/bin/bash" 6 minutes ago Exited (127) 3 minutes ago silly_einstein
5a3c661b39a2 bf756fb1ae65 "/hello" 11 days ago Exited (0) 11 days ago tender_ramanujan
[root@iByteHorizon /]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c37f7c157d64 centos "/bin/bash" 9 minutes ago Exited (127) 6 minutes ago silly_einstein
[root@iByteHorizon /]# docker ps -aq
c37f7c157d64
5a3c661b39a2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.3.3 停止|关闭|重启容器
启动容器
$ docker start 容器ID|容器名
1
重启容器
$ docker restart 容器ID|容器名
1
正常停止容器运行
$ docker stop 容器ID|容器名
1
强制立即停止容器运行
$ docker kill 容器ID|容器名
1
# 2.3.4 删除容器
$ dockr rm [options] 容器ID1|容器名1 容器ID2|容器名2
1
选项:
-f强制删除
删除所有容器
# 方式一:
$ docker rm -f $(docker ps -aq)
# 方式二:
$ docker ps -a -q|xargs docker rm
1
2
3
4
5
2
3
4
5
# 2.3.5 进入容器内部
注意:我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置。
方式一:docker exec 选项:
-i以交互模式运行容器,通常与-t一起使用-t分配一个伪终端 shell窗口 bash
$ docker exec [options] 容器ID 容器内命令
1
容器内命令,通常是/bin/bash。
# 测试
[root@iByteHorizon /]# docker exec -it b3a2e4ab538a /bin/bash
[root@b3a2e4ab538a /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@b3a2e4ab538a /]# ll
bash: ll: command not found
[root@b3a2e4ab538a /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@b3a2e4ab538a /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:52 ? 00:00:08 /bin/sh -c while true;do echo lili;sleep 1;done
root 8639 0 0 06:17 ? 00:00:00 /bin/bash
root 8663 1 0 06:17 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/slee
root 8664 8639 0 06:17 ? 00:00:00 ps -ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
方式二:docker attach
$ docker attach 容器ID
1
示例:
[root@iByteHorizon /]# docker attach b3a2e4ab538a
正在执行当前的代码……
1
2
2
二者区别:
docker exec:进入容器后开启一个新的终端,可以在里面操作(常用)docker attach:进入容器正在执行的终端,不会启动新的进程
# 2.3.6 退出容器
exit # 停止容器并退出
ctrl + P + Q # 不停止容器退出,按键操作
1
2
2
# 2.3.7 查看容器日志
$ docker logs [OPTIONS] 容器ID|容器名
1
选项:
-t加入时间戳-f实时日志信息,跟随最新的日志打印--tail跟数字,显示最后多少条
[root@iByteHorizon /]# docker logs -f -t --tail 10 f495ce1b2121
1
# 2.3.7 查看容器内进程
$ docker top 容器ID|者容器名
1
[root@iByteHorizon /]# docker top b3a2e4ab538a
UID PID PPID C STIME TTY root 2351 2335 0 11:08 ? root 2829 2351 0 11:15 ?
1
2
2
# 2.3.8 查看容器元数据(内部细节)
# 命令
$ docker inspect 容器ID
1
2
2
[root@iByteHorizon /]# docker inspect b3a2e4ab538a
[
{
"Id": "b3a2e4ab538a36074049d84895517a0bae0579c8e3d4fd56dd0000c802efe012",
"Created": "2021-02-19T03:08:58.020462438Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo lili;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2351,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-02-19T03:08:58.165246495Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/b3a2e4ab538a36074049d84895517a0bae0579c8e3d4fd56dd0000c802efe012/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/b3a2e4ab538a36074049d84895517a0bae0579c8e3d4fd56dd0000c802efe012/hostname",
"HostsPath": "/var/lib/docker/containers/b3a2e4ab538a36074049d84895517a0bae0579c8e3d4fd56dd0000c802efe012/hosts",
"LogPath": "/var/lib/docker/containers/b3a2e4ab538a36074049d84895517a0bae0579c8e3d4fd56dd0000c802efe012/b3a2e4ab538a36074049d84895517a0bae0579c8e3d4fd56dd0000c802efe012-json.log",
"Name": "/sad_bohr",
"RestartCount": 0,
"Driver": "overlay",
"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,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "",
"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": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Name": "overlay",
"Data": {
"LowerDir": "/var/lib/docker/overlay/f3bb80dbf80cb93ac9b51de4ee166bff8b55330c7bbd8df0309f94d8c118f061/root",
"MergedDir": "/var/lib/docker/overlay/7859fd7741ce0be5ab7711a685dd9a318a228335bd3c4da8df92b102c49a3002/merged",
"UpperDir": "/var/lib/docker/overlay/7859fd7741ce0be5ab7711a685dd9a318a228335bd3c4da8df92b102c49a3002/upper",
"WorkDir": "/var/lib/docker/overlay/7859fd7741ce0be5ab7711a685dd9a318a228335bd3c4da8df92b102c49a3002/work"
}
},
"Mounts": [],
"Config": {
"Hostname": "b3a2e4ab538a",
"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 lili;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": "92e6f130871c214562843eb5eaf6127fdb01f02d7231898262cf051630f6b1dc",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/92e6f130871c",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "6f4b840458b23d441b197a8ea3f9a50d4b2e6c288021b9c58897905ea4f7f37c",
"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": "3ebae6082efa1a71f8f632884cfae8eb87005d1acddc542424c5a58381d0073c",
"EndpointID": "6f4b840458b23d441b197a8ea3f9a50d4b2e6c288021b9c58897905ea4f7f37c",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
}
]
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
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
# 2.3.9 容器和宿主机之间复制文件
- 将宿主机复制到容器内部
$ docker cp 文件|目录 容器ID:容器路径
1
- 将容器内资源拷贝到主机上
$ docker cp 容器ID:容器内资源路径 宿主机目录路径
1
# 查看当前主机目录下
[root@iByteHorizon home]# ll
total 4
-rw-r--r-- 1 root root 0 Feb 19 14:30 lili.java
drwxr-xr-x. 11 postgres postgres 4096 Aug 18 2020 postgres
# 进入docker容器内部
[root@iByteHorizon home]# docker attach 0982bb137d24
[root@0982bb137d24 /]# cd /home
[root@0982bb137d24 home]# ls
# 在容器内新建一个文件
[root@0982bb137d24 home]# touch test.java
[root@0982bb137d24 home]# exit
exit
# 将文件拷贝出来到主机上
[root@iByteHorizon home]# docker cp 0982bb137d24:/home/test.java /home
[root@iByteHorizon home]# ll
total 4
-rw-r--r-- 1 root root 0 Feb 19 14:30 lili.java
drwxr-xr-x. 11 postgres postgres 4096 Aug 18 2020 postgres
-rw-r--r-- 1 root root 0 Feb 19 14:31 test.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS:拷贝是一个手动过程,未来使用 -v 卷的技术,可以实现
# 2.3.10 数据卷(volum)实现与宿主机共享目录
$ docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
1
注意:
- 如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
- 如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中
# 2.3.11 打包镜像
$ docker save 镜像名 -o 名称.tar
1
# 2.3.12 载入镜像
$ docker load -i 名称.tar
1
# 2.3.13 容器打包成新的镜像
$ docker commit -m "描述信息" -a "作者信息" 容器ID|容器名 打包镜像名称:[tag]
1
# 2.4 所有命令合集

attach attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build build an image from a dockerfile # 通过dockerfile定制镜像
commit create a new image from a container changes # 提交当前容器为新的镜像
cp copy files/folders from the container filesystem to the host path # 从容器中拷贝文件或目录到宿主机上
create create a new container # 创建一个新的容器,同 run ,但不启动容器
diff inspect changes on container's filesystem # 查看docker容器变化
events get real time events from the server # 从docker 服务获取容器实时事件
exec run a command in an existing container # 在已存在的容器上运行命令
export stream the contents of a container as a tar archive # 导出容器的内容流作为一个tar 归档文件[对应import]
history show the history of an image # 展示一个镜像的形成历史
images list images # 列出系统当前镜像
import create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info display system-wide information # 显示系统相关信息
inspect return low-level information on a container # 查看容器详细信息
kill kill a running container # kill 指定的docker容器
load load an image from a tar archive # 从一个tar 包中加载一个镜像[对应save]
login register or login to the docker registry server # 注册或登录一个docker 源服务器
logout log out from a docker registry server # 从当前docker registry 退出
logs fetch the logs of a container # 输出当前容器日志信息
port lookup the public-facing port which is nat-ed to private_port # 查看映射端口对应的容器内部源端口
pause pause all processes within a container # 暂停容器
ps list container # 列出容器列表
pull pull an image or a repository from the docker registry server # 从docker 镜像源服务器拉取指定镜像或者库镜像
push push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart restart a running container # 重启运行的容器
rm remove one or more containers # 移除一个或多个容器
rmi remover one or more images # 移除一个或多个镜像[无容器使用镜像才可删,否则删除相关容器才可继续或 -f 强制删除]
run run a command in a new container # 创建一个新的容器并运行一个命令
save save an image to a tar archive # 保存一个镜像为一个tar 包[对应load]
search search for an image on the docker hub # 在docker hub 中搜索镜像
start start a stopped containers # 启动容器
stop stop a running containers # 停止容器
tag tag an image into a repository # 给源中镜像打标签
top lookup the running processes of a container # 查看容器中运行的进程信息
unpause unpause a paused container # 取消暂停容器
version show the docker version information # 查看docker 版本号
wait block until a container stops,then print its exit code #截取容器停止时退出状态值
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
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
# 3. 实操案例
# 3.1 docker 安装nginx
# 回忆下上面所学的命令,思考出操作的步骤:
# 1、搜索镜像 search 建议去docker hub 搜索,可以看到官方文档
# 2、下载镜像 pull
# 3、运行测试
# docker run -d --name nginx01 -p 3344:80 nginx
# curl localhost:port
# 进入容器
[root@iByteHorizon ~]# docker exec -it nginx01 /bin/bash
root@ee6010e85c44:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
端口暴露的概念 
思考问题:我们每次改动nginx配置,都需要进入容器内部,十分的麻烦,可以在容器外部提供一个映射路径,达到在容器外修改文件,容器内部就可以达到自动修改? ==-v 数据卷==
# 3.2 docker 安装Tomcat
# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止例了容器后,容器还是可以查到 docker run -it --rm 一般用来测试,用完就删除
# 下载启动
docker pull tomcat
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 测试访问没有问题
[root@iByteHorizon ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
e857ea835fa2c372917f4f9b9de3693edbe25018f0242c53a38a9bf0c6d79b6e
[root@iByteHorizon ~]# docker exec -it tomcat01 /bin/bash
# 发现问题:
# 1、Linux命令少了
# 2、没有webapps 阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉,以保证最小可运行环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3.3 docker 部署es + kibana
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录 挂载
# --net somenetwork 网络配置
# 启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 启动了 linux就卡住了 docker stats查看CPU的状态
# 测试一下es 是否成功了
[root@iByteHorizon ~]# curl localhost:9200
{
"name" : "df334c9d81cb",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "g4KTz7ZLRnulHjorSelphg",
"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"
}
# es 是十分耗内存的 1核2G
# 查看docker stats
[root@iByteHorizon ~]# docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
df334c9d81cb 1.59% 1.243 GiB / 1.954 GiB 63.64% 1.66 kB / 2.01 kB 9.44 MB / 1.77 MB 46
# 赶紧关闭,增加内存的限制,修改配置文件 -e 环境配置修改
docker stop 容器id
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
[root@iByteHorizon ~]# docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ba42158ccf60 1.48% 354.3 MiB / 1.954 GiB 17.71% 1.17 kB / 1.59 kB 15.8 MB / 1.76 MB 45
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
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
思考:使用kibana 连接es?网络如何才能连接过去---Docker 网络有关
# 4. Docker可视化工具-Portainer
Docker 可视化工具一般有以下两种。
- Portainer(了解即可)
- Rancher(CI/CD推荐)
Portainer 可视化面板平时不会使用,一般自己测试玩玩即可,这里简单介绍下用法。
Rancher 一般CI/CD的时候用的多,相对来说要复杂的多,需要有Devops 基础才能用。
# 4.1 安装Portainer
官方安装说明:https://www.portainer.io/installation/ (opens new window)
Portainer 是Docker 图形化界面管理工具,提供一个后台面板供我们操作。
# step 1:下载镜像
$ docker pull portainer/portainer
# step 2:创建Portainer 数据卷
$ docker volume create portainer_data
# step 3:安装并配置外网端口
$ docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --privileged=true portainer/portainer
1
2
3
4
5
6
2
3
4
5
6
# 4.2 登录和使用Portainer
用浏览器访问:
http://localhost:9000

# 5. Docker可视化工具-Rancher
(略)
最近更新: 2025/03/25, 09:15:48
