Docker 镜像构建入门实战指南
一、概述
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
官方文档:https://docs.docker.com/engine/reference/builder/ Dockerfile
示例:https://github.com/dockerfile/
二、Dockerfile 结构
Dockerfile 结构主要分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令 (CMD/ENTRYPOINT)
【温馨提示】Dockerfile 每行支持一条指令,每条指令可携带多个参数(支持&&),支持使用以“#“号开头的注释(jason 文件不支持#注释),但是也非必须满足上面的四点。
三、常用 Dockerfile 操作指令
- ARG—— 定义创建镜像过程中使用的变量 ,唯一一个可以在 FROM 之前定义 。
- FROM——基于某个镜像, FROM前面只能有一个或多个ARG指令 。
- MAINTAINER(已弃用) —— 镜像维护者姓名或邮箱地址 。
- VOLUME—— 指定容器挂载点到宿主机自动生成的目录或其他容器
- RUN——执行镜像里的命令,跟在 liunx 执行命令一样,只需要在前面加上 RUN 关键词就行。
- COPY——复制本地(宿主机)上的文件到镜像。
- ADD——复制并解压(宿主机)上的压缩文件到镜像。
- ENV——设置环境变量。
- WORKDIR—— 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录 。
- USER—— 为 RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户。
- EXPOSE—— 声明容器的服务端口(仅仅是声明) 。
- CMD—— 容器启动后执行的命令 ,多个 CMD 只会执行最后一个,跟 ENTRYPOINT 的区别是,CMD 可以作为 ENTRYPOINT 的参数,且会被 yaml 文件里的 command 覆盖。
- ENTRYPOINT—— 容器启动后执行的命令 ,多个只会执行最后一个。
- HEALTHCHECH—— 健康检查 。
- ONBUILD——它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
- LABEL——LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式 ,替换 MAINTAINER。
1)镜像构建(docker build)
docker build -t text:v1 . --no-cache
# 要在构建后将映像标记到多个存储库中,请在运行命令-t时添加多个参数
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
# --no-cache:不缓存
2)运行容器测试(docker run)
# 非交互式运行
docker run centos:7.4.1708 /bin/echo "Hello world"
### 交互式执行
# -t: 在新容器内指定一个伪终端或终端。
#-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
# 会登录到docker环境中,交互式
docker run -it centos:7.4.1708 /bin/bash
# -d:后台执行,加了 -d 参数默认不会进入容器
docker run -itd centos:7.4.1708 /bin/bash
### 进入容器
# 在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
#docker exec -it :推荐大家使用 docker exec -it 命令,因为此命令会退出容器终端,但不会导致容器的停止。
#docker attach:容器退出,会导致容器的停止。
docker exec -it b2c0235dc53 /bin/bash
docker attach b2c0235dc53
3)ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。唯一一个可以在 FROM 之前定义 。构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
语法格式:
ARG <参数名>[=<默认值>]
示例:
# 在FROM之前定义ARG,只在 FROM 中生效
ARG VERSION=laster
FROM centos:${
VERSION}
# 在FROM之后使用,得重新定义,不需要赋值
ARG VERSION
RUN echo $VERSION >/tmp/image_version
4)FROM
定制的镜像都是基于 FROM 的镜像 ,【必选项】
语法格式:
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
如果引用多平台图像,可选–platform标志可用于指定图像的平台。FROM例如,linux/amd64、 linux/arm64或windows/amd64。默认情况下,使用构建请求的目标平台。全局构建参数可用于此标志的值,例如允许将阶段强制为原生构建平台 ( --platform=$BUILDPLATFORM),并使用它交叉编译到阶段内的目标平台。
示例:
ARG VERSION=latest
FROM busybox:$VERSION
# FROM --platform="linux/amd64" busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
5)MAINTAINER(已弃用)
镜像维护者信息
语法格式:
MAINTAINER <name>
示例:
LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"
6)VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
- 在启动容器 docker run 的时候,可以通过 -v 参数修改挂载点。
语法格式:
# 后面路径是容器内的路径,对应宿