1、docker概述

理解Docker

java - - - jar(环境) - - - 打包项目自带环境(镜像) – - - (Docker仓库:商店)- - -下载我们发布的镜像 - - -直接运行即可

image-20230809213039841

隔离:docker的核心思想,打包装箱,每个箱子都是互相隔离的

docker的历史

百度百科:…

docker是基于go语言开发的开源项目

官网地址 Home - Docker

文档地址:方向和设置|Docker 文档 文档很详细

hub地址:https://hub.docker.com 类似与github

image-20220826170116958

image-20220826171404974

docker能干嘛

传统虚拟机方式

image-20230809215205581

弊端:

  1. 内存空间占用大
  2. 资源占用十分多
  3. 冗余步骤多
  4. 启动很慢

容器化技术

容器化技术不是模拟的一个完整的操作系统

image-20230809215541035

虚拟机和docker的不同

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装运行软件
  • 容器内的应用使直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟锄硬件,轻便
  • 每个容器间互相隔离,每个容器都有属于自己的文件系统,互不影响

DevOps(开发、运维)

image-20230809220451151

2、docker安装

docker的基本组成

image-20220826172139049

  • 镜像(image):镜像(image)是类,容器是实例1,实例2…… ,通过镜像可以创建多个容器

  • 容器(container): docker利用容器技术,独立运行或者一组应用,通过镜像来创建的 - - -简易的linux系统

  • 仓库(repository):仓库就是存放镜像的地方 ,有公有仓库和私有仓库 比如 Docker hub(默认是国外的) 国内需要配置镜像加速

安装

参考帮助文档

  1. 卸载旧版本

    1
    2
    3
    4
    5
    6
    7
    8
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  2. 使用存储库安装

    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
    #安装软件包(提供实用程序)设置存储库
    yum install -y yum-utils

    #设置存储库
    yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的


    yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内阿里云镜像地址


    #将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度。
    yum makecache fast


    #安装最新版本的 Docker 引擎、容器和 Docker Compose,或转到下一步以安装特定版本:
    yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    #启动docker
    systemctl start docker

    #查看是否安装成功
    docker version

    3.测试 hello-world

    1
    docker run hello-world

    image-20220829164738880

  3. 查看镜像

1
docker images

卸载docker

1
2
3
4
5
6
7
8
9
#卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包:
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin

#主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd


# /var/lib/docker docker默认工作路径

阿里云镜像加速

image-20230809225050308

找到镜像加速地址、配置使用

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://2v191h2c.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

hello-world执行流程

  • docker run 先会现在本机中寻找镜像
    • 如果本机中存在此镜像,就使用此镜像
    • 如果未找到会去docker-hub上下载

底层原理

docker是一个Client-server 结构系统,以守护进程的方式运行在主机上,通过Socket从客户端访问

dockerServer接收到客户端(docker-client)的指令,就会执行这个命令

image-20230809230912263

docker利用的是主机的内核

新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,docker是利用宿主机的操作系统

3、docker的常用命令

帮助命令

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

帮助文档地址 Reference documentation | Docker Documentation

镜像命令

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@centosstudy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 22 months ago 13.3kB

# CREATED 镜像创建时间

# 可选性
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

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

# 实操
[root@centosstudy ~]# docker images -aq
feb5d9fea6a5

docker search 镜像名 搜索镜像

