一、 docker file介绍
dockerfile就是用来构建docker镜像的构建文件,命令参数脚本。
构建步骤:
1、编写一个dockerfile 文件
2、docker build构建成为一个镜像
3、docker run 运行镜像
4、docker pusH 发布镜像(Docker Hub 、阿里云镜像仓库)
查看一下官方是怎么做的
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方既然可以制作镜像,那我们也可以
二、Dockerfile 构建过程
2.1基础知识
1 每个保留关键字(指令)都是必须是大写字母
2 执行从上到下顺序执行
3 # 表示注释
4 每一个指令都会创建一个新的镜像层,并提交
2.2步骤:开发,部署,运维,缺一不可
Dockerfile:构建文件,定义了一切的步骤,源代码
Dockermages:通过Dockerfile 构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
三、Dockerfile 的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,名字+邮箱
RUN #镜像构建的时候被需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像的挂载目录
VOLUME #挂载的目录
EXPOST #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有之后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量
四 、测试
4.1 编写Dockerfile 的文件
[root@node143 dockerfile]# vim mydockerfile
FROM centos
MAINTAINER xiaoshimei<12345645@qq.com>
ENV MYPATH /usr/locat
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo"----end----"
CMD /bin/bash
4.2通过这个文件构建镜像
#命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]版本号
docker build -f mydockerfile -t mydockerfile:0.1 .
构建成功最底部会显示这两行
Successfully built 29f50f45bc0b
Successfully tagged mydockerfile:0.1
#3 测试运行
[root@node143 dockerfile]# docker run -it mydockerfile:0.1
[root@5115d212f2c2 locat]# pwd
/usr/locat
对比:之前的原生的centos
我们增加之后的镜像
#我们可以列出本地镜像的变更历史
查看现有的镜像
[root@node143 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mydockerfile 0.1 29f50f45bc0b 26 minutes ago 291MB
nginx latest f6d0b4767a6c 2 months ago 133MB
foxiswho/rocketmq 4.8.0 ccdf2960021a 2 months ago 505MB
styletang/rocketmq-console-ng latest 7df83bb6e638 3 years ago 702MB
通过 docker history +镜像ID 可以查看当前镜像构成历史
[root@node143 dockerfile]# docker history 29f50f45bc0b
IMAGE CREATED CREATED BY SIZE COMMENT
29f50f45bc0b 26 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
ad88d26c0c57 26 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
025d57b9faec 26 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
e224252e8c18 26 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
eb920921d222 26 minutes ago /bin/sh -c yum -y install net-tools 23.4MB
3c70319360e9 31 minutes ago /bin/sh -c yum -y install vim 58.1MB
ba3d8a11d96e 31 minutes ago /bin/sh -c #(nop) WORKDIR /usr/locat 0B
87e3e7c84495 31 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/locat 0B
140dd8dc67e8 31 minutes ago /bin/sh -c #(nop) MAINTAINER xiaoshimei<123… 0B
300e315adb2f 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
我们平时拿到一个镜像,可以研究一下它是怎么做到的
####################################################
五、 CMD 和ENTRYPOINT 区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
5.1测试 cdm
#编写dockerfile文件
[root@node143 dockerfile]# vim dockerfile-cmd-test
#写入
FROM centos
CMD ["ls","-a"],
#构建文件
[root@node143 dockerfile]# docker build -f dockerfile-cmd-test -t cmdtset .
Sending build context to Docker daemon 217.6MB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"],
---> Running in 4dd090d39ebf
Removing intermediate container 4dd090d39ebf
---> b31e0a3e81b4
Successfully built b31e0a3e81b4
Successfully tagged cmdtset:latest
#run 运行,返回的结果就是脚本里写的需要执行 ls -a 的结果
[root@node143 dockerfile]# docker run b31e0a3e81b4
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
#想追加一个命令 -l ls -al 返回结果报错了
[root@node143 dockerfile]# docker run b31e0a3e81b4 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
#cmd 的情况下 -l 替换了 [“ls”,“-a”] 这个命令,所以执行不成功 ,因为 l 并不是命令
5.2测试ENTRYPOINT
#同样也是编写dockerfile文件,内容与之前的一样
[root@node143 dockerfile]# vim dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
#构建文件
[root@node143 dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entoryonit-test .
Sending build context to Docker daemon 217.6MB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 52fd4e3fc7f5
Removing intermediate container 52fd4e3fc7f5
---> 77d940efb3ad
Successfully built 77d940efb3ad
Successfully tagged entoryonit-test:latest
#运行
[root@node143 dockerfile]# docker run 77d940efb3ad
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
#我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令后面的 !
[root@node143 dockerfile]# docker run 77d940efb3ad -l
total 0
drwxr-xr-x 1 root root 6 Mar 16 14:38 .
drwxr-xr-x 1 root root 6 Mar 16 14:38 ..
-rwxr-xr-x 1 root root 0 Mar 16 14:38 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 16 14:38 dev
drwxr-xr-x 1 root root 66 Mar 16 14:38 etc
drwxr-xr-x 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 6 Dec 4 17:37 lost+found
后面追加命令是写原生命令的,说明是用CMD实现,如果追加的命令是加 “-”的,说明是用 ENTRYPOINT实现的
————————————————
版权声明:本文为优快云博主「iozzzzz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/clover661/article/details/114899909