DockerFile介绍
DockerFile是用来构建docker镜像的文件,它相当于是一个命令参数脚本。
构建步骤
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行制作好的镜像
4、docker push 发布镜像(Docker Hub、阿里云镜像仓库)
这里也可以先查看一下官方的做法:
DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单,使用DockerFile创建镜像逐渐成为企业交付的标准。
DockerFile常用指令
FROM 指明构建的新镜像是来自于哪个基础镜像
MAINTAINER 指明镜像维护者及其联系方式(姓名+邮箱)
RUN 制作镜像的时候需要运行的命令,RUN后面接linux里的命令,这个命令是在制作镜像的时候使用的
WORKDIR 镜像的工作目录,docker exec 命令执行的时候进入的目录
VOLUME 向镜像创建的容器中添加数据卷,数据卷可以在容器之间共享和重用
EXPOSE 指明容器运行的时候暴露的端口
ONBUILD 当构建一个被继承DockerFile的时候,就会运行ONBUILD指令,触发指令
ENV 设置镜像环境变量
ADD ADD和COPY作用相似,可以从一个URL地址下载内容复制到容器的文件系统中,还可以将压缩打包格式的文件解压后复制到指定位置
COPY COPY指令用来将本地的文件或者文件夹复制到镜像的指定路径下
# 文件复制均使用 COPY 指令,在需要自动解压缩的场合使用 ADD 指令
CMD 指定这个容器启动的时候要运行的命令
Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
# 如果docker run后面出现与CMD指定的相同的命令,那么CMD就会被覆盖。而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令
CMD和ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令
# Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
如果docker run后面出现与CMD指定的相同的命令,那么CMD就会被覆盖。而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令
测试CMD
[root@docker dockerfile]# vim docker-cmd-test
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@docker dockerfile]# docker build -f docker-cmd-test -t cmd-test .
# run运行,发现 ls -a 命令生效
[root@docker dockerfile]# docker run 0fc923b4a51d
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
# 想追加一个命令 -l (ls -al),发现报错
[root@docker dockerfile]# docker run 0fc923b4a51d -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
# cmd的情况下,—l替换了CMD ["ls","-a"],-l不是命令所以报错
测试ENTRYPOINT
[root@docker dockerfile]# vim docker-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
[root@docker dockerfile]# docker build -f docker-cmd-entrypoint -t entrypoint-test .
# run运行,发现 ls -a 命令生效
[root@docker dockerfile]# docker run 7281b1d891b0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 我们的追加命令,直接拼接在 ENTRYPOINT 命令的后面
[root@docker dockerfile]# docker run 7281b1d891b0 -l
total 0
drwxr-xr-x. 1 root root 6 Aug 31 06:05 .
drwxr-xr-x. 1 root root 6 Aug 31 06:05 ..
-rwxr-xr-x. 1 root root 0 Aug 31 06:05 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Aug 31 06:05 dev
drwxr-xr-x. 1 root root 66 Aug 31 06:05 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 2020 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 164 root root 0 Aug 31 06:05 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Aug 30 23:31 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
实战测试
Docker Hub 中 99% 的镜像都是从 scratch 这个基础镜像过来的,然后配置需要的软件和配置来进行构建。
创建一个centos镜像
# 1、编写DockerFile文件
[root@docker dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER huyuxuan<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum install vim -y
RUN yum install net-tools -y
EXPOSE 80
CMD echo $MYPATH
CMD ECHO "----end----"
CMD /bin/bash
# 2、通过这个文件构建镜像
[root@docker dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
# 镜像构建成功
Successfully built bd65b5005d54
Successfully tagged mycentos:0.1
# 3、测试运行
[root@docker dockerfile]# docker run -it mycentos:0.1
[root@16070a4f7397 local]# pwd # 官方的centos的工作目录默认是根目录
/usr/local
[root@16070a4f7397 local]# ifconfig # 官方的centos是没有ifconfig和vim命令的
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.5 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:05 txqueuelen 0 (Ethernet)
RX packets 9 bytes 726 (726.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
我们还可以通过docker history 列出本地镜像的变更历史。
[root@docker dockerfile]# docker history bd65b5005d54
IMAGE CREATED CREATED BY SIZE COMMENT
bd65b5005d54 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
9c40364b8e4a 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "ECHO… 0B
b593d09fca86 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
78b2ea117a6b 7 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
1e1620cb13f8 7 minutes ago /bin/sh -c yum install net-tools -y 29.5MB
8302771eb989 7 minutes ago /bin/sh -c yum install vim -y 68.1MB
b48359e428bd 7 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
43e8d8a528ff 7 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
150f4e234915 7 minutes ago /bin/sh -c #(nop) MAINTAINER huyuxuan<98253… 0B
300e315adb2f 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
版权归原作者 _SmallTownKid_ 所有, 如有侵权,请联系我们删除。