11.Dockerfile简介
1.是什么?
dockerfile是用来构建镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三步骤
- 编写dockerfile文件
- docker build命令构建镜像
- docker run依镜像运行的容器实列
2.dockerfile构建过程解析
1)dockerfile内容的基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
2)Docker执行dockerfile的大致流程
docker从基础镜像运行一个容器
执行一条指令并对容器做出修改
执行类似docker commit的操作提交一个镜像
docker在基于刚提交的镜像运行一个新的容器
执行dockerfile中的一条指令直到所有指令都执行成功
3)总结
- Dockerfile,需要定义一个Dockerile,Dockerle定义了进程需要的一切东西。Dockerile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等:
- Docker镜像,在用Dockerfile定义-个文件之后,docker build时会产生个Docker镜像,当运行 Docker镜像时会真正开始提供服务
- Docker容器,容器是直接提供服务的。
3.dockerfile常用的保留字指令
参考tomcat8的dockerfile入门:GitHub - docker-library/tomcat: Docker Official Image packaging for Apache Tomcat
- 1)FROM——基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from。
- 2)MAINTAINER——镜像维护者的名字和邮箱地址(这个镜像是谁做的)
- 3)RUN——容器构建的时候需要运行的命令/两种形式(shell格式、exec格式)/RUN是在docker build的时候运行
- 4)EXPORT——当前容器对外暴露的接口
- 5)WORKDIR——指定在创建容器后,终端默认登录的进来的工作目录,落脚点
- 6)USER——指定该镜像以什么样的用户去执行,如果不指定,默认为root
- 7)ENV——设置配置过程中的环境变量,可以在后续的任何RUN指令使用,这就如同在命令前面指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量。
- 8)ADD——将宿主机目录下的文件拷贝进镜像且会自动处理url和解压tar压缩包
- 9)COPY——类似于ADD,拷贝文件和目录到镜像中。
- 10)VOLUME——相当于-v参数
- 11)CMD —
- 指定容器启动之后要干的事情
- 注意
- dockerfile中可以多个cmd指令,但是只有一个生效,cmd会被docker run之后的参数替换
- 它和RUN命令的区别
- ENTPYPOINT
- 类似于cmd指令,但是ENTPYPOINT不会被docker run后面的指令覆盖,而且这些指令行参数会被当做参数送给ENTPYPOINT指令指定的程序
实际操作1:
Centos7镜像具备vim+ifconfig+jdk24
下面是我运行的centos的容器,可以发现没有这些东西
编写
首先要去下载一个jdk24包
上传到我们的服务器上
1.编写
[root@iZgw05jp5bgqy10yqsb1heZ myfile]# cat dockerfile
FROM centos
MAINTAINER yyyy@123.com
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看
RUM yum -y install net-tools
#安装java及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD是相对路径jar,需要把jdk-24_linux-x64_bin.tar.gz添加到与dockerfile文件同一文件夹下
ADD jdk-24_linux-x64_bin.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk-24_linux-x64_bin
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EXPOSE 80
CMD echo $MYPATH
CMD echo "success---------------ok"
CMD /bin/bash
报错了,这里是因为指令错误
报错,这里是因为更新源的问题
这里我修改dockerfile文件,提前修改源的地址
#备份一下原来的源文件
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#换源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
清理缓存并重新生成
RUN yum clean all
RUN yum makecache
再次报错,原来是备份的地址出错了,查看一下正确的地址
原来
重新修改了一下
#备份一下原来的源文件
RUN mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#换源
RUN curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
清理缓存并重新生成
RUN yum clean all
RUN yum makecache
再次报错
这里还是因为源的原因,所以我这里直接删除所有旧的源
这里我用的centos8,与以往的centos7还源不同,
mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo CentOS-Linux-BaseOS.repo.bak
mv /etc/yum.repos.d/CentOS-Linux-AppStream.repo CentOS-Linux-AppStream.repo.bak
mv /etc/yum.repos.d/CentOS-Linux-Extras.repo CentOS-Linux-Extras.repo.bak
后面实在没找到问题,我重新搞了一个容器,实操换源
尝试yum -y install vim
成功了
总结命令
#备份
mkdir /etc/yum.repos.d/repo.backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo.backup
下载阿里云的源
curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-8.repo
上面那个错误是我忘记把中文注释了
下面是成功建立新镜像
docker images
可以看到构建成功
进去看有没有java环境,发现没有,我检查发现,因为环境变量的路径配错了,修改为正确的环境变量就有了
什么是虚悬镜像?
就是在构建或者删除镜像的时候出现一些错误,导致仓库和标签都是none
单独查看虚悬镜像
docker image ls -f dangling=true
删除虚悬镜像
docker image prune