dockerfile
基本知识点
- 镜像的构建步骤按照dockerfile里的指令顺序来构建。
- docker镜像是分层的,通过dockerfile构建镜像时,每一句指令就是一层,每执行一句就填加一层,最底层则是基础镜像,即
from
指令所指定的镜像。
- docker的容器即是在镜像之上加上一个可以读写的临时层
- 构建过程中的删除操作只在所在的指令语句的那一层中起作用。比如有两句
RUN
指令:前一个是安装了某个软件或添加了每个文件,即执行了对镜像来说增大体积的操作;后一个则是卸载这个软件的下载缓存或删除对应的目标文件,既执行了对镜像来说的减少体积的操作。那么,镜像真的会减去这一部分的体积吗?不,并不会,在docker镜像构建过程中,它是一层一层往上叠的,或者说,新的层会继承旧的层,所以,在旧的层里加进镜像里的东西,哪怕在后面的层执行了删除操作也并不会真正的删除,依旧会存留在镜像内。所以要缩减镜像体积的话,首先要选一个符合要求的、最小的基础镜像,然后构建过程中每一次安装软件都要注意在同一个RUN
操作中同时执行清除缓存等操作。 - docker的规范规定,dockerfile的文件名必须是dockerfile,但
docker
和file
这两个单词的首字母不区分大小写。 - 镜像名称的表现形式有两种:一种是只有镜像名称——
image[:tag]
(如,nginx
或nignx:14.0
),在该情况下代表着如果本地不存在该名称的镜像的话,docker会从docker hub查询并下载;另一种是IP/域名+镜像名:{ip/domain}[:port][/folder]/image[:tag]
(如,127.0.0.1:8081/floder1/dockerImage:1.2.3
或www.demo.com:8081/floder1/dockerImage:1.2.3
),在该情况下代表着如果本地不存在指定的镜像的话将会从指定的地址下载对应的镜像,而且如果下载的镜像如果是私有镜像的话还需要先在终端执行docker login {ip/domain}[:port]
进行登录后才可以下载。
指令参数的作用
FROM
:该参数所在的指令必须要放在dockerfile文件的第一行,用于指定dockerfile所构建的镜像的基础镜像是什么,该参数以镜像名称作为值RUN
:该参数表示在构建过程中需要执行的bash命令。如RUN: uname -a
LABEL
:用于自定义镜像的元数据,如LABEL author="AlexC"
定义了author为AlexCARG
:定义了构建镜像时的环境变量。如ARG a=1
,那么如果我在后面的指令中有用到变量a
的值的地方的话,我只需要使用美元符+变量名,即$a
就可以了,如WORKDIR /root/$a
,这里的意思就是工作目录设定在WORKDIR/root/1
。COPY
:用于复制外部文件进镜像。对外部文件支持相对路径和绝对路径。使用格式为COPY {原文件路径}+空格+{目标文件路径}
,如COPY ROOT.war /home
的意思就是把与dockerfile同级的ROOT.war放进镜像内部的/home
目录下。
dockerfile示例
1 | # 本镜像的基础镜像 |
docker-compose
基本知识点
- docker-compose是一个简单的docker镜像编排工具,其配置文件名称一般默认为为
docker-compose.yml
,docker-compose将会根据该配置文件里的设置构建出单个或多个docker容器以及其他和容器相关的东西并按照配置项将不同容器联系起来。
配置项
用过yaml做配置文件的应该都知道.yml文件的写法其实和json的格式是类似的,都是键值对。在docker-compose的配置文件里有两大配置项是必要的,他们分别是service
和VERSION
。
VERSION
:该属性的用法是用于指定docker-compose在根据配置文件执行时编排操作时使用的API版本,现在最新版是3
,所以一般来说该标签的写法都是VERSION: "3"
。services
:按我的了解,对于docker来说,一个容器相当于一个服务,所以在services下的都是服务。每一个容器都需要指定一个镜像用于生成容器。NETWORK
:表示网段,其下的二级配置项表示不同的隔离网络,每个网络可以使用driver
属性定义网络的连接模式。模式有三种,分别是桥接模式bridge
、宿主模式host
和容器模式container [container name]
。VOLUMES
:表示数据卷,其下二级配置项表示不同的数据卷。当声明一个空数据卷时(即只有一个数据卷名字且不存在任何属性),该数据卷会根据docker自身的缺省值在/var/lib/docker/volumes/{hash值}/_data
(这个路径是我在Mac OS 10.11.6里查到的,不保证其他版本和其他系统也是这个路径)里存放被挂载映射的数据。
docker-compose.yml示例
1 | # 声明docker-compose执行编排时使用的api版本 |