1
2
3
4
5
6
7
8
9
10
11
12
[root@centosstudy ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14373 [OK]
mariadb
....


#可选项
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output

docker pull 镜像名 [:tag] 下载镜像

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
[root@centosstudy ~]# docker pull mysql
Using default tag: latest #默认下载最新版
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址


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

#指定版本下载
[root@centosstudy ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Downloading [=========> ] 21.13MB/108.6MB
e2482e017e53: Download complete
70deed891d42: Download complete

docker rmi 删除镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@centosstudy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 19 months ago 448MB
mysql latest 3218b38490ce 19 months ago 516MB
hello-world latest feb5d9fea6a5 22 months ago 13.3kB
[root@centosstudy ~]# docker rmi -f 3218b38490ce #-f删除所有的 可以根据id和名字进行删除
Untagged: mysql:latest
Untagged: mysql@sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Deleted: sha256:3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b
Deleted: sha256:aa81ca46575069829fe1b3c654d9e8feb43b4373932159fe2cad1ac13524a2f5
Deleted: sha256:0558823b9fbe967ea6d7174999be3cc9250b3423036370dc1a6888168cbd224d
Deleted: sha256:a46013db1d31231a0e1bac7eeda5ad4786dea0b1773927b45f92ea352a6d7ff9
Deleted: sha256:af161a47bb22852e9e3caf39f1dcd590b64bb8fae54315f9c2e7dc35b025e4e3
Deleted: sha256:feff1495e6982a7e91edc59b96ea74fd80e03674d92c7ec8a502b417268822ff


#docker rmi -f 容器id
#docker rmi -f 容器id 容器id 容器id ... 删除多个容器
# f表示强制删除 即使正在运行也能被删除

#如何删除所有镜像
docker stop $(docker ps -aq) #停止正在运行的所有容器
docker rm $(docker ps -aq) # 删除所有停止的容器。这将释放与这些容器关联的资源。
docker rmi $(docker images -aq) # 删除所有镜像

容器命令

有了镜像才能创建容器

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="Name" 指定容器名字,用来做区分
-d 后台方式运行
-it 使用交互方式运行
-p
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口

-P 随机指定端口

-d: 后台运行容器。
-i: 保持标准输入流打开。
-t: 分配一个伪终端。

#测试 启动并进入容器
[root@centosstudy ~]# docker run -it centos /bin/bash
[root@f543c9fb3100 /]#
[root@f543c9fb3100 /]# ls #查看容器内的centos 很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@f543c9fb3100 /]# exit 退出容器
exit
[root@centosstudy ~]#

docker ps 列出正在运行的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@centosstudy ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

[root@centosstudy ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f543c9fb3100 centos "/bin/bash" 4 minutes ago Exited (127) About a minute ago cool_hopper
f8aa32675558 hello-world "/hello" About an hour ago Exited (0) About an hour ago crazy_kirch
0a0311bf43d8 hello-world "/hello" 11 months ago Exited (0) 11 months ago flamboyant_wile

#参数
-a 列出正在运行的容器和历史运行过的容器

-n=? 显示最近创建?个容器

-q 只显示容器编号

退出容器

1
2
3
exit #容器退出

ctrl + p + q 容器不停止退出

docker rm 删除容器

1
2
3
4
5
docker rm 容器id #删除指定容器
[root@centosstudy ~]# docker rm f543c9fb3100
f543c9fb3100

docker rm -f $(docker ps -aq) #删除所有容器 f表示强制删除

启动和停止容器

1
2
3
4
docker start 容器id
docker restart 容器di
docker stop 容器id
docker kill 容器id #强制停止容器

常用其他命令

docker run -d 镜像名容器后台启动

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@centosstudy ~]# docker run -d centos
ca22d320b6f101e45061710170fe60d978b53ceea337108ef7cd111789c65d2d
[root@centosstudy ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centosstudy ~]#

# 使用docker ps 发现centos 停止了

#docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

#容器一直运行,即使主要进程已经退出。
docker run -dt centos /bin/sh

docker logs 查看日志

1
2
3
4
5
6
7
8
9
10
11
12
# docker logs [OPTIONS] CONTAINER_ID_OR_NAME 容器id或名字
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or
relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or
relative (e.g. 42m for 42 minutes)
-tf 显示全部日志 t 时间戳 f实时追踪
--tail number

docker top 容器id 查看容器中进程信息

1
2
3
4
5
6
#docker top CONTAINER_ID_OR_NAME [OPTIONS]

[root@centosstudy ~]# docker top 116287d5e23a
UID PID PPID C STIME TTY TIME CMD
root 2831 2811 0 14:25 pts/0 00:00:00 /bin/sh
root 3069 2811 0 14:30 pts/1 00:00:00 /bin/sh

docker inspect 容器id 获取有关 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
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
#docker inspect [OPTIONS] OBJECT()
[root@centosstudy ~]# docker inspect 116287d5e23a
[
{
"Id": "116287d5e23a49bed56db0fef38c98f3ed2fd9bbe787cafb10d7c5ffc861aa3d",
"Created": "2023-08-10T06:25:10.57979346Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2831,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-08-10T06:25:11.344415498Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/116287d5e23a49bed56db0fef38c98f3ed2fd9bbe787cafb10d7c5ffc861aa3d/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/116287d5e23a49bed56db0fef38c98f3ed2fd9bbe787cafb10d7c5ffc861aa3d/hostname",
"HostsPath": "/var/lib/docker/containers/116287d5e23a49bed56db0fef38c98f3ed2fd9bbe787cafb10d7c5ffc861aa3d/hosts",
"LogPath": "/var/lib/docker/containers/116287d5e23a49bed56db0fef38c98f3ed2fd9bbe787cafb10d7c5ffc861aa3d/116287d5e23a49bed56db0fef38c98f3ed2fd9bbe787cafb10d7c5ffc861aa3d-json.log",
"Name": "/practical_heisenberg",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": [
"291613a19c7c9e1987f0844fa298f61ed880d095a69cf341eadcd029c95bb4bc"
],
"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/793738f781d37d768a2e78f2e61c07049f209cfc04fd3ae50aedc5b59ffaa6f5-init/diff:/var/lib/docker/overlay2/ee64f8eddf487496966bf4f0fd640b7761034145cd282a72b50963fb1841051b/diff",
"MergedDir": "/var/lib/docker/overlay2/793738f781d37d768a2e78f2e61c07049f209cfc04fd3ae50aedc5b59ffaa6f5/merged",
"UpperDir": "/var/lib/docker/overlay2/793738f781d37d768a2e78f2e61c07049f209cfc04fd3ae50aedc5b59ffaa6f5/diff",
"WorkDir": "/var/lib/docker/overlay2/793738f781d37d768a2e78f2e61c07049f209cfc04fd3ae50aedc5b59ffaa6f5/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "116287d5e23a",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": true,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh"
],
"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": "a0c131748ba2b50223e24d4f24d402af3249dcce74592a35cd39561c20a8076b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/a0c131748ba2",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "f4bfff9c6374a782221ebfc8fd8e8e7cd87a91bb5d58b115eb1b7efcf78bb1ba",
"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": "e7938d33578b3150dfdb3123cef35dcab2e84bf631a4e5867e73116a29fd4d02",
"EndpointID": "f4bfff9c6374a782221ebfc8fd8e8e7cd87a91bb5d58b115eb1b7efcf78bb1ba",
"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
}
}
}
}
]

