Dockerfile 是 Docker 中用于定义镜像自动化构建流程的配置文件,在 Dockerfile 中,包含了构建镜像过程中需要执行的命令和其他操作。它可以明确设定 Docker 镜像的制作过程,帮助我们在容器体系下能够完成自动构建。习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中
流程:
1、新建Dockerfile文件
2、写内容:例如基于Ubuntu构建Nginx
# 构建一个基于ubuntu的docker定制镜像# 基础镜像FROM ubuntu# 镜像作者 MAINTAINER已废弃,改为LABEL代替# MAINTAINER my_name myemail@domain.comLABEL maintainer="myemail@domain.com"# 执行命令## 换成国内的软件源RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.listRUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list## 安装nginxRUN apt update >/dev/null 2>&1RUN apt install nginx -y >/dev/null 2>&1# 暴露对外端口EXPOSE 80
3、执行构建命令
docker build --network=host -t ubuntu-nginx:v1 .
注意:最后有参数”.”,最后的 . 代表本次执行的上下文路径
--network=host 使用宿主机的网络连接代理容器的网络(在一些情况下,容器可能无法顺畅地连接外网)。
-t ubuntu-nginx:v1 指定生产的镜像名称为 ubuntu-nginx ,版本号为 v1。
-f 指定Dockerfile所在位置
镜像构建过程
[user@centos8 nginx]$ docker build --network=host -t ubuntu-nginx:v1 .# 将上下文求发送给Docker引擎Sending build context to Docker daemon 2.56kB# 下载依赖的镜像Step 1/7 : FROM ubuntulatest: Pulling from library/ubuntud51af753c3d3: Pull completefc878cd0a91c: Pull complete6154df8ff988: Pull completefee5db0ff82f: Pull completeDigest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7Status: Downloaded newer image for ubuntu:latest# 生成镜像 1d622ef86b13---> 1d622ef86b13Step 2/7 : MAINTAINER my_name myemail@domain.com# 运行容器 4eec6e3094f0,在容器内运行上面的这个命令,标记维护者信息---> Running in 4eec6e3094f0# 移除临时容器 4eec6e3094f0Removing intermediate container 4eec6e3094f0# 生成镜像 6679d1c204e3---> 6679d1c204e3Step 3/7 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list# 运行容器84d38c20d8c4,在容器内运行上面的这个命令,更换软件源记录---> Running in 84d38c20d8c4# 移除临时容器 84d38c20d8c4Removing intermediate container 84d38c20d8c4# 生成镜像 83f29f7b055a---> 83f29f7b055aStep 4/7 : RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list# 运行容器 763e4493d93f, 在容器内运行上面的这个命令,更换软件源记录---> Running in 763e4493d93f# 移除临时容器 763e4493d93fRemoving intermediate container 763e4493d93f# 生成镜像 6297f20605d9---> 6297f20605d9Step 5/7 : RUN apt update >/dev/null 2>&1# 运行容器 2665a7e5a2e9,在容器内运行上面的这个命令, 更新软件源缓存---> Running in 2665a7e5a2e9# 移除临时容器 2665a7e5a2e9Removing intermediate container 2665a7e5a2e9# 生成镜像 fdfed940ca4d---> fdfed940ca4dStep 6/7 : RUN apt install nginx -y >/dev/null 2>&1# 运行 容器 722a9a544643,在容器内运行上面的这个命令, 安装nginx---> Running in 722a9a544643# 移除临时容器 722a9a544643Removing intermediate container 722a9a544643# 生成镜像 6ee76f7df9e5---> 6ee76f7df9e5Step 7/7 : EXPOSE 80# 运行容器 a12ed3216ee0,在容器内运行上面的这个命令, 暴露80端口---> Running in a12ed3216ee0# 移除临时容器 a12ed3216ee0Removing intermediate container a12ed3216ee0# 生成最终的镜像 7cf64279ba98---> 7cf64279ba98Successfully built 7cf64279ba98# 将这个镜像标记命名 ubuntu-nginx 版本号v1Successfully tagged ubuntu-nginx:v1
查看构建过程:
docker history ubuntu-nginx:v1
Dockerfile 的结构
Dockerfile 主要包含四部分内容:
- 基础镜像信息;
- 维护者信息;
- 镜像操作指令;
- 容器启动时指令。
上下文路径:
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢
