Dockerfile简介和基础实践

文章目录

  • 1、Dockerfile简介
    • 1.1、Dockerfile解决的问题
    • 1.2、docker build 构建流程
    • 1.3、关键字介绍
  • 2、Dockerfile 实践
    • 2.1、基本语法实践 --- golang
      • 2.1.1 问题检查
    • 2.2、基本语法实践 --- gcc
  • 总结

1、Dockerfile简介

Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过
docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了
Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成
docker 镜像.

1.1、Dockerfile解决的问题

Dockerfile 包含了镜像制作的完整操作流程,其他开发者可以通过 Dockerfile 了解并复现制作过程
Dockerfile 中的每一条指令都会创建新的镜像层,这些镜像可以被 Docker Daemon 缓存。再次制作镜
像时,Docker 会尽量复用缓存的镜像层(using cache),而不是重新逐层构建,这样可以节省时间和
磁盘空间
Dockerfile 的操作流程可以通过docker image history [镜像名称]查询,方便开发者查看变更记录

1.2、docker build 构建流程

docker build命令会读取Dockerfile的内容,并将Dockerfile的内容发送给 Docker 引擎,最终 Docker
引擎会解析Dockerfile中的每一条指令,构建出需要的镜像。

第一步,docker build会将 context 中的文件打包传给 Docker daemon。如果 context 中有.dockerignore文件,则会从上传列表中删除满足.dockerignore规则的文件。注意:如果上下文中有相当多的文件,可以明显感受到整个文件发送过程。这里有个例外,如果.dockerignore文件中有.dockerignore或者Dockerfile,docker build命令在排除文件时会忽略掉这两个文件。如果指定了镜像的 tag,还会对 repository 和 tag 进行验证。

第二步,docker build命令向 Docker server 发送 HTTP 请求,请求 Docker server 构建镜像,请求中
包含了需要的 context 信息。

第三步,Docker server 接收到构建请求之后,会执行以下流程来构建镜像:

  1. 创建一个临时目录,并将 context 中的文件解压到该目录下。
  2. 读取并解析 Dockerfile,遍历其中的指令,根据命令类型分发到不同的模块去执行。
  3. Docker 构建引擎为每一条指令创建一个临时容器,在临时容器中执行指令,然后 commit 容器,生成一个新的镜像层。
  4. 最后,将所有指令构建出的镜像层合并,形成 build 的最后结果。最后一次 commit 生成的镜像 ID就是最终的镜像 ID。

为了提高构建效率,docker build默认会缓存已有的镜像层。如果构建镜像时发现某个镜像层已经被缓存,就会直接使用该缓存镜像,而不用重新构建。如果不希望使用缓存的镜像,可以在执行dockerbuild命令时,指定–no-cache=true参数。

Docker 匹配缓存镜像的规则为:遍历缓存中的基础镜像及其子镜像,检查这些镜像的构建指令是否和当前指令完全一致,如果不一样,则说明缓存不匹配。对于ADD、COPY指令,还会根据文件的校验和(checksum)来判断添加到镜像中的文件是否相同,如果不相同,则说明缓存不匹配。

这里要注意,缓存匹配检查不会检查容器中的文件。比如,当使用RUN apt-get -y update命令更新了容器中的文件时,缓存策略并不会检查这些文件,来判断缓存是否匹配。

最后,可以通过docker history命令来查看镜像的构建历史

1.3、关键字介绍

在这里插入图片描述

2、Dockerfile 实践

2.1、基本语法实践 — golang

(1)创建文件夹,存放Dockerfile。注意,默认Dockerfile文件的首字母要大写,当不指定Dockerfile时docker会自动去匹配。

mkdir example1 
cd example1
vim Dockerfile

(2)Dockerfile输入如下内容:

FROM golang:1.18
MAINTAINER fly
ENV env1=v1
ENV env2=v2
LABEL myhello 1.0.0
LABEL env prod
RUN git clone https://gitee.com/nickdemo/helloworld.git
WORKDIR helloworld
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

说明:

  • FROM golang:1.18 表示使用golang语言v1.18版本的基础镜像。
  • ENV设置容器的环境变量,一般是v1和v2。
  • LABEL 可以设置多个。
  • RUN设置编译时运行的脚本,可以有多个。
  • WORKDIR类似于cd命令,WORKDIR helloworld是进入helloworld目录。
  • CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . 是golang编译命令,go可以和c语言配合使用
  • CGO_ENABLED=0表示不打开CGO功能;
  • app是编译出来的文件名,后面的.表示编译到当前路径。