docker exec -it container_id_or_name /bin/bash 以交互式终端方式进入正在当前运行的容器

1
2
3
4
[root@centosstudy ~]# docker exec -it 116287d5e23a /bin/bash
[root@116287d5e23a /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr

dcoker attach 连接到正在运行的 Docker 容器,并将当前终端连接到容器的标准输入、输出和错误流

1
#语法 docker attach [OPTIONS] CONTAINER_ID_OR_NAME

二者区别:

  • docker exec 进入容器后开启一个新的终端
  • docker attach 进入容器正在执行的终端,不会启动一个新的进程

docker cp 容器id:容器内路径 目的主机路径 从容器内拷贝到主机上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@centosstudy opt]# docker exec -it 0fb15f692dcd /bin/bash  #进入容器中
[root@0fb15f692dcd /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@0fb15f692dcd /]# cd opt
[root@0fb15f692dcd opt]# ls
#在容器内新建一个文件
[root@0fb15f692dcd opt]# touch aaa.java
[root@0fb15f692dcd opt]# ls
aaa.java
[root@0fb15f692dcd opt]# exit
exit
[root@centosstudy opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fb15f692dcd centos "/bin/bash" 15 minutes ago Up 15 minutes sweet_satoshi
[root@centosstudy opt]# docker cp 0fb15f692dcd:/opt/aaa.java /opt #将容器中的aaa.java文件拷贝到主机/opt文件夹下
[root@centosstudy opt]# ls
aaa.java containerd rh

小结

image-20230810151657955

1
2
3
4
5
6
7
#常用命令小结
attach

...


...

4、docker部署Nginx

  1. 搜索镜像

    1
    docker search nginx   建议去dockerhub上搜索
  2. 下载镜像

    1
    docker pull nginx
  3. 创建并启动容器

    端口暴露给外部访问

    image-20230810153706819

    1
    2
    3
    4
    5
    docker run -d --name nginx01 -p 3344:80 nginx

    #-d 后台运行
    #--name 指定名字
    #-p 映射端口 暴露端口给外部访问 端口映射
  4. 本机内部测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [root@centosstudy opt]# curl localhost:1111
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    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>
  5. 进入容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@centosstudy opt]# docker exec -it nginx01 /bin/bash
    root@b9a3b4960d34:/# clear
    root@b9a3b4960d34:/# ls
    bin docker-entrypoint.d home media proc sbin tmp
    boot docker-entrypoint.sh lib mnt root srv usr
    dev etc lib64 opt run sys var
    root@b9a3b4960d34:/# whereis nginx
    nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
    root@b9a3b4960d34:/#

