0%

Docker常用命令

帮助命令

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

帮助文档的地址:参考文档|Docker 文档

镜像命令

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
xxx@data:~/solrdata$ sudo docker images 
REPOSITORY TAG IMAGE ID CREATED SIZE
solr 8 ce1fcccc6f5e 5 days ago 563MB
solr latest ce1fcccc6f5e 5 days ago 563MB

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

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

xxx@data:~/solrdata$ sudo docker images -aq
ce1fcccc6f5e
ce1fcccc6f5e

docker search 搜索镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
xxx@data:~/solrdata$ sudo docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12350 [OK]
mariadb MariaDB Server is a high performing open sou… 4753 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 916 [OK]

# 可选项,通过收藏来过滤
--filter=STARS=3000 # 搜索出来的镜像就是STARS大于3000的

xxx@data:~/solrdata$ sudo docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12350 [OK]
mariadb MariaDB Server is a high performing open sou… 4753 [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
33
34
35
36
37
38
39
40
41
42
# 下载镜像 docker pull 镜像名[:tag]
xxx@data:~/solrdata$ sudo docker pull mysql
Using default tag: latest # 如果不写tag,就默认latest最新版
latest: Pulling from library/mysql
f003217c5aae: Pull complete # 分层下载,docker image的核心 联合文件系统
65d94f01a09f: Pull complete
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

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

# 指定版本下载
xxx@data:~/solrdata$ sudo docker pull mysql:5.7
5.7: Pulling from library/mysql
f003217c5aae: Already exists
65d94f01a09f: Already exists
43d78aaa6078: Already exists
a0f91ffbdf69: Already exists
59ee9e07e12f: Already exists
04d82978082c: Already exists
70f46ebb971a: Already exists
ba61822c65c2: Pull complete # 指定版本只需要下载和之前不同的部分
dec59acdf78a: Pull complete
0a05235a6981: Pull complete
c87d621d6916: Pull complete
Digest: sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

image-20220405183232675

docker rmi 删除镜像

rmi=rm 删除 + i 镜像(image),删除镜像

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

xxx@data:~/solrdata$ sudo docker rmi f26e21ddd20d # 镜像id

容器命令

说明:我们有了镜像才可以创建容器,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
24
25
docker run [可选参数] image

# 参数说明
--name=“Nmae” 容器名字 solr01 solr02 用来区分容器
-d 后台方式运行,类型nohup,docker里只要加上-d
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(容器)
-p 容器端口
容器端口
-P 随机指定端口

# 测试,启动并进入容器 -it交互模式
xxx@data:~/solrdata$ sudo docker run -it centos /bin/bash
[root@17e53f625cbc /]# ls # 查看容器内部的centos,基础版本,很多命令是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

# 从容器中退回主机
[root@17e53f625cbc /]# exit
exit
xxx@data:~/solrdata$ ls
data log4j2.xml logs
xxx@data:~/solrdata$

列出所有运行中的容器

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


xxx@data:~/solrdata$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxx@data:~/solrdata$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e53f625cbc centos "/bin/bash" 3 minutes ago Exited (0) 58 seconds ago magical_haibt

退出容器

1
2
exit	# 直接容器停止并退出
Crtl + 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 restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器

常用其他命令

后台启动容器

1
2
3
4
5
6
7
8
9
10
11
# 命令 docker run -d 镜像名
xxx@data:~/solrdata$ sudo docker run -d centos
7c5bca7cedbe3d4c32aa5273b9068a9d154a2e5f7a665f5861f8369a1a592862

# 问题 docker ps 发现centos停止了
xxx@data:~/solrdata$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

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

查看日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 可选项
Options:
-f, --follow Follow log output
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps


# 测试
xxx@data:~/solrdata$ sudo docker logs -f -t 508f4663f65e # 没有日志

# 自己编写一段shell脚本
"while true;do echo wjm;sleep 1;done"
xxx@data:~/solrdata$ sudo docker run -d centos /bin/bash -c "while true;do echo wjm;sleep 1;done"

xxx@data:~/solrdata$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a96132edf5d centos "/bin/bash -c 'while…" 55 seconds ago Up 53 seconds priceless_elbakyan
# 显示日志
-tf # 显示日志
--tail number # 要显示的日志条数

查看容器中的进程信息 ps

1
2
3
4
5
# 命令 docker top 容器id
xxx@data:~/solrdata$ sudo docker top 5a96132edf5d
UID PID PPID C STIME TTY TIME CMD
root 4109297 4109277 0 15:33 ? 00:00:00 /bin/bash -c while true;do echo wjm;sleep 1;done
root 4112148 4109297 0 15:40 ? 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
# 命令 docker inspect 容器id

# 测试
xxx@data:~/solrdata$ sudo docker inspect 5a96132edf5d
[
{
"Id": "5a96132edf5d25f7b434f20e843e50129d6dbdacb101785827b75c0f96bf5c67",
"Created": "2022-04-04T07:33:47.224853805Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true;do echo wjm;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 4109297,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-04-04T07:33:48.561816958Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/5a96132edf5d25f7b434f20e843e50129d6dbdacb101785827b75c0f96bf5c67/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/5a96132edf5d25f7b434f20e843e50129d6dbdacb101785827b75c0f96bf5c67/hostname",
"HostsPath": "/var/lib/docker/containers/5a96132edf5d25f7b434f20e843e50129d6dbdacb101785827b75c0f96bf5c67/hosts",
"LogPath": "/var/lib/docker/containers/5a96132edf5d25f7b434f20e843e50129d6dbdacb101785827b75c0f96bf5c67/5a96132edf5d25f7b434f20e843e50129d6dbdacb101785827b75c0f96bf5c67-json.log",
"Name": "/priceless_elbakyan",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"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/a18d17416e95b7779000e3864c1a96bf7eed2d4784d3c84789971bbf77a49b5e-init/diff:/var/lib/docker/overlay2/81761618a33f3926b117dce5b1a9ae7094d898b3d32f20d50da147a2c0c1dfd0/diff",
"MergedDir": "/var/lib/docker/overlay2/a18d17416e95b7779000e3864c1a96bf7eed2d4784d3c84789971bbf77a49b5e/merged",
"UpperDir": "/var/lib/docker/overlay2/a18d17416e95b7779000e3864c1a96bf7eed2d4784d3c84789971bbf77a49b5e/diff",
"WorkDir": "/var/lib/docker/overlay2/a18d17416e95b7779000e3864c1a96bf7eed2d4784d3c84789971bbf77a49b5e/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "5a96132edf5d",
"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 wjm;sleep 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": "e8757375dc8ce5c604047bace5801859349b35be01c4d0983f6e18aefad6d7c8",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/e8757375dc8c",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "35abfaa04e627a268c7c0a2279bbd919c831c66dcb7e87ca7afa95694b2c6cd0",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.5",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:05",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "99b4b446329155dc0d91f3989f0cd78ac1c354467b34c72c1ac8a51085632eb8",
"EndpointID": "35abfaa04e627a268c7c0a2279bbd919c831c66dcb7e87ca7afa95694b2c6cd0",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.5",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:05",
"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
# 我们通常容器都是使用后台方式运行的,需要进入容器修改一些配置

# 命令1 docker exec -it 容器id bashShell

# 测试
xxx@data:~/solrdata$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a96132edf5d centos "/bin/bash -c 'while…" 12 minutes ago Up 12 minutes priceless_elbakyan

xxx@data:~/solrdata$ sudo docker exec -it 5a96132edf5d /bin/bash
[root@5a96132edf5d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@5a96132edf5d /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:33 ? 00:00:00 /bin/bash -c while true;do echo wjm;sleep 1;done
root 750 0 0 07:46 pts/0 00:00:00 /bin/bash
root 771 1 0 07:46 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 772 750 0 07:46 pts/0 00:00:00 ps -ef

# 命令2 docker attach 容器id

# 测试
xxx@data:~/solrdata$ sudo docker attach 5a96132edf5d
正在执行当前代码...


# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程!,while true的话就死循环了

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

容器内和容器外是隔离的,如何拷贝?

image-20220404155319337

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

# 查看帮助 看到是可以双向拷贝的
xxx@data:~$ sudo docker cp --help
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Copy files/folders between a container and the local filesystem

Use '-' as the source to read a tar archive from stdin
and extract it to a directory destination in a container.
Use '-' as the destination to stream a tar archive of a
container source to stdout.

Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH

# 测试
# 查看当前主机目录下的文件
xxx@data:~$ ls
solrdata total.csv
# 进入docker容器内部
xxx@data:~$ sudo docker attach 825f1e107b64
[root@825f1e107b64 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@825f1e107b64 /]# cd home/
# 在容器内新建一个文件
[root@825f1e107b64 home]# touch test.java
[root@825f1e107b64 home]# ls
test.java
[root@825f1e107b64 home]# exit
exit
# 容器内/home/test.java拷贝到主机上的默认目录
xxx@data:~$ sudo docker cp 825f1e107b64:/home/test.java .
xxx@data:~$ ls
solrdata test.java total.csv


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

小节

image-20220404163030861

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
Commands:
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container's changes # 提交当前容器为新镜像
cp Copy files/folders between a container and the local filesystem # 从容器中拷贝文件到宿主机中
create Create a new container # 创建一个新的容器,同 run ,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器的变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in a running container # 再已存在的容器中运行命令
export Export a container's filesystem as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Import the contents from a tarball to create a filesystem image # 从 tar 包中的内容创建一个新的文件系统映像[对应 import ]
info Display system-wide information # 展示系统相关信息
inspect Return low-level information on Docker objects # 查看容器详细信息
kill Kill one or more running containers # kill 指定容器
load Load an image from a tar archive or STDIN # 从 tar 包中加载一个镜像[对应 sava ]
login Log in to a Docker registry # 注册或者登录一个 docker 源服务器
logout Log out from a Docker registry # 退出登录
logs Fetch the logs of a container # 输出容器的日志
pause Pause all processes within one or more containers # 暂停容器
port List port mappings or a specific mapping for the container # 查看映射端口对应的容器内部源端口
ps List containers # 列出容器列表
pull Pull an image or a repository from a registry # 从 docker 镜像源服务器拉取指定镜像
push Push an image or a repository to a registry # 推送指定镜像至 docker 镜像源服务器
rename Rename a container # 重命名容器
restart Restart one or more containers # 重构其容器
rm Remove one or more containers # 删除一个或多个容器
rmi Remove one or more images # 删除一个或多个镜像[无容器使用该镜像时才能删除,否则需要删除相关容器才能继续,或者 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行命令
save Save one or more images to a tar archive (streamed to STDOUT by default) # 保存镜像为 tar 包[对应 load ]
search Search the Docker Hub for images # 在 docker hub 中搜索镜像
start Start one or more stopped containers # 启动容器
stats Display a live stream of container(s) resource usage statistics # 展示容器的实时资源占用情况
stop Stop one or more running containers # 停止容器
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE # 给源中镜像打标签
top Display the running processes of a container # 查看容器中运行的进程信息
unpause Unpause all processes within one or more containers # 取消暂停容器
update Update configuration of one or more containers # 更新容器的配置
version Show the Docker version information # 查看 docker 版本号
wait Block until one or more containers stop, then print their exit codes # 截取容器停止时的退出状态值

docker命令很多,上面都是最常用的.

作业练习

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
# 1. 搜索镜像 search ,建议到 docker hub 上搜索查看详细文档 
# 2. 下载镜像 pull
# 3. 运行测试

# -d 后台运行
# --name 给容器命名
# -p 宿主机(linux服务器)端口,容器(docker)内部端口
xxx@data:~$ sudo docker run -d --name nginx01 -p 3344:80 nginx
659cd3e2b3825a85c7e4b02ad2fe52be267fa2fd5425391162b859fec5f3c9c4
xxx@data:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
659cd3e2b382 nginx "/docker-entrypoint.…" 33 seconds ago Up 31 seconds 0.0.0.0:3344->80/tcp nginx01

# 测试访问成功
xxx@data:~$ curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.......
</body>
</html>

# 进入容器
xxx@data:~$ sudo docker exec -it nginx01 /bin/bash
root@659cd3e2b382:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@659cd3e2b382:/# cd /etc/nginx

端口暴露的概念

image-20220404172634182

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

Docker 安装 tomcat

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
# 官方的使用
docker run -it --rm tomcat:9.0

# 我们之前的使用都是 -d 后台,停止容器后,容器还是可以查到.--rm 表示用完就删.
# 所以 docker run -it --rm tomcat:9.0 一般用来测试,用完即删

# 下载再启动
docker pull tomcat:9.0

# 启动运行
docker run -d -p 3344:8080 --name tomcat01 tomcat

# 测试访问没有问题

# 进入容器

xxx@data:~$ sudo docker exec -it tomcat01 /bin/bash
root@e145ea35d953:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@e145ea35d953:/usr/local/tomcat# ls -al
total 176
drwxr-xr-x 1 root root 4096 Apr 1 19:34 .
drwxr-xr-x 1 root root 4096 Mar 30 05:14 ..
-rw-r--r-- 1 root root 19004 Mar 31 14:24 BUILDING.txt
-rw-r--r-- 1 root root 6210 Mar 31 14:24 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Mar 31 14:24 LICENSE
-rw-r--r-- 1 root root 2333 Mar 31 14:24 NOTICE
-rw-r--r-- 1 root root 3378 Mar 31 14:24 README.md
-rw-r--r-- 1 root root 6905 Mar 31 14:24 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Mar 31 14:24 RUNNING.txt
drwxr-xr-x 2 root root 4096 Apr 1 19:34 bin
drwxr-xr-x 1 root root 4096 Apr 4 09:43 conf
drwxr-xr-x 2 root root 4096 Apr 1 19:34 lib
drwxrwxrwx 1 root root 4096 Apr 4 09:43 logs
drwxr-xr-x 2 root root 4096 Apr 1 19:34 native-jni-lib
drwxrwxrwx 2 root root 4096 Apr 1 19:34 temp
drwxr-xr-x 2 root root 4096 Apr 1 19:34 webapps
drwxr-xr-x 7 root root 4096 Mar 31 14:24 webapps.dist
drwxrwxrwx 2 root root 4096 Mar 31 14:24 work
root@e145ea35d953:/usr/local/tomcat# cd webapps
root@e145ea35d953:/usr/local/tomcat/webapps# ls
root@e145ea35d953:/usr/local/tomcat/webapps#

# 发现问题 1.linux命令少了 2. 404 not found -->没有webapps 是镜像的原因,默认是最小的镜像,所有不必要的都剔除了
# 保证最小可运行环境

image-20220404174410059

1
2
3
4
5
# 更改配置再访问
root@e145ea35d953:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@e145ea35d953:/usr/local/tomcat# cd webapps
root@e145ea35d953:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager

404 变成了完整页面, 全程都是在docker里修改,同样可以部署

image-20220404175010930

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

现在 docker 容器: tomcat + 网站内容 ; 如果将来 docker 容器放 mysql + 数据库数据 , 再如果把容器删了 , 就相当于删库跑路了…. 非常不科学 . (期待 -v 数据卷 如何解决)

Docker 部署 es + kibana(没有实际部署)

1
2
3
4
5
6
7
8
9
10
11
# es 暴露的端口很多
# es 十分耗内存
# es 的数据一般需要放置到安全目录! 挂载
# --net somenetwork ? 网络配置

# 下载 启动
docker run -d --name elasticsearch01 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 启动了 Linux就卡住了 因为非常占内存

# docker stats 查看cpu的状态

image-20220404181625831

1
2
3
# 赶紧关闭,增加内存限制,修改配置文件 -e 环境配置修改 限制最小最大占用内存
docker run -d --name elasticsearch02 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# docker stats 查看cpu的状态

image-20220404181645136

使用 kibana 连接 es ? 思考网络如何连接.

image-20220404182053887

参考

以上是看 b 站教学视频记的笔记。

教程地址:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili