Dockerfile是用来构建Docker镜像的构建文件,是由一系列的命令和参数构成的脚本
Dokcerfile的构建步骤
a) 编写Dokcerfile文件
b)docker build 生成新的镜像
c) docker run 运行镜像
FROM scratch #基于某个父镜像
ADD centos-7-x86_64-docker.tar.xz / 把宿主机里面的这个tar包添加并解压到容器
一些标签的设置
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="20191001"
#执行终端
CMD ["/bin/bash"]
以上的Dockerfile执行流程
FROM scratch #基于某个父镜像 生成一个镜像 使用生成的镜像再启动一个新的容器
ADD centos-7-x86_64-docker.tar.xz 把压缩包添加到上一行命令执行完之后运行的新的容器里面,再运行一个新的容器
LABEL org.label-schema.schema-version=“1.0” 在上一行命令执行完之后运行的新的容器里面添加一个LABEL 再运行一个新的容器
CMD ["/bin/bash"] 在上一个新的容器里面执行一个/bin/bash的命令 再生一个新的镜像
1,每条保留字指令都必须为大写字母后面要跟随至少一个参数
2,指令从上到下顺序执行
3,#表示注释
4,每条指令都会创建一个新的镜像层,并对镜像进行提交
1,docker从基础镜像运行一个容器
2,执行一条指令并对容器进行修改
3,执行类似于docker commit的操作提交一个新的镜像
4,docker再基于刚提交的新的镜像运行一个新的容器
5,执行dockerfile的下一个指令再从执行第2点直到没有指令
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
① Dockerfile是软件的原材料
② Docker镜像是软件的交付品
③ Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定在创建容器后,终端默认登陆进来的工作目录
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理URL和解压tar包
COPY 类似ADD,拷贝文件和目录到镜像中 ,语法COPY src dest COPY [’'src",“dest”]
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令格式CMD[‘ls’] run -it cenos -lh
shell: CMD <命令>
exec CMD [‘可执行文件’,“参数1”,“参数2”]
DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTEYPONT 指定一个容器启动时要运行的命令 ENTEYPORT [‘ls’] run -it cenos -lh
ENTRYPOINT的目地和CMD一样,都是在指定容器启动程序及参数
OBBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后触发父镜像的onbuild
docker Hub上99%的镜像都是通过base镜像中安装和配置需要的软件构建出来的
cd /mydocker
mkdir mycentos
touch Dockerfile
vi Dockerfile
docker build -f /root/mydocker/mycentos/Dockerfile -t mycentos:1.1 .
-f /root/mydocker/mycentos/Dockerfile 如果Dockerfile的文件是这个名字,可以不加
docker build -t mycentos:1.1 .
Dockerfile 中可以有多个CMD的命令,但只有最后一个生效,CMD会被docker run之后的参数替换掉
可以使用tomcat的案例演示
查看tomcat的Dockerfile
从上面的可以看出最后执行了一个catalina.sh的命令 相当于./bin/catalina.sh
运行如下命令,可以看出下图的效果
docker run -it -p 9999:8080 tomcat ls -lh
那是因为在启动容器的时候后面加了ls -lh那么会覆盖Dockerfile里面的 CMD [“catalina.sh”, “run”]
使用ENTRYPOINT来运行命令,在run 运行的参数会追加到新的命令后面
FROM centos
CMD [ "ls", "-a" ]
docker build -t myls:1.2 .
docker run -it myls:1.2 -lh
出现错误,这是因为Dockerfile里面使用的是CMD [“ls”, “-a”]运行是传一个-lh过去会覆盖
FROM centos
ENTRYPOINT [ "ls", "-a" ]
docker build -t myls:1.3 .
docker run -it myls:1.3 -l
发现 【 -l 】被追加到 ls 后面了哦
下载tomcat8
#创建目录
mkdir -p /mydocker/mytomcat
#进入目录
cd /mydocker/mytomcat
docker build -t mytomcat:1.0 .
docker run -it --name 'mytomcat-1' -p 9999:8080 mytomcat:1.0
https://ke.qq.com/course/469242?taid=3997450616908026&tuin=21f98a63
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。