5、docker部署tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -it --rm tomcat:9.0

-it:这两个选项组合表示要创建一个交互式的终端会话,允许您与容器进行交互。
--rm:这个选项表示在容器退出时自动删除容器。这可以确保容器在退出后不会保留在系统中,以节省磁盘空间。
tomcat:9.0:这是要运行的镜像的名称和版本。tomcat:9.0 表示使用 Tomcat 9.0 版本的官方镜像。
运行这个命令后,Docker 将从 Docker Hub 下载 Tomcat 9.0 镜像(如果本地没有该镜像),然后创建一个交互式的终端会话,您可以在其中与 Tomcat 容器进行交互。您将进入一个交互式的 shell 环境,您可以在其中执行 Tomcat 相关的操作、查看日志等。

当您退出这个终端会话时,由于使用了 --rm 选项,Docker 将自动删除这个容器,确保容器不会在退出后保留下来。

请注意,由于 -it 选项,您必须使用 exit 命令或输入 Ctrl+D 来退出交互式终端会话并停止容器。如果只是想让容器在后台运行,而不需要交互式会话,可以省略 -it 选项,只使用 -d 选项。


#阿里云镜像 默认使用的是最小镜像
#只保证最小可运行环境

6、docker可视化工具

常见的 Docker 可视化工具:

  1. Portainer: Portainer 是一个流行的 Docker 管理界面,提供图形界面来管理容器、镜像、卷等资源。它易于安装和使用,适合 Docker 初学者和专业人员。
  2. Kitematic: Kitematic 是一个由 Docker 官方提供的可视化工具,用于在桌面上管理 Docker 容器。它具有直观的用户界面,可帮助您轻松创建、启动和管理容器。
  3. Rancher: Rancher 是一个用于管理容器化应用程序的开源平台,它提供了丰富的用户界面,允许您在多个主机上部署和管理容器。
  4. Docker Desktop(Windows/macOS): Docker Desktop 是针对 Windows 和 macOS 用户的官方 Docker 可视化工具,它提供了集成的用户界面,让您可以轻松地管理和运行容器。
  5. Docker Dashboard(Docker CLI Web): Docker Dashboard 是一个基于 Web 的界面,可以通过浏览器访问,提供与 Docker CLI 类似的功能,但以可视化的方式呈现。
  6. DockerUI: DockerUI 是一个简单的 Docker 可视化工具,可帮助您查看和管理容器和镜像。

7、docker镜像

镜像是什么

Docker 镜像是一个轻量级、独立且可执行的软件包,它包含了运行应用程序所需的所有代码、运行时、系统工具、库和设置。镜像是用于创建 Docker 容器的基础,可以将应用程序和其依赖项打包成一个可移植的单元,以便在不同的环境中运行。

如何获得镜像:

  • 从远程下载
  • 拷贝别人的
  • 自己制作

