Docker 常用命令
Yuxuan Wu Lv13

Docker 的常用命令

帮助命令

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

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

镜像命令

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@iz2zeihuhu3ktzymn2ydktz home]# docker images 
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest c8562eaf9d81 2 weeks ago 546MB
centos latest 300e315adb2f 2 months ago 209MB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id

#可选项
Options:
-a, --all (列出所有镜像)Show all images (default hides intermediate images)
-q, --quiet (只显示镜像的id)Only show image IDs

**docker serach **搜索镜像

1
2
3
4
5
6
7
8
9
10
11
12
[root@iz2zeihuhu3ktzymn2ydktz home]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10471 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3894 [OK]

# 可选项
--filter=STARS=3000 # 搜索出来的镜像是STAR>3000的

[root@iz2zeihuhu3ktzymn2ydktz home]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10471 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3894 [OK]

docker pull 下载

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 pull 镜像名[:tag]
[root@iz2zeihuhu3ktzymn2ydktz home]# 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@iz2zeihuhu3ktzymn2ydktz home]# docker pull mysql:5.7
5.7: Pulling from library/mysql

[root@iz2zeihuhu3ktzymn2ydktz home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a70d36bc331a 2 weeks ago 449MB
mysql latest c8562eaf9d81 2 weeks ago 546MB

删除镜像

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

容器命令

说明:我们有了镜像才可以创建容器Linux,下载一个centos来进行学习

1
docker pull centos

新建容器并且启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker run [可选参数] image
#参数说明
--name="Name" #容器名字 tomcat01, tomcat02, 用来区分容器
-d #后台方式进行运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口 -p 8080:8080
-p ip: 主机端口:容器端口
-p 主机端:容器端口(常用)
-p 容器端口
-P #随机指定端口

# 测试,启动,并且进入命令
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -it centos /bin/bash
[root@87d185b2076b /]# ls #查看内部的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

# 从容器中退回主机
[root@203dae537771 /]# exit
exit
[root@iz2zeihuhu3ktzymn2ydktz /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@iz2zeihuhu3ktzymn2ydktz /]#

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

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

退出容器

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

删除容器

1
2
3
docker rm 容器id # 删除指定的容器, 不能删除正在运行的,要删除的rm-f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器

启动和停止容器的操作

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

常用其他命令

后台启动容器

1
2
3
4
5
6
7
#命令 docker run -d 镜像名
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -d centos

#问题docker ps 发现centos停止了

#常见的坑,docker 容器用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立即停止,没有程序了

查看日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker logs -f -t --tail 容器,没有日志

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

[root@iz2zeihuhu3ktzymn2ydktz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c922733df50 centos "/bin/sh -c 'while t…" 42 seconds ago Up 41 seconds goofy_knuth

#显示日志
-tf f是follow指持续输出日志内容;t代表一个时间戳

--tail number # 要显示日志的条数
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker logs -tf --tail 10 0fd350596b56

查看容器中的进程信息

1
2
3
4
5
6
# 命令docker top 容器id
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker top 0fd350596b56
UID PID PPID C STIME TTY TIME CMD
root 13201 13169 0 08:42 ? 00:00:00 /bin/sh -c while true;do echo print;sleep 1;done
root 14630 13201 0 09:04 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像的元数据

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
# 命令
docker inspect 容器id

# 测试
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker inspect 0fd350596b56
[
{
"Id": "0fd350596b565a75cf4a859d777692ef24a4de80305ab6e71152ba1154a6788f",
"Created": "2021-02-08T00:42:27.388342152Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo print;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 13201,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-02-08T00:42:27.823500663Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/0fd350596b565a75cf4a859d777692ef24a4de80305ab6e71152ba1154a6788f/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/0fd350596b565a75cf4a859d777692ef24a4de80305ab6e71152ba1154a6788f/hostname",
"HostsPath": "/var/lib/docker/containers/0fd350596b565a75cf4a859d777692ef24a4de80305ab6e71152ba1154a6788f/hosts",
"LogPath": "/var/lib/docker/containers/0fd350596b565a75cf4a859d777692ef24a4de80305ab6e71152ba1154a6788f/0fd350596b565a75cf4a859d777692ef24a4de80305ab6e71152ba1154a6788f-json.log",
"Name": "/friendly_khayyam",
"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/ee52de2dd296ae5bb006ba95edba9fd29b171fb48b030ad8d0d98f8c4d3be36c-init/diff:/var/lib/docker/overlay2/da23e695d17a9e7ed2ad81c9f2486a4cbdec8e601031b2b660fddf001f3fe9a2/diff",
"MergedDir": "/var/lib/docker/overlay2/ee52de2dd296ae5bb006ba95edba9fd29b171fb48b030ad8d0d98f8c4d3be36c/merged",
"UpperDir": "/var/lib/docker/overlay2/ee52de2dd296ae5bb006ba95edba9fd29b171fb48b030ad8d0d98f8c4d3be36c/diff",
"WorkDir": "/var/lib/docker/overlay2/ee52de2dd296ae5bb006ba95edba9fd29b171fb48b030ad8d0d98f8c4d3be36c/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "0fd350596b56",
"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 print;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": "ccabded2409ffbc145c5130acb301ea392e0063c9c012f4d3562f6fcb1efb71c",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/ccabded2409f",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "fd9e4c4d71b0dba8b4dda169059ead023d887a2498f857da737236c786ef2641",
"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": "efde225ef685bc98209337a5cdd4d66bb8a8f85d8762be2fca7313ad00d353bc",
"EndpointID": "fd9e4c4d71b0dba8b4dda169059ead023d887a2498f857da737236c786ef2641",
"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
# 我们通常容器都是用后台方式运行的,需要进入容器,修改一些配置

# 命令
docker exec -it 容器id bashshell

# 测试
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fd350596b56 centos "/bin/sh -c 'while t…" 27 minutes ago Up 27 minutes friendly_khayyam
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker exec -it 0fd350596b56 /bin/bash
[root@0fd350596b56 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@0fd350596b56 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:42 ? 00:00:00 /bin/sh -c while true;do echo print;sleep 1;done
root 1660 0 0 01:09 pts/0 00:00:00 /bin/bash
root 1681 1 0 01:09 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 1682 1660 0 01:09 pts/0 00:00:00 ps -ef

# 方式二
docker attach 容器id
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker attach 0fd350596b56
正在执行当前的代码...

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

# 查看当前主机目录下
[root@iz2zeihuhu3ktzymn2ydktz home]# ls
admin

# 进入当前容器内部 (也可以用attach 命令)
[root@iz2zeihuhu3ktzymn2ydktz home]# docker run -it centos /bin/bash
[root@6442d7af4f41 /]# cd /home
[root@6442d7af4f41 home]# ls

# 在容器内创建一个新的文件
[root@6442d7af4f41 home]# touch test.java
[root@6442d7af4f41 home]# exit
exit
[root@iz2zeihuhu3ktzymn2ydktz home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iz2zeihuhu3ktzymn2ydktz home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6442d7af4f41 centos "/bin/bash" 41 seconds ago Exited (0) 17 seconds ago ecstatic_aryabhata
97b8ac803f12 centos "/bin/bash" 3 minutes ago Exited (127) 2 minutes ago elastic_thompson

# 将文件拷贝到主机上
[root@iz2zeihuhu3ktzymn2ydktz home]# docker cp 6442d7af4f41:/home/test.java /home
[root@iz2zeihuhu3ktzymn2ydktz home]# ls
admin test.java
[root@iz2zeihuhu3ktzymn2ydktz home]#

# 拷贝是一个手动过程,未来我们使用-v 卷的技术,可以实现,自动同步

小结

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
38
attach     Attach to a running container             #当前she1l下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile 定制镜像
commit Create a new image from a container changes #提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目 #录到宿主机中
create Create a new container #创建一个新的容器,同run, 但不启动容器
diff Inspect changes on a containers filesys tem #查看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 sys tem-wide informati on #显示系统相关信息
inspect Return 1ow-1eve1 information on a container #查看容器详细信息
ki1l Ki1l a running container # ki11 指定docker 容器
load Load an image from a tar archive #从一个tar包中加载一个镜像[对应save]
login Register or Login to the docker registry server #注册或者登陆一个docker 源服务器
1ogout Log out from a Docker registry server #从当前Docker registry 退出
1ogs Fetch the logs of a container #输出当前容器日志信息
port Lookup the pub1ic-facing port which is NAT-ed to PRIVATE_ PORT #查看映射端口对应的容器内部源端口
pause Pause a11 processes within a container #暂停容器
ps List containers #列出容器列表
pu11 Pu11 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 Remove one or more i mages #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-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 Dockerhub #在dockerhub中搜索镜像
start Start a stopped containers #启动容器
stop Stop a running containers #停止容器
tag tag an image into a repository #给源中镜像打标签
top Lookup the runring 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 #截取容器停止时的退出状态值

作业联系

Docker 安装Nginx

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
# 1. 搜索镜像 search 建议大家去dockerhub上下载,这里可以看见全部的文档信息
# 2. 下载镜像 pull
# 3. 运行测试
[root@iz2zeihuhu3ktzymn2ydktz home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8ae0e85b4da nginx "/docker-entrypoint.…" 59 seconds ago Up 59 seconds 0.0.0.0:3344->80/tcp nginx-1

# -d 后台运行
# --name 给容器命名
# -p 宿主机端口
[root@iz2zeihuhu3ktzymn2ydktz home]# docker run -d --name nginx-1 -p:3344:80 nginx
c8ae0e85b4da25df08731a4208cdc3d7845aefcc4daee429e79c9d2e432b68c0
[root@iz2zeihuhu3ktzymn2ydktz home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8ae0e85b4da nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:3344->80/tcp nginx-1
[root@iz2zeihuhu3ktzymn2ydktz home]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

# 进入容器
[root@iz2zeihuhu3ktzymn2ydktz home]# docker exec -it nginx-1 /bin/bash
root@c8ae0e85b4da:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@c8ae0e85b4da:/# exit

端口暴露的概念

image-20210208103001129

思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,打到在容器修改文件名,容器内部就可以自动修改。 -v 宿主机

作业:安装一个tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 官方的使用
docker run -it --rm tomcat:9.0

# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到的 docker run -it --rm 一般用来测试,用完立即删

# 下载在启动
docker pull tomcat

# 启动运行
[root@iz2zeihuhu3ktzymn2ydktz home]# docker run -d -p 3355:8080 --name tomcat01 tomcat
608d31b84665ef9e477cd21b3e0703ea6268fa440dfee254f359d5d026b5a0f1

# 测试访问没有问题

# 进入容器
[root@iz2zeihuhu3ktzymn2ydktz home]# docker exec -it tomcat01 /bin/bash

# 发现问题:
## 1. linux 命令少了
## 2. 没有webapps。阿里云镜像的原因,默认是最小的镜像,所要补必要的都剔除掉

思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?我要是可以在容器外部提供一个可以映射的路径,webapps,我们在外部放置项目,就自动同步到内部就好了

docker 容器tomcat+网站 docker mysql

作业3:

不是es+kibana

1
2
# es 很卡,请直接去狂神 官网p16看
https://www.bilibili.com/video/BV1og4y1q7M4?p=16&spm_id_from=pageDriver

可视化

  • Portainer (先用这个)
  • Rancher (CI/CD再用)

什么是portainer?

Docker图形化界面管理工具,提供一个后台面板供我们操作

1
2
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --priviledged=true portainer/portainer

commit 镜像

1
2
3
4
docker commit 提交容器成为一个新的副本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

实战测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 启动一个默认的tomcat
# 2. 发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的
# 3. 我自己拷贝进去了基本的文件
# 4. 将我们操作过的容器通过commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这是我们自己一个修改过的镜像
------
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker commit -a="kuangshen" -m="add webapps app" d9ae26d8f935 \tomcat02:1.0
sha256:69fc96f96866b16768c5f9f2dbf07d7af5da5bd2378ef425bac69eafb51728b9
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 69fc96f96866 12 seconds ago 654MB
tomcat 9.0 040bdb29ab37 3 weeks ago 649MB
tomcat latest 040bdb29ab37 3 weeks ago 649MB
portainer/portainer latest 62771b0b9b09 6 months ago 79.1MB
[root@iz2zeihuhu3ktzymn2ydktz ~]#


学习方式说明:理解概念,但是一定要实践,最后实践和理论要结合

1
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比之前学习VM的时候的快照

容器数据卷

什么是容器数据卷

docker的理念回顾

将应用和环境打包成为一个镜像!

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失 ==需求:数据可以持久化==

MySQL,容器删了,删库跑路!==需求:MySQL数据可以存储在本地!==

容器之间可以有一个数据共享的技术!Docker中容器产生的数据来进行同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面

image-20210208145216128

一句话:容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷

方式一:直接使用命令来挂载 -v

1
2
3
4
5
6
docker run it -v 主机目录:容器内目录 

# 测试
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

# 启动起来时候我们可以通过docker inspect 容器id

image-20210208145811062

测试文件的同步
未上传image-20210208150358364

再来测试!

  1. 停止容器
  2. 宿主上修改文件
  3. 启动容器
  4. 容器内的数据依旧是同步的
    image-20210208150718065
    好处:我们以后修改只需要在本地修改即可,容器内会自动同步

实战:安装MySQL

思考:MySQL的数据持久化的问题!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 获取镜像
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker pull mysql:5.7

# 运行容器,需要做数据挂载!# 安装启动MySQL,是需要配置密码的,这是需要注意的点!
# 官方测试:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
ea2605d0b4c8430d5bde02507eb0a6fcca465bea38a53d39cc410b81d085e94c

# 在启动成功之后用sql来连接测试一下

image-20210209093855179

具名和匿名挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 匿名挂载
-v 容器内路径!
docker run -d -p --name nginx01 -v /etc/nginx nginx

# 查看所有卷的挂载
[root@iz2zeihuhu3ktzymn2ydktz data]# docker volume ls

# 这里发现这就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径

# 具名挂载
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
232b88ac37f15545fb57bfdaa9583681732723b0026fedf09cb1c5bb90d64f81
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker volume ls
DRIVER VOLUME NAME
local 65f13884504c84967e02fe6ab7ce9cc2cd4c4b93ae2bcd6f1707b8f2cd727a4c
local c702e26bf7cb663e1f748ba6ede1e6d475242362414a45df5b6778cef6b6ea65
local juming-nginx

# 通过 -v 卷名:容器内路径
# 查看一下这个卷

image-20210209142244746

所有的docker容器内的卷,在没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

我们可以通过具名挂载可以方便的找到我们一个卷,大多数情况下我们正在使用具名挂载

1
2
3
4
# 如何确定具体使用的是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径::容器内路径 # 指定路径挂载

拓展:

1
2
3
4
5
6
7
8
9
10
11
# 通过 -v 容器内路径:ro rw 改变读写全写
ro readonly # 只读
rw readwrite # 可读可写

# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的

初识DockerFile (之前应用commit)

Docker file 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!通过这个脚本可以来生成镜像,镜像是一层层,脚本是一个个的命令

1
2
3
4
5
6
7
8
9
10
11
# 创建一个dockerfile 文件,名字可以随机,建议Dockerfile
# 文件中的内容 指令(大写)参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

# 这里每个命令,都是镜像的一层

image-20210210124525345

1
# 进入我们自己写的镜像

image-20210210124734642

这个卷一定有一个外面的目录进行同步

image-20210210125015723

查看一下卷挂载的路径

image-20210210125354820

查看一下卷挂载的路径

这种方式我们未来使用的非常多,因为我们通常会构建自己的镜像!

假设构建镜像时候没有用挂载卷,需要手动镜像挂载 -v 卷名:容器内路径

数据卷容器

多个mysql同步数据!

image-20210210130120145

1
# 启动3个容器,通过我们刚才自己写的镜像启动

image-20210210130253083

image-20210210132156865

image-20210210132419006

1
2
# 测试,可以删除docker01,查看一下docker02和03 是否可以访问这个文件

image-20210210133618358

多个mysql实现数据共享

1
2
3
4
5
[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql101 mysql:5.7

[root@iz2zeihuhu3ktzymn2ydktz ~]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 volumes-from mysql01 mysql:5.7

#这个时候,可以实现两个容器数据同步!

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦你持久化到了本地,这个时候,本地的文件不会删除

DockerFile

介绍:

Dockerfile 是用来构建docker镜像的文件!

构建步骤:

  1. 编写一个dockerfile的文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub,阿里云镜像仓库)

查看一下官方文档是怎么做的?

image-20210210143314581

image-20210210143355014

很多官方镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像

官方既然可以制作镜像

Dockerfile 构建过程

基础知识

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. # 表示注视
  4. 每一个指令都会穿件提交一个新的镜像层并且提交

image-20210210143907254

dockerfile 是面向开发的,我们以后要发布项目,做镜像,都要编写dockerfile文件,这个文件十分简单

docker镜像逐渐成为企业交付的标准,必须要掌握

步骤:开发,部署,运维。。。缺一不可

Dockerfile: 构建文件,定义了一切的步骤,源代码

Dockerimages: 通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar 和war

Docker 容器:容器就是镜像运行起来提供服务器的

DockerFile的指令

以前的话我们是使用别人的,现在我们知道了这些指令后,我们来联系自己写一个镜像

1
2
3
4
5
6
7
8
9
10
11
12
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录 /bin/bash
VOLUME # 挂载的目录
EXPOSE # 端口配置暴露
CMD # 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可以被替代 cmd echo
ENTRYPOINT # 指定这个容器启动的时候需要运行的命令,可以追加命令 cmd echo
ONBUILD # 当构建一个被继承的DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候环境变量 mysql 用户名

image-20210210145653097

Docker网络

Docker Swarm

  • Post title:Docker 常用命令
  • Post author:Yuxuan Wu
  • Create time:2021-02-03 05:07:33
  • Post link:yuxuanwu17.github.io2021/02/03/2021-02-03-Docker学习笔记/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.