docker 构建上下文 理解
目录
对 Docker 构建上下文的理解误区
理解 Docker 的架构
理解 docker build 的工作原理
正确理解 Docker 构建上下文
对 Docker 构建上下文的理解误区
我们都知道,构建一个 Docker 镜像非常简单,大家一般都会这么做(当然这么做是完全正确的):
1.跳到 Dockerfile 所在目录;
2.执行 docker build
构建命令:
docker build -t <imageName:imageTag> .
通过上面的工作流,很容易形成这样的理解误区:
docker build
后面的.
为 Dockerfile 所在的目录;- Dockerfile 文件名 必须为 Dockerfile;
其实上面这种理解是错误的,要想准确理解其含义,首先我们需要先了解下 Docker 的架构和 docker build
的工作原理。
理解 Docker 的架构
Docker 是一个典型的 C/S 架构的应用,分为 Docker 客户端(即平时敲的 docker 命令) Docker 服务端(dockerd 守护进程)。
Docker 客户端通过 REST API 和服务端进行交互,docker 客户端每发送一条指令,底层都会转化成 REST API 调用的形式发送给服务端,服务端处理客户端发送的请求并给出响应。
Docker 镜像的构建、容器创建、容器运行等工作都是 Docker 服务端来完成的,Docker 客户端只是承担发送指令的角色。
Docker 客户端和服务端可以在同一个宿主机,也可以在不同的宿主机,如果在同一个宿主机的话,Docker 客户端默认通过 UNIX 套接字(/var/run/docker.sock
)和服务端通信。
理解 docker build 的工作原理
理解了 Docker 的架构就很容易理解 docker build
构建镜像的工作原理了。docker build 构建镜像的流程大概如下:
- 执行
docker build -t <imageName:imageTag> .
; - Docker 客户端会将构建命令后面指定的路径(
.
)下的所有文件打包成一个 tar 包,发送给 Docker 服务端; - Docker 服务端收到客户端发送的 tar 包,然后解压,根据 Dockerfile 里面的指令进行镜像的分层构建;
正确理解 Docker 构建上下文
了解了 Docker 的架构和镜像构建的工作原理后,Docker 构建上下文也就容易理解了。Docker 构建上下文就是 Docker 客户端上传给服务端的 tar 文件解压后的内容,也即 docker build
命令行后面指定路径下的文件。
Docker 镜像的构建是在远程服务端进行的,所以客户端需要把构建所需要的文件传输给服务端。服务端以客户端发送的文件为上下文,也就是说 Dockerfile 中指令的工作目录就是服务端解压客户端传输的 tar 包的路径。
关于 docker build
指令的几点重要的说明:
- 如果构建镜像时没有明确指定 Dockerfile,那么 Docker 客户端默认在构建镜像时指定的上下文路径下找名字为 Dockerfile 的构建文件;
- Dockerfile 可以不在构建上下文路径下,此时需要构建时通过
-f
参数明确指定使用哪个构建文件,并且名称可以自己任意命名。
下面通过具体的实例来理解下:
首先创建一个简单的 demo 工程,工程结构如下:
helloworld-app
├── Dockerfile
└── docker├── app-1.0-SNAPSHOT.jar├── hello.txt└── html└── index.html
Dockerfile 内容:
FROM busybox
COPY hello.txt .
COPY html/index.html .
实践1:直接进入 helloworld-app 目录进行镜像构建,以 docker 目录为构建上下文:
$ docker build -t hello-app:1.0 docker
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /Users/haohao/opensource/helloworld-app/docker/Dockerfile: no such file or directory
可以看出默认 docker 客户端从 docker 构建上下文路径下找名字为 Dockerfile 的构建文件。
实践2:明确指定 Dockerfile 文件进行镜像构建,还是以 docker 目录为构建上下文:
$ docker build -f Dockerfile -t hello-app:1.0 docker
Sending build context to Docker daemon 96.61MB
Step 1/3 : FROM busybox---> d8233ab899d4
Step 2/3 : COPY hello.txt .---> 3305fc373120
Step 3/3 : COPY html/index.html .---> efdefc4e6eb2
Successfully built efdefc4e6eb2
Successfully tagged hello-app:1.0
从输出结果可以得知:
- 构建镜像时客户端会先给服务端发送构建上下路径下的内容(即 docker 目录下的文件);
- Dockerfile 可以不在构建上下文路径下;
- Dockerfile 中指令的工作目录是服务端解压客户端传输的 tar 包的路径;
实践3:以当前目录为构建上下文路径:
$ ls
Dockerfile docker
$ docker build -t hello-app:2.0 .
Sending build context to Docker daemon 96.62MB
Step 1/3 : FROM busybox---> d8233ab899d4
Step 2/3 : COPY hello.txt .
COPY failed: stat /var/lib/docker/tmp/docker-builder375982663/hello.txt: no such file or directory
可以看出:
- 镜像构建上下文路径并不是 Dockerfile 文件所在的路径;
- Dockerfile 中指令的工作目录是服务端解压客户端传输的 tar 包的路径,因为 COPY 指令失败了,意味着当前目录并没有 hello.txt 文件;
docker 构建上下文 理解相关推荐
- docker简单介绍、安装使用、常用命令、docker构建springboot项目、k8s安装
docker简单介绍 docker的意义 把事情简单化 Docker友好的基于CLI的工作流使各种技能水平的开发人员都可以访问构建,共享和运行容器化应用程序. 快速移动 从单个软件包安装即可在几分钟内 ...
- Docker构建MySQL镜像并初始化
文章目录 Docker构建MySQL镜像并初始化 Dockerfile 的一些常用语法 FROM RUN CMD ENV COPY ADD WORKDIR EXPOSE 构建自带初始化的 MySQL ...
- docker 命令深入理解
目录 一.容器相关 1.docker run centos 2.查看centos容器 3.删除退出的容器 4.两个危险的命令 docker image prune && docke ...
- Docker构建Nginx+Tomcat动静分离架构
随着主流Nginx WEB服务器的发展,现在基于Nginx的WEB服务器已广泛应用于各大互联网企业.今天我们来使用docker构建我们的Linux+Nginx+Tomcat动静分离服务器. 1) ...
- 用 Docker 构建、运行、发布来一个 Spring Boot 应用
原文同步至 http://waylau.com/docker-spring-boot/ 本文演示了如何用 Docker 构建.运行.发布来一个 Spring Boot 应用. Docker 简介 Do ...
- iis7 您无权使用所提供的凭据查看此目录或页面。_使用Spring Cloud和Docker构建微服务架构
原文:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do作者:Alexander Lukyanc ...
- 永信至诚CTO张凯:CloudStack+Docker构建云端信息安全实验场
5月14日,2016中国云计算技术大会(CCTC)在京召开,作为本次大会的亮点环节之一--Container技术峰会吸引了众多业内人士的关注.本届Container技术峰会不仅注重前沿技术的分享,在容 ...
- 视频私有云实战:基于Docker构建点播私有云平台
私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...
- Spring容器与上下文理解
2019独角兽企业重金招聘Python工程师标准>>> 转自:https://www.cnblogs.com/chenbenbuyi/p/8166304.html 个人感觉介绍的很不 ...
最新文章
- Netflix海外市场交到好运 用户数量猛增
- 一行代码搞定 R 语言模型输出!(使用 stargazer 包)
- Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
- MyEclipse优化浅析
- 统计学最全脑图,你只管打开它,剩下的交给「卧槽」
- IP通信基础 实验三
- Ecshop:后台添加新功能栏目以及管理权限设置
- android scrollview焦点,scrollview里面的edittext,当它获得焦点时如何滚动到edittext
- 教你轻松搞定javascript中的正则
- 【netty】Netty并发工具-Promise
- 怎么给php下拉框默认选中
- 采用Bert进行中文分词
- 硬盘坏了怎么恢复数据,需要哪些设备
- 需要一个用于Postgres的UUID生成器?这里有两种设置方法
- MD5 Encryption Of String ( UTF-8 ) / UE4 MD5 加密
- if...else 语句双分支结构 计算分段函数
- 【数据分享】全国县市2000-2020年医疗卫生机构床位数数据(excel和shp格式)
- java shiro原理_Shiro的原理及Web搭建
- 计算机与软件学院辅导员陈伯亨,十年桃李满园———计算机科学与软件工程系隆重举行十周年校庆校友会...
- Windows Server 2016 搭建DHCP服务器(踩坑后总结)