核心概念

  1. 分层结构: Docker 镜像是由一系列分层(Layers)组成的,每个分层包含了镜像的一部分文件系统变更。这种分层结构使镜像变得高效、可复用,并允许不同的镜像共享相同的基础分层。
  2. 不可变性: 一旦创建了 Docker 镜像,它就是不可变的。任何对镜像的更改都会产生新的镜像分层,而原始镜像本身保持不变。这确保了镜像的一致性和可靠性。
  3. 层叠和继承: Docker 镜像可以通过层叠和继承的方式创建。您可以基于现有的镜像添加新的分层,然后在顶层添加您的应用程序和配置。这种机制使镜像的创建和维护更加灵活。
  4. 版本控制: 镜像可以通过标签(Tags)来进行版本控制。例如,您可以创建多个版本的镜像,每个版本具有不同的标签,以便在应用程序的不同阶段或环境中使用。
  5. Docker Hub 和仓库: 镜像可以上传到 Docker Hub 或私有 Docker 仓库,以便与其他人共享和访问。Docker Hub 是一个公共的镜像仓库,包含了大量的官方和社区创建的镜像。

docker镜像加载的原理

  1. 分层结构: Docker 镜像是由一系列分层组成的,每个分层包含了文件系统的变更。这些分层按顺序叠加在一起,形成了一个完整的镜像。每个分层都包含了一个或多个文件或目录的变更,例如添加、删除、修改文件等。这种分层结构使得镜像可以被高效地构建、复用和共享。
  2. 联合文件系统(Union File System): Docker 使用联合文件系统技术将不同分层的文件系统叠加在一起,使它们看起来像是一个单一的文件系统。这允许容器只需加载变更的分层,而不是整个文件系统。常见的联合文件系统包括 AUFS、OverlayFS、Btrfs 等。

镜像加载过程

  1. 准备阶段: 当您使用 docker pull 命令或运行一个基于某个镜像的容器时,Docker 首先检查本地是否已经存在所需的镜像。如果不存在,它会从镜像仓库(如 Docker Hub)下载镜像及其分层。
  2. 分层叠加: 下载完镜像的分层后,Docker 会将这些分层按顺序叠加在一起,以构建一个完整的文件系统。每个分层只包含变更,这意味着底层的基础镜像是不可变的。
  3. 创建容器: 当您运行一个容器时,Docker 根据镜像的文件系统创建一个容器实例。每个容器都有自己的读写层(Writable Layer),这是一个可变的分层,允许容器在运行时对文件系统进行修改。
  4. 联合文件系统: 在容器运行时,Docker 将底层镜像的分层和容器的读写层(Writable Layer)联合在一起,创建出一个虚拟的联合文件系统。这使得容器的文件系统在逻辑上看起来像是一个完整的文件系统,但实际上是由多个分层组成。

分层原理

image-20230810170543878

commit镜像

1
2
3
docker cmmit 将容器成为一个新的副本

dcoker commit -m="描述信息" -a="作者" 容器id 目标镜像名 : [tag]

实战测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#启动tomcat
docker run -it -p 8080:8080 tomcat:9.0
#发现tomcat webapps文件夹下面没有东西,官方默认没有文件
#将webapps.dist文件夹下的所有东西拷贝到 webapps下

#将自己修改过的容器commit为新的镜像
docker commit -m="add webapps app" -a="yang" 673f2ff6d8b3 tomcat_self:1.0

#查看
root@centosstudy opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat_self 1.0 9daf8122ba54 About a minute ago 685MB #自己提交的镜像
tomcat 9.0 b8e65a4d736d 19 months ago 680MB #原来的镜像


==可以通过commit的方式保存当前容器的状态,获得一个新的镜像==

8、容器数据卷

什么是容器数据卷

Docker 容器数据卷(Container Volumes)是一种用于在容器和主机之间持久存储数据的机制。数据卷允许容器在运行时共享数据,并且数据在容器删除后仍然保留。这对于在容器中保存应用程序数据、配置文件、数据库等非常有用,因为容器本身是临时性的,不适合长期存储数据。-

作用:

  1. 解决数据持久化

  2. 将容器中的数据同步到本地

image-20230810173517072

  1. 容器之间的数据可以共享

数据卷的使用

方式一

docker run -it -v 主机目录:容器目录 镜像名

