DockerFile
什么是dockerfile 就是用来构建docker镜像的构建文件
我们先使用命令脚本体验一下
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
1 | # FROM centos 使用什么系统作为基础 |
构建镜像命令
1 | # 命令语法 |
1 | # 进入我们自己的镜像 可以看到我们挂载的目录 |
测试文件是否可以同步,如果同步成功表示测试数据卷挂载成功
这种方式我们未来使用特别多,因为通常我们要构建自己的镜像
假设构建镜像的时候没有挂载卷,需要手动挂载镜像 -v卷名 容器内路径
数据卷容器
例如多个MySQL同步数据
1 | # 首先启动一个镜像作为父容器 |

当我们在启动一个容器去挂载docker01的时候是否可以也同步一下父容器数据卷的内容呢?
只要通过 –volumes-from 就可以对容器之间进行绑定,达到数据共享
继承继承了父容器的容器

直接继承父容器

如果删除了父容器,其他继承了父容器的容器数据还会存在吗
答案是会的

多个Mysql之间该如何共享数据呢?
1 | # 先运行一个MySQL |
总结
容器之间配置信息传递,数据卷容器的声明周期,一直持续到没有容器使用位置
但是一旦你持久化到了本地,本地的数据是不会消失滴
Dockerfile
dockerfile是用来构建docker镜像文件!命令参数脚本
构建步骤
- 编写一个dockerfile文件
- docker build 命令构建成为一个镜像
- docker run运行镜像
- docker push 镜像发布
查看一下官方是怎么做的


很多官方镜像都是基础包,很多功能都没有,我们通常会搭建自己的镜像
官网既然可以制作镜像,我们自己也可以做镜像
Dockerfile的构建
- 它其中有很多指令
- 基础知识
- 每个保留关键字(指令) 都要是大写
- 从上到下按顺序执行
- #表示注释
- 每一个指令都会创建提交一个镜像层,并提交

