什么是DockerFile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
构建步骤
- 编写Dockerfile文件
- docker build 构建镜像
- docker run
DockerFile构建过程
1、基础知识
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层,并对镜像进行提交
2、流程
docker从基础镜像运行一个容器
执行一条指令并对容器做出修改
执行类似docker commit的操作提交一个新的镜像层
Docker再基于刚提交的镜像运行一个新容器
执行dockerfile中的下一条指令直到所有指令都执行完成。
说明:
从应用软件的角度来看,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile是软件的原材料(代码)
Docker 镜像则是软件的交付品(apk)
Docker容器则是软件的运行状态(客户下载安装执行)
DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及到部署和运维,三者缺一不可。
DockerFile:需要定义一个dockerFile,Dockerfile定义了进程需要的一切东西。
DockerFile涉及到的内容包括执行代码或者文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。
Docker镜像:在DockerFile定义了一个文件之后,Docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务
Docker容器:容器是直接提供服务的
DockerFile指令
实战测试
Docker Hub中99%的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的。
1、编写DockerFile
官方默认的CentOS的情况,是不具备一些vim编辑器、查看网络配置ifconfig。
目的:使我们自己的镜像具备如下:登陆后的默认路径、vim编辑器、查看网络ifconfig。
vim dockerfile-centos
FROM centos:7
MAINTAINER zhangxiansen <zhangxiansen@itcloudblog.cn>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----------end "
CMD /bin/bash
2、构建
构建命令: docker build -f dockerfile-centos -t mycentos:0.1 .
命令说明:docker build -f dockerfile文件 -t 新镜像名字:TAG .
[+] Building 142.9s (8/8) FINISHED
=> [internal] load .dockerignore 2.4s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from dockerfile-centos 2.0s
=> => transferring dockerfile: 338B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 23.9s
=> [1/4] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 18.1s
=> => resolve docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 2.9s
=> => sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB 4.1s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 8.8s
=> [2/4] WORKDIR /usr/local 0.5s
=> [3/4] RUN yum -y install vim 68.0s
=> [4/4] RUN yum -y install net-tools 23.5s
=> exporting to image 4.6s
=> => exporting layers 4.4s
=> => writing image sha256:baa80f931b670a94c9b98770e964c9e567a0375797963da04426095d72307cc0 0.2s
=> => naming to docker.io/library/mycentos:0.1
3、运行
运行命令:docker run -it mycentos:0.1
命令说明:docker run -it 新镜像名字:TAG
[root@37c3ab61279e local]# pwd
/usr/local
[root@37c3ab61279e local]# vim test
[root@37c3ab61279e local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 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
可以看到,我们自己的新镜像已经支持vim/ifconfig 的命令,扩展OK。
4、列出镜像变更历史
[root@localhost dockerfile-test]# docker history baa80f931b67
IMAGE CREATED CREATED BY SIZE COMMENT
baa80f931b67 20 hours ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
<missing> 20 hours ago CMD ["/bin/sh" "-c" "echo \"----------end\t\… 0B buildkit.dockerfile.v0
<missing> 20 hours ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0
<missing> 20 hours ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 20 hours ago RUN /bin/sh -c yum -y install net-tools # bu… 185MB buildkit.dockerfile.v0
<missing> 20 hours ago RUN /bin/sh -c yum -y install vim # buildkit 269MB buildkit.dockerfile.v0
<missing> 20 hours ago WORKDIR /usr/local 0B buildkit.dockerfile.v0
<missing> 20 hours ago ENV MYPATH=/usr/local 0B buildkit.dockerfile.v0
<missing> 20 hours ago MAINTAINER zhangxiansen <zhangxiansen@itclou… 0B buildkit.dockerfile.v0
<missing> 22 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 22 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 22 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
[root@localhost dockerfile-test]#