文章目录
- 一、DockerFile介绍
- 二、DockerFile构建过程
- 三、DockerFile指令
- 四、实战测试
- 4.1 对比原生CentOS
- 五、CMD 和 ENTRYPOINT 的区别
- 5.1 测试CMD
- 5.2 测试ENTRYPOINT
一、DockerFile介绍
Dockerfile 是用来构建 docker 镜像的文件,命令参数脚本。
构建步骤:
- 编写一个 dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看官方是怎么操作的:
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那我们也可以。
二、DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行顺序是从上到下
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层并提交
dockerfile 是面向开发的,我们以后要发布项目、做镜像,就需要编写 dockerfile 文件,这个文件十分简单。
Docker 镜像逐渐成为企业交付的标准,必须要掌握。
步骤:开发、部署、运维,缺一不可
DockerFile:构建文件,定义了一切的步骤,类比源代码
DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品
Docker 容器:容器就是镜像运行起来提供服务的
三、DockerFile指令
下图为DockerFile部分指令:
指令介绍:
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,如tomcat镜像,add用来添加tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候需要运行的命令,可以追加命令
ONBUILD # 当构建的一个镜像被另一个镜像继承时,会运行ONBUILD指令,触发指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
四、实战测试
Docker Hub 中99%的镜像都是从 FROM scratch
开始的,然后配置需要的软件和配置来进行构建。
创建一个自己的 centos
# 1.编写dockerfile文件
[root@wyc dockerfile]# vim mydockerfile-centos
[root@wyc dockerfile]# cat mydockerfile-centos
FROM centos:7
MAINTAINER wyc<837279588@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
# 2.通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
[root@wyc dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.1 .
# 3.测试运行
[root@wyc dockerfile]# docker run -it mycentos:1.1
创建过程可能会出现的问题:
如遇以上报错,将 FROM centos
改成 FROM centos:7
即可!
我们可以通过 docker history 镜像id
列出本地进行的变更历史,入下图:
4.1 对比原生CentOS
原生CentOS:
我们自己创建的CentOS:
五、CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候需要运行的命令,可以追加命令
5.1 测试CMD
1、编写dockerfile文件
[root@wyc dockerfile]# vim dockerfile-cmd-test
[root@wyc dockerfile]# cat dockerfile-cmd-test
FROM centos:7
CMD ["ls","-a"]
2、构建镜像
[root@wyc dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos:7
---> eeb6ee3f44bd
Step 2/2 : CMD ["ls","-a"]
---> Running in fd77af3e32dc
Removing intermediate container fd77af3e32dc
---> bf5078099acc
Successfully built bf5078099acc
Successfully tagged cmdtest:latest
3、运行镜像,发现 ls -a 命令生效
[root@wyc dockerfile]# docker run bf5078099acc
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
想追加一个命令 -l —> ls -al
[root@wyc dockerfile]# docker run bf5078099acc -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
cmd的情况:-l 替换了 CMD [“ls”,“-a”] 命令,,-l 不是命令所以报错。
使用 docker run bf5078099acc ls -al
则能正常运行,但非常繁琐。
5.2 测试ENTRYPOINT
1、编写dockerfile文件
[root@wyc dockerfile]# vim dockerfile-entrypoint-test
[root@wyc dockerfile]# cat dockerfile-entrypoint-test
FROM centos:7
ENTRYPOINT ["ls","-a"]
2、构建镜像
[root@wyc dockerfile]# docker build -f dockerfile-entrypoint-test -t enrtypointtest .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos:7
---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 15f8bfa40759
Removing intermediate container 15f8bfa40759
---> 419abf4b7e1e
Successfully built 419abf4b7e1e
Successfully tagged enrtypointtest:latest
3、运行镜像,发现 ls -a 命令生效
[root@wyc dockerfile]# docker run 419abf4b7e1e
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
此时追加 -l 命令,发现可以运行。
追加的命令,是直接拼接在 ENTRYPOINT 命令的后面。
[root@wyc dockerfile]# docker run 419abf4b7e1e -l
total 12
drwxr-xr-x. 1 root root 6 Nov 21 08:26 .
drwxr-xr-x. 1 root root 6 Nov 21 08:26 ..
-rwxr-xr-x. 1 root root 0 Nov 21 08:26 .dockerenv
-rw-r--r--. 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Nov 21 08:26 dev
drwxr-xr-x. 1 root root 66 Nov 21 08:26 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 227 root root 0 Nov 21 08:26 proc
dr-xr-x---. 2 root root 114 Nov 13 2020 root
drwxr-xr-x. 11 root root 148 Nov 13 2020 run
lrwxrwxrwx. 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Nov 21 05:38 sys
drwxrwxrwt. 7 root root 132 Nov 13 2020 tmp
drwxr-xr-x. 13 root root 155 Nov 13 2020 usr
drwxr-xr-x. 18 root root 238 Nov 13 2020 var
Dockerfile 中很多命令都是十分相似的,我们需要了解它们的区别,最好的学习方式就是对比它们然后测试效果。