指定路径: 使用 -v--volume 选项来创建数据卷并将其挂载到容器中。例如:

1
docker run -d -v /host/path:/container/path my_image

这会将主机上的 /host/path 目录挂载到容器内的 /container/path 目录。

1
[root@centosstudy opt]# docker run -it -v /opt/test:/home centos /bin/bash

image-20230810175946925

image-20230810180025171

容器中的数据和主机中数据会进行一个双向绑定

方式二

匿名数据卷: 如果不指定主机路径,Docker 会自动生成一个匿名数据卷,并将其自动挂载到容器中。例如:

1
docker run -d -v /container/path my_image

方式三

具名数据卷:

1
docker run -d -P --name nginx01 -v volumeName:/etc/nginx nginx 

具名和匿名

docker volume ls 查看所有数据卷

1
2
3
4
5
6
7
8
#具名
docker run -d -P --name nginx01 -v volumeName:/etc/nginx nginx

#匿名
docker run -d -P --name nginx02 -v /etc/nginx nginx

#查看挂在路径
docker volume inspect VOLUME NAME(卷名)

没有指定目录的情况下默认在主机 /var/lib/docker/volumes/xxx/_data下面

如何判断是具名还是匿名

1
2
3
-v 容器内路径       #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主路径:容器内路径 #指定路径挂载
1
2
3
4
5
6
7
#说明/etc/nginx这个路径只能通过主机来操作,容器内部无法操作
docker run -d -P --name nginx01 -v volumeName:/etc/nginx:ro nginx

docker run -d -P --name nginx01 -v volumeName:/etc/nginx:rw nginx

ro 只读
rw 读写

实战mysql

1
2
3
4
5
6
7
[root@centosstudy opt]# docker run -d \ 后台运行
> -p 3310:3306 \
> -v /opt/mysql/conf:/etc/mysql/conf.d \
> -v /opt/mysql/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=123456 \ #配置密码
> --name mysql01 \
> mysql:5.7

9、DockerFile

Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。它包含一系列的指令和配置,用于描述如何从一个基础镜像构建出一个新的、自定义的镜像。通过编写 Dockerfile,您可以定义容器所需的环境、软件包、设置和配置,使得镜像的构建过程更加可重复、可自动化和可管理。

两个命令

docker build 基于 Dockerfile 构建自定义的 Docker 镜像

1
2
3
docker build -f mydockerfile_centos -t mycentos:latest
-t 或 --tag:为构建的镜像指定标签,格式为 name:tag。
-f 或 --file:指定要使用的 Dockerfile 路径(默认为当前目录下的 Dockerfile 文件)

docker history 镜像id/名称

查看 Docker 镜像的历史记录、显示了镜像是如何构建的,每个层次的操作和命令。

image-20230811005646486

示例

编写dockerfile文件

1
2
3
4
5
6
7
FROM centos

VOLUME ["volume01","volume02"] #匿名挂载

CMD echo "---end---"

CMD /bin/bash

根据文件构建镜像

1
docker build -f dockerfile1 -t opt/cent

启动镜像

