Dockerfile介绍
Dockerfile是用于构建Docker镜像的文本文件,它包含了一系列的指令和参数,用于指导Docker引擎在基础镜像上进行一系列的操作,从而构建出一个新的镜像。
Dockerfile的优势在于它可以通过简单的文本文件来描述镜像的构建过程,使得镜像的构建过程可重复、可自动化,并且可以与版本控制系统集成,方便团队协作。
Dockerfile命令解释
下面是一些常用的Dockerfile命令的解释:
FROM:指定基础镜像,用于构建新镜像。例如:
FROM ubuntu:latest
表示基于最新的Ubuntu镜像构建新镜像。RUN:在镜像中执行命令。例如:
RUN apt-get update && apt-get install -y curl
表示在镜像中执行apt-get命令更新软件包,并安装curl工具。COPY:将文件或目录从构建环境复制到镜像中。例如:
COPY app.py /app/
表示将当前目录下的app.py文件复制到镜像的/app/目录下。ADD:类似于COPY命令,但更强大,可以自动解压缩文件和远程文件下载。例如:
ADD https://example.com/file.tar.gz /tmp/
表示从远程URL下载文件并解压缩到镜像的/tmp/目录下。WORKDIR:设置工作目录,后续命令将在该目录下执行。例如:
WORKDIR /app
表示将/app/目录设置为工作目录。EXPOSE:声明容器运行时监听的端口。例如:
EXPOSE 8080
表示容器将监听8080端口。CMD:指定容器启动时要执行的命令。例如:
CMD ["python", "app.py"]
表示容器启动时执行python app.py命令。MAINTAINER:镜像维护者的姓名和邮箱地址
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是 root
ENV:用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成
<ENTRYPOINT> "CMD"
。VOLUME:容器数据卷,用于数据保存和持久化工作
生成镜像
构建步骤
编写Dockerfile文件
docker build命令构建镜像
docker run依镜像运行容器实例《
规范
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层并对镜像进行提交
流程
docker从基础镜像运行一个容器
执行一条指令并对容器作出修改
执行类似docker commit的操作提交一个新的镜像层
docker再基于刚提交的镜像运行一个新容器
执行 dockerfile 中的下一条指令直到所有指令都执行完成
案例
要求:Centos7镜像具备 vim + ifconfig + jdk8
准备:下载好 jdk8 并跟 Dockerfile 文件放在一个目录中
编写Dockerfile文件
FROM centos:7
MAINTAINER itmahy<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u381-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u381-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_381 #注意 这个要个jdk-8u381-linux-x64.tar.g解压目录一样
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
在 DockerFile文件所在目录中执行
docker build -t itmahy-centos:1.0 .
生成镜像。注意:不要忽略最后的.
。执行
docker run -it itmahy-centos:1.1 /bin/bash
在容器中验证软件是否安装成功
[root@7b3a38e3e211 local]# java -version
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mixed mode)
[root@7b3a38e3e211 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@7b3a38e3e211 local]# vim test
[root@7b3a38e3e211 local]#
虚悬镜像
仓库名、标签都是的镜像,俗称 dangling image
使用 Dockerfile 写一个
from ubuntu
CMD echo 'action is success'
执行
docker build .
查看虚悬镜像:
docker image ls -f dangling=true
删除虚悬镜像:
docker image prune