目录

对 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 指令的几点重要的说明:

  1. 如果构建镜像时没有明确指定 Dockerfile,那么 Docker 客户端默认在构建镜像时指定的上下文路径下找名字为 Dockerfile 的构建文件;
  2. 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 构建上下文 理解相关推荐

  1. docker简单介绍、安装使用、常用命令、docker构建springboot项目、k8s安装

    docker简单介绍 docker的意义 把事情简单化 Docker友好的基于CLI的工作流使各种技能水平的开发人员都可以访问构建,共享和运行容器化应用程序. 快速移动 从单个软件包安装即可在几分钟内 ...

  2. Docker构建MySQL镜像并初始化

    文章目录 Docker构建MySQL镜像并初始化 Dockerfile 的一些常用语法 FROM RUN CMD ENV COPY ADD WORKDIR EXPOSE 构建自带初始化的 MySQL ...

  3. docker 命令深入理解

    目录 ​ 一.容器相关 1.docker run centos 2.查看centos容器 3.删除退出的容器 4.两个危险的命令 docker image prune && docke ...

  4. Docker构建Nginx+Tomcat动静分离架构

    随着主流Nginx WEB服务器的发展,现在基于Nginx的WEB服务器已广泛应用于各大互联网企业.今天我们来使用docker构建我们的Linux+Nginx+Tomcat动静分离服务器. 1)    ...

  5. 用 Docker 构建、运行、发布来一个 Spring Boot 应用

    原文同步至 http://waylau.com/docker-spring-boot/ 本文演示了如何用 Docker 构建.运行.发布来一个 Spring Boot 应用. Docker 简介 Do ...

  6. iis7 您无权使用所提供的凭据查看此目录或页面。_使用Spring Cloud和Docker构建微服务架构

    原文:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do作者:Alexander Lukyanc ...

  7. 永信至诚CTO张凯:CloudStack+Docker构建云端信息安全实验场

    5月14日,2016中国云计算技术大会(CCTC)在京召开,作为本次大会的亮点环节之一--Container技术峰会吸引了众多业内人士的关注.本届Container技术峰会不仅注重前沿技术的分享,在容 ...

  8. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  9. Spring容器与上下文理解

    2019独角兽企业重金招聘Python工程师标准>>> 转自:https://www.cnblogs.com/chenbenbuyi/p/8166304.html 个人感觉介绍的很不 ...

最新文章

  1. Netflix海外市场交到好运 用户数量猛增
  2. 一行代码搞定 R 语言模型输出!(使用 stargazer 包)
  3. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
  4. MyEclipse优化浅析
  5. 统计学最全脑图,你只管打开它,剩下的交给「卧槽」
  6. IP通信基础 实验三
  7. Ecshop:后台添加新功能栏目以及管理权限设置
  8. android scrollview焦点,scrollview里面的edittext,当它获得焦点时如何滚动到edittext
  9. 教你轻松搞定javascript中的正则
  10. 【netty】Netty并发工具-Promise
  11. 怎么给php下拉框默认选中
  12. 采用Bert进行中文分词
  13. 硬盘坏了怎么恢复数据,需要哪些设备
  14. 需要一个用于Postgres的UUID生成器?这里有两种设置方法
  15. MD5 Encryption Of String ( UTF-8 ) / UE4 MD5 加密
  16. if...else 语句双分支结构 计算分段函数
  17. 【数据分享】全国县市2000-2020年医疗卫生机构床位数数据(excel和shp格式)
  18. java shiro原理_Shiro的原理及Web搭建
  19. 计算机与软件学院辅导员陈伯亨,十年桃李满园———计算机科学与软件工程系隆重举行十周年校庆校友会...
  20. Windows Server 2016 搭建DHCP服务器(踩坑后总结)

热门文章

  1. NetDevOps — ncclient
  2. ELK/EFK — Overview
  3. Kong APIGW — Plugins — 监控告警、日志审计
  4. Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)
  5. 红帽虚拟化RHEV-架构简介
  6. OSS 下载延迟或超时
  7. Android SharedPreferences存储map的方法
  8. 使用Gunicorn Ngnx Supervisor部署Django项目
  9. Webservice超时问题
  10. [linux] tcpdump抓包案例