文章结构:
(一)Docker常用知识点
(二)Dockerfile指令详解
文章最后附一份docker教学视频,本篇的Dockerfile指令详解是看该教学视频做的笔记
(一)Docker常用知识点
【1.1】进入一个正在运行的Docker容器命令:
【1.2】Docker 退出容器但不关闭当前容器:
【1.3】docker状态转换和事件:
【1.4】常用操作:
【1.5】四种Docker容器网络
【1.6】在容器中使用Volumes
Volume(卷)为docker提供了独立于容器的数据管理机制
可以把“镜像”想象成静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享;
卷实现了 “程序(镜像)” 和 “数据(卷)” 分离,以及 “程序(镜像)” 和 “制作镜像的主机” 分离。用户在制作镜像时无须再考虑镜像运行的容器所在的主机的环境
一共有两种volume可以用,都能实现数据持久化,使用方式都一样,宿主机内修改容器内也改了,容器内修改宿主机内也改了。两种方式不同在于宿主机上存放位置是随机还是指定。
docker inspect 查看时在Mounts对象里可以看到type不一样
(1)Docker-managed volume,这种volume在宿主机上存在放的路径是随机的
(2)Bind-mount Volume,这种volume可以指定具体在宿主机上存放的位置
(二)Dockerfile指令详解:
【2.1】Dockerfile语法格式
注意:
1.Dockerfile中json数组中引号都为双引号,不能写单引号
2.通常一行一个指令
3..找一个专用工作目录放Dockerfile,Dockerfile首字母要大写
4.如果需要打包很多文件进镜像,必须要把文件放到当前Dockerfile所在的工作目录下。即Dockerfile中引用文件的路径不能是其父路径,可以是子路径
5.Dockerfile还支持专用的工作目录下做一个隐藏文件,叫.dockeringore,这也是个文本文件。在这个文件中可以写文件路径,可以使用通配符。所有在打包时的文件只要在.dockeringore中写的路径,打包时都不包含进去。
【2.2】Dockerfile中FROM指令
【2.3】Dockerfile中LABEL指令
LABEL为镜像制定各种元数据
【2.4】Dockerfile中COPY指令
举个栗子:
【2.5】Dockerfile中ADD指令
举个栗子:
【2.6】Dockerfile中WORKDIR指令
用来设置容器的当前工作路径,设置完之后的COPY和ADD指令中<dest>可以写成相对于WORKDIR的路径 ./ 或者 ./src等等,可以设置多个工作路径。
【2.7】Dockerfile中EXPOSE指令
举个栗子:
【2.8】Dockerfile中ENV指令
举个栗子:
【2.9】Dockerfile中VOLUME指令
举个栗子:
【2.10】Dockerfile中RUN指令
RUN指令是在由基础镜像生成目标镜像docker build过程中执行的。RUN指令可以在Dockerfile中写多个,多个RUN指令都起作用,逐一运行。如果多个Command之间有关联关系建议用一条RUN写下来,因为Dockerfile中一条指令就会生成一个镜像层。
格式:
举个栗子:
【2.11】Dockerfile中的CMD指令
CMD是定义一个镜像文件启动容器时默认要运行的程序块。Docker程序默认只运行一个程序。Dockerfile中只能有一个CMD指令有效。如果写了多个只有最后一个CMD起作用。
【2.12】Dockerfile中ENTRYPOINT指令
【2.13】Dockerfile案例
Dockerfile案例需求介绍:
运行nginx时,nginx通过接收变量来生成配置文件。接收的变量能在启动容器时进行传递。
案例中三个文件entrypoint.sh,Dockerfile,index.html在同一个目录下
entrypoint.sh文件:
上面的exec用来替换当前进程,“$@”含义是脚本的所有参数,即传什么就运行什么
Dockerfile文件:
index.html文件:
docker build:
docker run:
启动时设置端口号,监听到8080上
进入容器验证:
杀掉一个运行中的容器:
【2.14】Dockerfile中USER指令
【2.15】Docker中HEALTHCHECK指令
主进程健康检测不能通过看进程在不在来确定,而是应该通过看是否能提供服务来确定。通过HEALTHCHECK来检测是否能提供服务。
option释义:
--interval含义是每隔多久检测一次主进程
--timeout含义是超时时长,即多久没响应算为主进程不健康
--start-period含义是容器启动后等多久开始进行健康检测
--retries含义是检测多少次失败后认定为不健康
三个返回值中reserved表示预留的,可以自己定义
【2.16】Dockerfile中ARG指令
在Dockerfile中定义的ARG指令可以在docker build 命令中通过--build-arg <变量名>=<变量值>的方式传递自定义参数。
注意:在docker run时可以向环境变量传值,docker build时不能向环境变量传值,只能用默认值。如果想在docker build时也能给变量定义值,那就得使用ARG。
举个栗子:
在Dockerfile中:
在docker build命令中:
【2.17】Dockerfile中ONBUILD指令
ONBUILD指令后面跟的是正常的Dockerfile中的指令如RUN、ADD等等。
自己做的镜像可以被别人作为基础镜像使用,如果自己做的镜像Dockerfile中写了ONBUILD指令,这个指令后面的Dockerfile指令在自己做image时不会执行。而当别人把你的镜像当做基础镜像,并写在Dockerfile,在他的build时才会执行。
结束语:到此为止就可以愉快的做镜像了,如果还是不熟练,可以到 docker hub 上看看别人怎么写的,读别人写的Dockerfile可以了解怎么用他的镜像更合适。多读几个应该就会写了。