DockerFile文件详细解析
所有文章不设限,我们相遇偶然,相散坦然,互不打扰,各自安好,向阳而生
致敬尚硅谷周阳老师,此处内容迁移学习来自于阳哥!
DockerFile是什么
DockerFile是用来构建Docker镜像的文本文件,是一条条构建镜像所需要的指令和参数构成的脚本
构建三步骤
- 编写DockerFile文件
- Docker build命令构建镜像
- docker run 依据镜像运行容器实例
DockerFile构建过程解析
DockerFile内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上向下,顺序执行
- #表示注释
- 每个指令都会创建一个新的镜像层并且对于镜像进行提交
Docker执行DockerFile的大致流程
- Docker从基础镜像运行一个容器
- 执行一条指令并且对于容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- Docker再基于刚提交的镜像运行一个新的容器
- 执行DockeFile 中的下一条指令直到所有指令都执行完成
小总结
从应用软件的角度而言,DockerFile,Docker镜像和Docker容器分别代表了软件的三个不同阶段
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件镜像的运行状态,也是依照镜像运行的容器实例
DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署和运维,三者缺一不可,合理充当Docker体系的基石!
- Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
- Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;
- Docker容器,容器是直接提供服务的。
DockerFile常用保留字指令
FROM指令
基础镜像,当前镜像是基于那个镜像的,指定一个已经存在的镜像作为模版,第一条必须是from
MAINTAINER 指令
镜像维护者的姓名和邮箱地址
RUN 指令
-
第一种 shell格式
RUN yum -y install vim
-
第二种
exec格式 RUN[“可执行文件”,“参数1”,“参数2”]
RUN实在docker bilid时进行运行
EXPOSE 指令
当前容器对外暴露出的端口
WORKDIR 指令
指定在创建容器后,终端默认进入后的目录
USER 指令
指定该镜像以什么样的用户去执行,如果不指定,默认是root
ENV 指令
用来构建镜像的过程中设置环境变量
ADD 指令
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY 指令
类似ADD,拷贝文件和目录到镜像中
将从构建上下文目录中的<源路径> 的文件/目录复制到新的一层的镜像内的<目标路径>位置
-
第一种写法
COPY src dest
-
第二种写法
COPY [“src”,‘dest’]
<src源路径>:源文件或者源目录
<dest目标路径>:容器内指定的路径,该路径不用事先建好,路径不存在,会自动创建
VOLUME 指令
容器数据卷,用于数据保存和持久化工作
实操案例
自定义镜像mycentosjava8
要求
centos7镜像具备vim+ifconfig+jdk8
jdk下载地址
https://mirrors.yangxingzhen.com/jdk/jdk-8u192-linux-x64.tar.gz
自己可以先下载到宿主机
[root@WangHui WangHui]# wget https://mirrors.yangxingzhen.com/jdk/jdk-8u192-linux-x64.tar.gz -P /usr/local/src/
编写
注意啊,镜像加版本号,否则会报错
Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirrorlist
#拉取基础镜像
FROM centos:7
#设置用户名(非必选)
MAINTAINER wanghui <25459384987@qq.com>
#设置环境变量
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
#将安装包添加到容器中
ADD jdk-8u192-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_192
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
构建
注意啊,下载jdk的时候没有放到和DockerFile同一路径,这个后期会报错,尽管你的DockerFile配置的是绝对路径也没用用的
所以必须安装包和DockerFile同一路径文章来源:https://www.toymoban.com/news/detail-718773.html
[root@WangHui WangHui]# cp /usr/local/src/jdk-8u192-linux-x64.tar.gz ./
[root@WangHui WangHui]# ls
docker-client docker-engine docker-latest-logrotate test2.tar
docker-client-latest DockerFile docker-logrotate
docker-common docker-latest jdk-8u192-linux-x64.tar.gz
[root@WangHui WangHui]# docker build -f ./DockerFile -t mycentosjava8:1.0.0 .
[+] Building 24.3s (3/10)
=> [internal] load build definition from DockerFile 0.1s
=> => transferring dockerfile: 834B 0.1s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.1s
=> [internal] load metadata for docker.io/library/centos:latest 15.2s
=> [1/6] FROM docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55 9.0s
=> => resolve docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55 0.0s
=> => sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1 45.09MB / 83.52MB 9.0s
=> => sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 762B / 762B 0.0s
=> => sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc 529B / 529B 0.0s
=> => sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 2.14kB / 2.14kB 0.0s
=> [internal] load build context 9.0s
=> => transferring context: 57.94MB
查看
[root@WangHui WangHui]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentosjava8 1.0.0 af9ec3d7f1c1 2 hours ago 951MB
redis latest 7614ae9453d1 15 months ago 113MB
[root@WangHui WangHui]#
启动
[root@WangHui WangHui]# docker run -it af9ec3d7f1c1 /bin/bash
[root@1d3ef2bad8fa local]# if
if ifconfig ifenslave
[root@1d3ef2bad8fa 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 13 bytes 1102 (1.0 KiB)
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@1d3ef2bad8fa local]#
虚拟机运行很慢,只能等着,估计两分钟文章来源地址https://www.toymoban.com/news/detail-718773.html
到了这里,关于DockerFile文件详细解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!