前言:

推荐免费Docker基础讲解视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

具名挂载和匿名挂载

匿名挂载

1
2
3
4
5
6
7
8
9
10
11
12
# 匿名挂载,注意这里使用-P表示指定随机的端口号,没有指定主机的位置信息; 
# -v容器内路径
[root@jokerdig ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
f13b823d6bbde0876e080b490bf974a39c11949cba82e638a26c6807ee43c57d
# 查看所有卷
[root@jokerdig ~]# docker volume ls
DRIVER VOLUME NAME
local 0b7c8a9289fab16486681cc604987d65793fd173ef917efed20b9de2f6ea980c
local 2ecc011bbb8b7961e2097456c4bd31e837f83157c24bb6e72c0f48def108d697
local 08d6ee16e5fab4ad0faf5b1bfc4db99414e803fcbdee9aafad91b3a502e6e4cc
local 85333e36603577dd8210031bd7a29a7c1e395e1cb942b09dac7392e3db4468cc
local e04224546a6e7d3c149224a3395a5b363a8a09708fb1e4f6d04e8fbfdc59a100

具名挂载

1
2
3
4
5
6
7
8
9
10
11
12
# 具名挂载
[root@jokerdig ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
a0fe31db4a537aaf815c315be80e4a184a34537efb96cd929b9bfcd3405b57cd
# 查看所有卷
[root@jokerdig ~]# docker volume ls
DRIVER VOLUME NAME
local 0b7c8a9289fab16486681cc604987d65793fd173ef917efed20b9de2f6ea980c
local 2ecc011bbb8b7961e2097456c4bd31e837f83157c24bb6e72c0f48def108d697
local 08d6ee16e5fab4ad0faf5b1bfc4db99414e803fcbdee9aafad91b3a502e6e4cc
local 85333e36603577dd8210031bd7a29a7c1e395e1cb942b09dac7392e3db4468cc
local e04224546a6e7d3c149224a3395a5b363a8a09708fb1e4f6d04e8fbfdc59a100
local juming-nginx # 看到具名挂载

查看卷在容器中的位置

1
2
3
4
5
6
7
8
9
10
11
12
[root@jokerdig ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-09-24T11:00:17+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 在容器中的路径
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]

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

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

如何确定是匿名挂载还是具名挂载,还是指定路径挂载

1
2
3
-v 容器内路径 # 匿名挂载 
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载

拓展

1
2
3
4
5
6
7
# 通过 -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

初识Dockerfile

Dockerfile就是用来构建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
[root@jokerdig docker-test-volume]# vim dockerfile1

# 通过脚本生成镜像
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-------end--------"
CMD /bin/bash

# 查看 dockerfile1
[root@jokerdig docker-test-volume]# cat dockerfile1
# 通过脚本生成镜像
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-------end--------"
CMD /bin/bash

# 构建镜像
[root@jokerdig docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t jokerdig/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 652d0791c5b2
Removing intermediate container 652d0791c5b2
---> bf974fab8280
Step 3/4 : CMD echo "-------end--------"
---> Running in d3ceb57280a4
Removing intermediate container d3ceb57280a4
---> 1483a7b063c7
Step 4/4 : CMD /bin/bash
---> Running in 3176bbbcae0c
Removing intermediate container 3176bbbcae0c
---> 1c6767a3e585
Successfully built 1c6767a3e585
Successfully tagged jokerdig/centos:1.0

# 查看生成的镜像
[root@jokerdig docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jokerdig/centos 1.0 1c6767a3e585 47 seconds ago 231MB

查看自己挂载的目录

image-20220924114344354

数据卷容器

image-20220924115154807

启动3个容器,通过我们刚刚写的镜像启动

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
# 查看镜像
[root@jokerdig home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE PORTS NAMES
jokerdig/centos 1.0 1c6767a3e585 27 minutes ago 231MB docker01
# 启动第一个容器
[root@jokerdig home]# docker run -it --name docker01 1c6767a3e585
# 查看容器根目录内容
[root@90db9d80811c /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Sep 24 03:55 dev
drwxr-xr-x 1 root root 4096 Sep 24 03:55 etc
drwxr-xr-x 2 root root 4096 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 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 195 root root 0 Sep 24 03:55 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Sep 24 03:55 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Sep 24 03:55 volume01
drwxr-xr-x 2 root root 4096 Sep 24 03:55 volume02
[root@90db9d80811c /]#
# 启动第二个容器 Ctrl+P+Q退出
[root@jokerdig home]# docker run -it --name docker02 --volumes-from docker01 1c6767a3e585
[root@a90e37775954 /]#
# 启动第三个容器 Ctrl+P+Q退出
[root@jokerdig home]# docker run -it --name docker03 --volumes-from docker01 1c6767a3e585
# 我们在docker03的volume01里创建docker03文件
[root@244dd7e798c7 /]# cd volume01
[root@244dd7e798c7 volume01]# touch docker03
[root@244dd7e798c7 volume01]# ls
docker03
# 我们进入docker01的volume01
[root@jokerdig home]# docker attach docker01
[root@8b37a916e5db /]# cd volume01
[root@8b37a916e5db volume01]# ls
docker03 # 可以看到docker03,说明它们之间数据互通

测试 :可以删除容器dcoker01,查看docker02和docker03时候还可以访问这个文件

结论

容器之间配置信息的传递,数据卷容器的生命周期这一直持续到没有容器使用为止,但是一旦持久化到了本地,这个时候,本地的数据不会被删除;

Dockerfile介绍

Dockerfile是用来构建docker镜像的文件,命令参数脚本

构建步骤

  1. 编写一个Dockerfile文件;

  2. docker build构建为一个镜像

  3. docker run 运行镜像

  4. docker push发布镜像(DockerHub、阿里云镜像仓库)

查看官方实例

image-20220924125736431

CentOS Dockerfile - github.com

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"]

构建过程

基础知识:

  • 每个保留关键字(指令)都是必须是大写字母
  • 执行从上到下顺序执行;
  • #表示注释;
  • 每一个指令都会创建提交一个新的镜像层,并提交;

image-20220924131252771

Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件;

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

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

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品;

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

Dockerfile指令说明

1
2
3
4
5
6
7
8
9
10
11
12
FROM  # 基础镜像FROM,一般在开头位置;
MAINTAINER # 镜像的作者,格式:姓名+邮箱;
RUN # 镜像构建的时候需要运行的命令;
ADD # 添加内容;
WORKDIR # 镜像工作目录;
VOLUME # 挂载的目录;
EXPOSE # 暴露端口配置;
CMD # 指定容器运行时的shell命令,只有最后一个生效,可被替代;
ENTRYPOINT # 指定容器运行时的shell命令,可以追加命令;
ONBUILD # 当构建一个被继承Dockerfile这个还是会就会运行ONBUILD的指令,触发指令;
COPY # 类似ADD,将我们文件拷贝到镜像中;
ENV # 构建的时候设置环境变量;