0
点赞
收藏
分享

微信扫一扫

Docker使用和Dockerfile详解

文章结构:

(一)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可以了解怎么用他的镜像更合适。多读几个应该就会写了。

点击获取马哥的docker教学视频

举报

相关推荐

0 条评论