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’] :源文件或者源目录 :容器内指定的路径,该路径不用事先建好,路径不存在,会自动创建

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同一路径

[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 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 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]#

虚拟机运行很慢,只能等着,估计两分钟

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。