1
2
3
4
5
6
7
8
[root@centosstudy opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
opt/centos latest 16e3ab910713 3 hours ago 231MB
centos latest 5d0da3dc9764 23 months ago 231MB
[root@centosstudy opt]# docker run -it 16e3ab910713 /bin/bash
[root@e3257651544e /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01

查看数据卷挂载路径

docker inspect 16e3ab910713

image-20230810223056016

如果构建的时候没有挂载卷,启动的时候手动使用-v挂载

构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

官方centos dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

构建过程

基础知识

  1. 每个关键字都是大写
  2. 按从上到下的顺序执行
  3. 每一个指令都会创建一个新的一层,并提交

image-20230810232918675

dockerfile是面向开发的

dockerImages: 通过dockerfile构建生成的镜像,最终发布和运行

docker容器:容器就是镜像运行提供服务的

常见指令

  1. FROM: 指定基础镜像,新镜像将从该基础镜像构建。

    1
    FROM ubuntu:20.04
  2. RUN: 在构建过程中运行命令,用于安装软件、配置环境等。

    1
    RUN apt-get update && apt-get install -y nginx
  3. COPY 和 ADD: 将文件从主机复制到镜像中。

    1
    ADD http://example.com/file.tar.gz /tmp/
  4. WORKDIR: 设置工作目录,指定容器内的工作路径。

    1
    WORKDIR /app
  5. ENV: 设置环境变量。

    1
    ENV DEBUG=true
  6. EXPOSE: 声明容器运行时监听的端口。暴露端口

    1
    EXPOSE 80
  7. CMD 和 ENTRYPOINT: 定义容器启动时要执行的默认命令或入口点。

    1
    2
    ENTRYPOINT ["nginx", "-g", "daemon off;"] #可以追加命令
    CMD ["bash"] # 只有最后一个命令你会生效
  8. VOLUME: 声明数据卷。

    1
    VOLUME /data
  9. USER: 设置执行命令的用户。

    1
    USER appuser
  10. ARG: 声明构建时的参数,可以在构建过程中传递值。

    1
    ARG version=latest
  11. LABEL: 添加镜像元数据标签。

    1
    LABEL maintainer="john@example.com"
  12. ONBUILD: 在父镜像被用作基础镜像时执行命令。

    1
    ONBUILD COPY . /app
  13. HEALTHCHECK: 定义容器的健康检查。

    1
    HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost/ || exit 1

实战一:centos镜像

centos官方镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM scratch #最基础的镜像
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

创建一个自己的centos

编写dockerfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM centos:7

LABEL maintainer="914405257@qq.com"

ENV MYPATH /usr/local

WORKDIR $MYPATH #指定工作目录

RUN yum install -y vim net-tools && \
yum clean all

EXPOSE 80

CMD /bin/bash -c "echo $MYPATH && echo ---end--- && /bin/bash"

使用docker build构建

1
2
3
docker build -f mydockerfile_centos -t mycentos:latest
-t 或 --tag:为构建的镜像指定标签,格式为 name:tag。
-f 或 --file:指定要使用的 Dockerfile 路径(默认为当前目录下的 Dockerfile 文件)

image-20230811002534781

运行镜像

1
2
3
4
5
6
7
8
9
[root@centosstudy dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos latest 3d83cb197935 19 minutes ago 284MB
centos 7 eeb6ee3f44bd 23 months ago 204MB
[root@centosstudy dockerfile]# docker run -it 3d83cb197935
/usr/local
---end---
[root@dbb62734bcfa local]#

image-20230811004746902

CMD 和 ENTRYPOINT

CMD

1
2
3
4
5
6
7
8
9
#文件
FROM centos:7
CMD ["ls","-a"]

#构建
docker build -f mydockerfile_test -t cmdtest .

#运行
docker run cmdtest

image-20230811010715441

测试docker run cmdtest -l

image-20230811011521649

ENTRYPOINT

1
2
3
4
5
6
FROM centos:7
ENTRYPOINT ["ls","-a"]

docker build -f mydockerfile_entrypoint -t entrypointtest .

docker run 61c554663d00

image-20230811012056827

测试docker run entrypointtest -l

image-20230811012150902

结论:

  • CMD 方式在运行的时候会替换原来的命令
  • ENTRYPOINT 方式在运行的时候是在原有的命令上进行追加

实战二:Tomcat镜像

2023/08/11

  1. 准备压缩包

image-20230811133825124

  1. 编写dockerfile文件,官方命名 Dockerfile,bulid的时候会自动寻找这个文件,就不需要通过-f指定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM centos:7

LABEL maintainer="914405257@qq.com"

ADD apache-tomcat-9.0.65.tar.gz /usr/local/
ADD jdk-8u341-linux-x64.tar.gz /usr/local/

RUN yum -y install vim \
&& yum clean all

ENV MYPATH /usr/local

ENV JAVA_HOME /usr/local/jdk1.8.0_341
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

EXPOSE 8080
WORKDIR $MYPATH

CMD ["/bin/bash", "-c", "/usr/local/apache-tomcat-9.0.65/bin/startup.sh ; /bin/bash"]
  1. 构建镜像
1
docker build -t diytomcat .

image-20230811142823520

4、运行镜像

1
docker run -it --name tomc 157dd3e8860f

image-20230811161219867

发布自己的镜像

docker hub

  1. 在dockerhub上注册账号
  2. 确定账号可以登录
  3. 在服务器上提交的自己的镜像
1
2
3
4
#登录
docker login -u username

docker push 仓库名/images:tag

阿里云镜像仓库

#10、数据卷容器

数据共享

1.启动一个opt/centos容器,重命名为docker01

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
[root@centosstudy opt]# docker run -it --name docker01 opt/centos
[root@b4e925d2cdd2 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Aug 10 14:40 dev
drwxr-xr-x. 1 root root 66 Aug 10 14:40 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 232 root root 0 Aug 10 14:40 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Aug 10 05:55 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
drwxr-xr-x. 2 root root 6 Aug 10 14:40 volume01 #数据卷
drwxr-xr-x. 2 root root 6 Aug 10 14:40 volume02 #数据卷

2.启动一个opt/centos容器,重命名为docker02,并继承docker01(数据卷容器)

1
2
[root@centosstudy _data]# docker run -it --name docker02 --volumes-from docker01 opt/centos
# docker02 容器会继承 docker01 容器的数据卷。这样可以在 docker02 容器中访问与 docker01 共享的数据。请确保在 docker01 容器中已经创建了数据卷,以便它可以在 docker02 中使用。

结论:

数据卷容器的生命周期一直持续到没有容器使用为止

11、docker网络

12、springboot项目打包

  1. 新建一个springboot 项目

  2. 在根目录创建一个Dockerfile文件

1
2
3
4
5
FROM java:8

COPY *.jar /app.jar

CMD ["java","-jar","/app.jar"]
  1. 将springboot项目打包
  2. 放入服务器一个文件夹下

image-20230811181358929

  1. 执行构建命令
1
docker build -t testname .
  1. 运行镜像文件
1
docker run -d -p 8080:8080 testname 
  1. 访问运行

13、docker-compose

什么是docker-compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许你通过一个单独的配置文件来定义多个容器、它们之间的关系以及运行参数。使用 Docker Compose,你可以轻松地创建、管理和启动由多个容器组成的复杂应用程序。

==多服务部署工具==

核心概念:

  • 一个文件:docker-compose.yml
  • 两个要素:
    • 服务:一个个应用容器实例
    • 工程:由一组容器组成的完整业务单元

安装

1
2
3
4
5
sudo curl -L "https://github.com/docker/compose/releases/download/{desired_version}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

#将 {desired_version} 替换为你想要安装的 Docker Compose 版本号,例如 1.29.2。

常用命令

  1. docker-compose up: 启动应用程序的容器。如果配置文件中不存在容器,它会首先创建它们。如果容器已存在,它会重新启动它们。

  2. docker-compose up -d: 以后台模式启动容器,不会在终端输出容器日志。

  3. docker-compose down: 停止并移除容器、网络和卷等资源。这会执行与配置文件相反的操作。

  4. docker-compose ps: 列出正在运行的容器,并显示它们的状态。

  5. docker-compose logs: 查看容器的日志输出。默认会显示所有容器的日志。

  6. docker-compose logs : 查看特定服务(容器)的日志输出。

    1
    docker-compose logs myapp
  7. docker-compose exec : 在运行中的容器中执行特定命令。

    1
    docker-compose exec webapp bash
  8. docker-compose build: 根据配置文件中的定义构建 Docker 镜像。

  9. docker-compose pull: 从镜像仓库拉取最新的镜像版本,以确保使用最新版本。

  10. docker-compose restart: 重新启动服务中的容器。

  11. docker-compose stop: 停止正在运行的容器,但不移除它们。

  12. docker-compose start: 启动之前停止的容器。

  13. docker-compose config -q

巨坑!主机和docker中端口不同然后做了映射的话,如果用了mysql作为ip那么连的是容器中mysql的端口;如果用的是主机地址作为ip那么连的是主机的端口

docker-compose.yml

工程=多个服务(容器应用实例)

后续更新