(3)执行docker build命令。要注意带有的“.” ,这是上下文,不可缺少。

docker build -t hello:1.0.0 -f Dockerfile .

如果出现如下情况,编译不通过是因为没有设置golang的环境代理,因为golang服务器基本在国外,所以需要设置代理。

Sending build context to Docker daemon  2.048kB
Step 1/11 : FROM golang:1.18
1.18: Pulling from library/golang
32de3c850997: Pull complete 
fa1d4c8d85a4: Pull complete 
c796299bbbdd: Pull complete 
81283a9569ad: Pull complete 
c768848b86a2: Pull complete 
160a777925fe: Pull complete 
1be94824532a: Pull complete 
Digest: sha256:00d63686b480f6dc866e93ddc4b29efa2db03274a687e6495c2cfbfe615d638e
Status: Downloaded newer image for golang:1.18---> fffd0d9a59da
Step 2/11 : MAINTAINER fly---> Running in 115307734b60
Removing intermediate container 115307734b60---> 563fafbaa215
Step 3/11 : ENV env1=v1---> Running in cdc078b0e0f4
Removing intermediate container cdc078b0e0f4---> 00cf872c162e
Step 4/11 : ENV env2=v2---> Running in 9c5d21d9827a
Removing intermediate container 9c5d21d9827a---> 675573fda93f
Step 5/11 : LABEL myhello 1.0.0---> Running in 835edee10587
Removing intermediate container 835edee10587---> 7fe90336bfc0
Step 6/11 : LABEL env prod---> Running in 6b9a149d8760
Removing intermediate container 6b9a149d8760---> 1f518a4de736
Step 7/11 : RUN git clone https://gitee.com/nickdemo/helloworld.git---> Running in 3836f92a0cc1
Cloning into 'helloworld'...
Removing intermediate container 3836f92a0cc1---> 497dfec57d8f
Step 8/11 : WORKDIR helloworld---> Running in 8f33d51a24f9
Removing intermediate container 8f33d51a24f9---> 581cbde35690
Step 9/11 : RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .---> Running in ac2e563f44aa
go: downloading github.com/gomodule/redigo v1.8.9
go: downloading github.com/spf13/viper v1.12.0
hello/composeRedis.go:6:2: github.com/gomodule/redigo@v1.8.9: Get "https://proxy.golang.org/github.com/gomodule/redigo/@v/v1.8.9.zip": dial tcp 142.251.42.241:443: i/o timeout
hello/printConfig.go:5:2: github.com/spf13/viper@v1.12.0: Get "https://proxy.golang.org/github.com/spf13/viper/@v/v1.12.0.zip": dial tcp 142.251.42.241:443: i/o timeout
The command '/bin/sh -c CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .' returned a non-zero code: 1

(4)Dockerfile中设置代理:

MAINTAINER fly
ENV env1=v1
ENV env2=v2
LABEL myhello 1.0.0
LABEL env prod
RUN git clone https://gitee.com/nickdemo/helloworld.git
WORKDIR helloworld
RUN go env -w GOPROXY="https://proxy.golang.com.cn,https://goproxy.cn,direct"
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

(5)再次执行docker build命令。

docker build -t hello:1.0.0 -f Dockerfile .

成功结果:

Sending build context to Docker daemon  2.048kB
Step 1/12 : FROM golang:1.18---> fffd0d9a59da
Step 2/12 : MAINTAINER fly---> Using cache---> 563fafbaa215
Step 3/12 : ENV env1=v1---> Using cache---> 00cf872c162e
Step 4/12 : ENV env2=v2---> Using cache---> 675573fda93f
Step 5/12 : LABEL myhello 1.0.0---> Using cache---> 7fe90336bfc0
Step 6/12 : LABEL env prod---> Using cache---> 1f518a4de736
Step 7/12 : RUN git clone https://gitee.com/nickdemo/helloworld.git---> Using cache---> 497dfec57d8f
Step 8/12 : WORKDIR helloworld---> Using cache---> 581cbde35690
Step 9/12 : RUN go env -w GOPROXY="https://proxy.golang.com.cn,https://goproxy.cn,direct"---> Running in aa3d7b78e3ea
Removing intermediate container aa3d7b78e3ea---> 228d20762041
Step 10/12 : RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .---> Running in 0b4899bd2333
go: downloading github.com/gomodule/redigo v1.8.9
go: downloading github.com/spf13/viper v1.12.0
go: downloading github.com/fsnotify/fsnotify v1.5.4
go: downloading github.com/mitchellh/mapstructure v1.5.0
go: downloading github.com/spf13/afero v1.8.2
go: downloading github.com/spf13/cast v1.5.0
go: downloading github.com/spf13/jwalterweatherman v1.1.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
go: downloading golang.org/x/text v0.3.7
go: downloading github.com/subosito/gotenv v1.3.0
go: downloading github.com/hashicorp/hcl v1.0.0
go: downloading gopkg.in/ini.v1 v1.66.4
go: downloading github.com/magiconair/properties v1.8.6
go: downloading github.com/pelletier/go-toml/v2 v2.0.1
go: downloading gopkg.in/yaml.v3 v3.0.0
go: downloading github.com/pelletier/go-toml v1.9.5
Removing intermediate container 0b4899bd2333---> 8a0543eb5966
Step 11/12 : EXPOSE 80---> Running in 5de109cc2133
Removing intermediate container 5de109cc2133---> 11f4f6f09a9e
Step 12/12 : CMD ["./app","--param1=p1","--param2=p2"]---> Running in 49caece0cdf7
Removing intermediate container 49caece0cdf7---> 308a6e93a8ff
Successfully built 308a6e93a8ff
Successfully tagged hello:1.0.0

(6)查看docker images。发现有了hello:1.0.0。

fly@fly:~/wokspace/example1$ docker images
REPOSITORY               TAG       IMAGE ID       CREATED              SIZE
hello                    1.0.0     308a6e93a8ff   About a minute ago   1.08GB
golang                   1.18      fffd0d9a59da   41 hours ago         965MB
nginx                    latest    ac8efec875ce   2 weeks ago          142MB
nongtengfei/mynginx      1.0.0     ac8efec875ce   2 weeks ago          142MB
localhost:5000/mynginx   1.0.0     ac8efec875ce   2 weeks ago          142MB
registry                 2         81c944c2288b   5 weeks ago          24.1MB

(7)运行镜像。

docker run -p 80:80 --name myhello hello:1.0.0

执行结果:

fly@fly:~/wokspace/example1$ docker run -p 80:80 --name myhello hello:1.0.0 
into main

也可以后台执行:

docker run -p 80:80 -d --name myhello hello:1.0.0

然后使用curl访问:

$ curl http://localhost:80/print/env
env list : env1 = v1 and env2 = v2

2.1.1 问题检查

上述制作的镜像有什么问题?

  1. 镜像非常大,什么都没做就是1.08GB。不方便传输。
  2. 使用了git软件,这个在golang的基础镜像默认有的,但是如果是是gcc环境,可能就没有这个git软件。
  3. 构建时传输了上下文,但是上下文基本没有用到。

2.2、基本语法实践 — gcc

(1)创建文件夹,存放Dockerfile。注意,默认Dockerfile文件的首字母要大写,当不指定Dockerfile时docker会自动去匹配。

mkdir example2
cd example2
vim Dockerfile

(2)Dockerfile输入如下内容:

FROM gcc
MAINTAINER fly
COPY ./hello.c ./
RUN pwd
LABEL myhello 1.0.0
LABEL env prod
RUN gcc hello.c -o hello
CMD ["./hello"]

(3)创建hello.c并输入内容:

#include <stdio.h>
int main(int argc,char **argv)
{printf("hello world\n");return 0;
}

(4)构建镜像:

docker build -t myhelloc .

执行结果:

