1.是什么
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2.构建三步骤
- 编写Dockerfile文件
- docker build 生成镜像
- docker run 镜像
3.Dockerfile构建过程解析
1)Dockerfile内容基础知识
2)docker执行dockerfile大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit 的操作提交一个新的镜像层
- docker在基于刚提交的镜像运行一个容器
- 执行Dockerfile的下一条指令直到所有指令都执行完成
3)抽象
- Dockerfile ——> .class
- Docker镜像 ———> jar
- Docker容器 ———-> 运行的jar
4.Dockerfile保留字指令
FROM:基础镜像,当前新的镜像是基于哪个镜像的
MAINTAINER:镜像维护者的名字和邮箱
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV:用来在构建镜像过程中设置环境变量
这个环境变量可以再后续任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样
也可以在其他指令中直接使用
ENV MY_PATH/usr/local
WORKDIR $MY_PATH
ADD:拷贝并解压
COPY:拷贝
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD命令,但是只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT:指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像再被子镜像继承后,父镜像的onbuild被触
5.自定义镜像mycentos
Base镜像:类似java的Object,99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
1.编写
vim Dockerfile
-------------------------------------------
from centos
#基础系统是centos
maintainer yhd<1972039773@qq.com>
#作者邮件
env mypath /tmp
#我的路径
workdir /tmp
#开始工作目录 $mypath
run yum -y install vim
#安装vim
run yum -y install net-tools
expose 80
#暴露的端口
cmd echo $mypath
cmd echo "success---ok!"
cmd /bin/bash
--------------------------------------------
2.构建
docker build -f /root/Dockerfile -t mycentos:1.3
3.运行
docker images 查看所有镜像,发现已经有了
docker run -it mycentos:1.3
4.列出镜像的变更历史
docker history mycentos:1.3
6.cmd-entrypoint命令案例
1)cmd ls
docker build -f /root/Dockerfile -t mil:1.1 .
docker run -it mil -al 会报错
因为命令行追加的参数会覆盖原有的cmd命令ls
2)entrypoint ls
docker build -f /root/Dockerfile -t mi2:1.1
docker run -it mi2 -al 会执行ls -al
因为命令行追加的参数会与上一条命令合在一起 ls -al
7.onbuild命令
子镜像继承了父镜像,子镜像运行的时候,父镜像onbuild的命令就会执行
类似父类构造器写的代码,会在子类实例化以后执行
8.自定义tomcat9
mkdir yhd
cd yhd
touch c.txt
cp /opt/apache-tomcat-9.0.8.tar.gz /root/yhd/
cp /opt/jdk-1.8.tar.gz /root/yhd/
vim Dockerfile
----------------------
from centos
maintainer yhd<1972039773@qq.com>
#吧c.txt拷贝到/usr/local/cincontainer.txt
copy c.txt /usr/local/cincontainer.txt
#吧java和tomcat添加到容器中
add jdk -1.8.tar.gz /usr/local/
add apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
run yum -y install vim
#设置家目录
env mypath /usr/local
workdir #mypath
#配置java和tomcat环境变量
env java_home /usr/local/jdk-1.8
env classpath $java_home/lib/dt.jar:$java_home/lib/tools.jar
env catalina_home /usr/local/apache-tomcat-9.0.8
env catalina_base /usr/local/apache-tomcat-9.0.8
env path $path:$java_home/bin:$catalina_home/lib:$catalina_home/bin
#容器运行时监听的端口
expose 8080
#启动时运行tomcat
#entrypoint ["/usr/local/apache-tomcat-9.0.8/binstartup.sh"]
#cmd ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
cmd /usr/local/apache-tomcat-9.0.8/bin/startup.sh&& tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
----------------------
#构建
docker build -t yhdTomcat9:1.1 .
#如果dockerfile文件在当前目录下且就叫Dockerfile,可以省略 -f /root/yhd/Dockerfile
#运行
docker run -d -p 9080:8080 --name myt9 -v /root/yhd/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test --privileged=true
yhdTomcat9:1.1
9.总结
使用本地docker实例运行dockerfile
docker build ->image镜像
docker run ->docker 容器
容器->commit ->镜像->push <-pull