docker是面向开发的,以后我们要发布项目,做镜像,就需要编写dockerfile,这个文件十分简单
docker 镜像逐渐成为企业交付的标准,必须要掌握
dockerfile:构建文件,定义了一切的步骤,源代码
dockerimages:通过dockerfile构建生成的一个镜像,最终发布和运行产品
docker容器:容器就是镜像运行起来提供服务器
Dockerfile指令
以前的话我们就是使用别的,知道了这些指令之后,我们就可以练习自己写一个镜像
FROM # 基础镜像命令,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候,运行的命令
ADD # 步骤:如我们需要tomcat镜像 ,这个tomcat的压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口
CMD # 指定这个容器启动的时候要运行的命令,只有一个会生效
ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令
ONBUILD # 但构建一个被继承的Dockerfile,这个时候就会运行 ONBUILD的指令
COPY # 类似,将我们的文件拷贝到镜像中
ENY #构建的时候设置环境变量
实战测试
自己构建一个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
26
27# 编写Dockerfile文件
FROM centos
MAINTAINER liufugui<2677672@gmail.com>
ENV MYPATH /usr/local
# 官方默认是根目录,我们添加了一个目录
WORKDIR $MYPATH
# 我们自己加需要的命令
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install lrzsz
EXPOSE 80
CMD echo $MYPATH
CMD echo "构建完毕"
CMD /bin/bash
# 通过文件构建镜像
# docker build -f /home/dockerfile/mydockerfile -t fugui/centos:1.0 .
# 测试运行一下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# 我们可以列出本地变更历史
docekr history 镜像id
root@again:/home/dockerfile# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fugui/centos 1.0 0f5e9610ea55 8 minutes ago 317MB
sky_linux 1.0 848f350d368c 5 hours ago 272MB
liufugui/centos 1.0 6e86c0c4da67 5 hours ago 215MB
tomcat_fg 9.0 8c3e700c6f6c 11 hours ago 653MB
tomcat 9.0 625b734f984e 4 days ago 648MB
tomcat latest 625b734f984e 4 days ago 648MB
mysql 5.7 1b12f2e9257b 4 days ago 448MB
nginx latest f35646e83998 2 weeks ago 133MB
centos latest 0d120b6ccaa8 2 months ago 215MB
elasticsearch 7.6.2 f29a1ee41030 7 months ago 791MB
root@again:/home/dockerfile# docker history 0f5e9610ea55
IMAGE CREATED CREATED BY SIZE COMMENT
0f5e9610ea55 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
c0ee469aa206 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
cbe1a7249e42 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
81333008bb15 9 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
6bdc5588527b 9 minutes ago /bin/sh -c yum -y install lrzsz 22.3MB
e2e9394c2227 9 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
41300cae6449 9 minutes ago /bin/sh -c yum -y install vim 57.2MB
9fd920f9f252 9 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
17226e1ebedf 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
c3fd2e7e8234 9 minutes ago /bin/sh -c #(nop) MAINTAINER liufugui<26776… 0B
0d120b6ccaa8 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MBCMD 命令和 ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令,只有一个会生效
ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令CMD
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# 编写CMD命令
FROM centos
CMD ["ls","-a"]
# 构建成镜像
docker build -f docker-cmd -t cmdtest:1.0 .
# 执行cmdtest镜像
# 执行结果
# 发现我们脚本的CMD命令生效了
root@again:/home/dockerfile# docker run cmdtest:1.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 我们再执行这个镜像并给他添加命令
# 发现最后运行报错了 因为我们使用 -l的情况下,再启动镜像就会替换了镜像的命令 而且没有 -l 这个命令所以报错
root@again:/home/dockerfile# docker run cmdtest:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
# 当我们使用正确的命令的时候呢,就会替换掉原来的CMD命令
root@again:/home/dockerfile# docker run cmdtest:1.0 ls -al
total 56
drwxr-xr-x 1 root root 4096 Oct 27 11:47 .
drwxr-xr-x 1 root root 4096 Oct 27 11:47 ..
-rwxr-xr-x 1 root root 0 Oct 27 11:47 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Oct 27 11:47 dev
drwxr-xr-x 1 root root 4096 Oct 27 11:47 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 137 root root 0 Oct 27 11:47 proc
dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Oct 27 07:13 sys
drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
drwxr-xr-x 20 root root 4096 Aug 9 21:40 varENTRYPOINT
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# 创建docker entrypoint测试脚本
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建脚本为镜像
# 执行结果
root@again:/home/dockerfile# docker build -f docker-cmd-entrypoint -t cmdtestentrypoint:1.0 .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 0d120b6ccaa8
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 41bad47522f3
Removing intermediate container 41bad47522f3
---> b33a7962ae91
Successfully built b33a7962ae91
Successfully tagged cmdtestentrypoint:1.0
# 启动镜像
# 启动成功后,执行我们的脚本命令
root@again:/home/dockerfile# docker run b33a7962ae91
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 测试执行的时候在后面添加别的命令
# 发现在添加之后他不会报错,直接追加到前面的命令后
root@again:~# docker run b33a7962ae91 -l
total 56
drwxr-xr-x 1 root root 4096 Oct 27 11:57 .
drwxr-xr-x 1 root root 4096 Oct 27 11:57 ..
-rwxr-xr-x 1 root root 0 Oct 27 11:57 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Oct 27 11:57 dev
drwxr-xr-x 1 root root 4096 Oct 27 11:57 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 138 root root 0 Oct 27 11:57 proc
dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Oct 27 07:13 sys
drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
drwxr-xr-x 20 root root 4096 Aug 9 21:40 var注意注意注意:如果自己构建的时候说命令错误注意空格问题
实战tomcat和jdk镜像
- 准备镜像文件 tomcat压缩包,jdk压缩包
- 编写Dockerfile文件 官方命名Dockerfile build的时候会自动寻找这个文件,就不需要-f指定了
1 | FROM centos |
当我们的命令敲完之后呢,构建镜像
1 | docker build -t 自定义镜像名:[TAG] . |
构建完镜像,我们启动容器并配置挂载卷
1 | docker run -d -p 8080:8080 --name liufugui -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps -v /home/tomcat/logs:/usr/local/apache-tomcat-9.0.37/logs myself:1.0 |
打开tomcat,在浏览器访问tomcat
发布自己的镜像
发布自己的镜像到DockerHub
- 在官网 https://hub.docker.com/ 上注册自己的账号
- 确保账号可以登录
- 在我们的服务器上提交自己的镜像
1 | # 在服务器上登录账号 |
提交到自己的仓库需要注意
**提交的时候镜像命令要是你的dockerhub名称加上镜像名加上:TAG标记,这样就可以提交成功了(意思就是你的镜像名称必须为你的dockerhub名称加上你的镜像名和版本号)
例如你的dockerHub用户名为 hello
你提交的镜像名称必须为 hello/镜像名:tag**
[root@mylinux ~]# docker push sky0429/mytomcat:1.0
The push refers to repository [docker.io/sky0429/mytomcat]
12ce4d49a2bf: Pushed
b1f6ac31789f: Pushed
a0ff47fa59d6: Pushed
291f6e44771a: Pushed
1.0: digest: sha256:047b039ac9326c10471ec6ce530c453efdea5925e12b02ce921c01a34e6b0ae9 size: 1166
小结