Sending build context to Docker daemon  3.072kB
Step 1/8 : FROM gcc
latest: Pulling from library/gcc
32de3c850997: Already exists 
fa1d4c8d85a4: Already exists 
c796299bbbdd: Already exists 
81283a9569ad: Already exists 
60b38700e7fb: Pull complete 
0db15631b022: Pull complete 
becc68bc09a5: Pull complete 
c369162968fc: Pull complete 
ce5ec26c51fc: Pull complete 
Digest: sha256:6c101c7698a6ebe5cd153182889ffc9ab2f7192bf96a06fe292806116fdaafba
Status: Downloaded newer image for gcc:latest---> e94a76bddd72
Step 2/8 : MAINTAINER fly---> Running in e193e6e7dac1
Removing intermediate container e193e6e7dac1---> afa92db551f4
Step 3/8 : COPY ./hello.c ./---> 87b51ccd7de3
Step 4/8 : RUN pwd---> Running in 569f3ddfaf53
/
Removing intermediate container 569f3ddfaf53---> 2ee756f47004
Step 5/8 : LABEL myhello 1.0.0---> Running in 2deaebd60838
Removing intermediate container 2deaebd60838---> 1610bf7d0792
Step 6/8 : LABEL env prod---> Running in ce840c209a93
Removing intermediate container ce840c209a93---> b6158d8d3aac
Step 7/8 : RUN gcc hello.c -o hello---> Running in 6f01803e28b1
Removing intermediate container 6f01803e28b1---> 6c9223360ad5
Step 8/8 : CMD ["./hello"]---> Running in 9127f8f3e413
Removing intermediate container 9127f8f3e413---> a88d99f3d8e8
Successfully built a88d99f3d8e8
Successfully tagged myhelloc:latest

(5)执行镜像:

docker run myhelloc

执行结果:

fly@fly:~/wokspace/example2$ docker run myhelloc
hello world

如果是后台执行,可以通过docker log 查询到输出的hello world。

总结

  1. 构建镜像时,选择上下文要注意,不要包含有不要用到的内容,通常使用项目的根目录作为上下文即可。
  2. COPY命令时,基本上是“./*”开始,没有绝对路径,因为构建的时候上下文已经发送到守护进程,不在宿主机了。
  3. go语言和c语言编译的区别,主要在FROM部分,依赖的基础环境;另外,编译命令也不一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣541 反转字符串Ⅱ Java版本

文章目录 题目描述代码自己需要注意的地方 题目描述 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 如果剩余字符小于…

STM32 PWM驱动设计

单片机学习&#xff01; 目录 文章目录 前言 一、PWM驱动配置步骤 二、代码示例及注意事项 2.1 RCC开启时钟 2.2 配置时基单元 2.3 配置输出比较单元 2.4 配置GPIO 2.5 运行控制 三、PWM周期和占空比计算 总结 前言 PWM本质是利用面积等效原理来改变波形的有效值。 一、PWM驱动…

C++初阶入门之命名空间和缺省参数的详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.命名空间 2.1命名冲突的例子 2.2解决方案 2.3命…

操作Date时间方法

文章目录 1. 两个Date时间类型数值做对比1、使用Date类&#xff1a;2、使用LocalDateTime类&#xff1a; 2. 字符串转Date1、使用SimpleDateFormat类&#xff1a;2、使用DateTimeFormatter类&#xff1a; 3. new Date()格式化字符串 年月日4. 两个date数据类型相差天数1、 计算…

SPA单页面的讲解(超级详细)

目录 一、什么是SPA 二、SPA和MPA的区别 单页应用与多页应用的区别 单页应用优缺点 三、实现一个SPA 原理 实现 hash 模式 history模式 四、题外话&#xff1a;如何给SPA做SEO SSR服务端渲染 静态化 使用Phantomjs针对爬虫处理 一、什么是SPA SPA&#xff08;sin…

这是一片测试文章

这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 真的是测试文章 -111122225555444433333333222211111 dddddaaa

❤css实用

❤ css实用 CSS渐变色边框&#xff08;Gradient borders方法的汇总 5种-代码可直接下载&#xff09; 资源链接 https://download.csdn.net/download/weixin_43615570/88779950?spm1001.2014.3001.5503 给 border 设置渐变色是很常见的效果&#xff0c;实现这个效果有很多思路…

近20k stars,GSYVideoPlayer一款优秀的视频播放器

近20k stars&#xff0c;GSYVideoPlayer一款优秀的视频播放器 引言 在现代社会中&#xff0c;视频已经成为人们获取信息和娱乐的重要形式。为了提供更好的观看体验&#xff0c;开发一款优秀的视频播放器变得至关重要。而GSYVideoPlayer作为一款功能强大、稳定可靠的视频播放器…

浙江机电职业技术学院第八届新生亮相赛(同步赛)D.一种很新的阶乘【线性筛+一分为二法】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/73799/D 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 夜雷很喜欢特别大的数字&#xff0c;曾经一度算阶乘…

没指定spring-boot-maven-plugin版本导致编译失败,这坑你踩过没

文章目录 1. 前言2. 组件版本信息3. 事件经过3.1 本地通过maven命令打包3.2 定位问题步骤3.2.1 核对spring-boot-maven-plugin版本信息3.2.2 spring-boot-maven-plugin版本错误原因 3.3 解决方案 4.结论 1. 前言 我们在平时开发过程中关注的比较多的是项目开发时依赖包的版本以…

lightdb object支持static函数

文章目录 背景介绍语法示例 背景 在信创适配中&#xff0c;从Oracle迁移过来的程序使用STATIC函数。为此LightDB从24.1版本开始&#xff0c;对该功能进行了支持。 介绍 LightDB 24.1版本中对象方法包括下列几种&#xff1a; MEMBER方法&#xff1a;MEMBER方法可以被对象实例…

数据结构(绪论+算法的基本概念)

文章目录 一、绪论1.1、数据结构的基本概念1.2、数据结构三要素1.2.1、逻辑结构1.2.2、数据的运算1.2.3、物理结构&#xff08;存储结构&#xff09;1.2.4、数据类型和抽象数据类型 二、算法的基本概念2.1、算法的特性2.2、“好”算法的特质2.2.1、算法时间复杂度2.2.2、算法空…

java数学计算工具类 double精确的加法算法 double精确的减法算法

java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算&#xff0c;当发生除不尽的 保留小数、数值精度 精确的加法算法:2.27 精确的减法算法:0.01 精确的乘法算法:1.2882 相对精确的除法运算&#xff0c;当发生除不尽的情况时&…

【WebGPU】简介和开始

简介 WebGPU 是一种 API&#xff0c;用于在 Web 应用中访问 GPU 的功能。在 WebGPU 出现之前&#xff0c;有一个 WebGL&#xff0c;它提供了 WebGPU 的部分功能。它开创了一种新的富媒体 Web 内容类别&#xff0c;并且开发者也利用它构建了许多精彩的内容。不过&#xff0c;它…

领域驱动设计(Domain-Driven Design DDD)——通过重构找到深层次模型1

一、概述 重构就是在不改变软件功能的前提下重新设计它。开发人员无需在着手开发之前做出详细的设计决策&#xff0c;只需要在开发过程中不断小幅调整设计即可&#xff0c;这不但能够保证软件原有的功能不变&#xff0c;还可使整个设计更加灵活易懂。 我们面临的真正挑战是找到…

【机器视觉实验】机器视觉实验四——基于knn的场景图像检索、基于SVM的人脸图像识别

一、实验内容 实验内容包含要进行什么实验,实验的目的是什么,实验用到的算法及其原理的简单介绍。 (1) 编程实现基于knn的场景图像检索 a) 至少实现三种特征组合进行检索; b) 使用recall与precision分析不同特征组合对检索精度的影响。 (2) 实现基于SVM的人脸图像识…

java使用MD5加密

java使用MD5加密 源字符串&#xff1a;三四五 使用 UTF-8字符集字符集加密后的结果为:f2615f1dab4520fc1e1a79ed6a4f7b37 用 GB2312 字符集加密后的结果为:1dbb006b41466197c486592727af516f 用 GBK 字符集加密后的结果为:1dbb006b41466197c486592727af516f

TCP 状态转换以及半关闭

TCP 状态转换&#xff1a; 上图中还没有进行握手的时候状态是关闭的。 三次握手状态的改变&#xff1a; 客户端发起握手。 调用 connect() 函数时状态转化为&#xff1a;SYN_SENT。调用 listen() 函数时状态转换为&#xff1a;LISTEN。ESTABLISHED是被连接的状态。 四次挥手…

Python系列(7)—— 运算符的优先级

一、引言 在Python中&#xff0c;当一个表达式包含多个运算符时&#xff0c;运算符的优先级决定了这些运算符的执行顺序。高优先级的运算符会先于低优先级的运算符进行计算。了解和掌握运算符的优先级对于编写正确的Python代码至关重要。 二、Python中的运算符优先级 Python…

2023-2024年广东省职业院校技能大赛信息安全管理与评估赛项规程

2023-2024 年度广东省职业院校技能大赛“信息安全管理与评估”赛项规程 一、赛项名称 赛项编号&#xff1a;GZ032 赛项名称&#xff1a;信息安全管理与评估 英语翻译&#xff1a;Information Security Management and Evaluation 赛项组别&#xff1a;高职组 竞赛形式&am…