镜像是一个打包文件,其中包含了应用程序及其运行所依赖的环境,例如文件系统、环境变量、配置参数等等

联合文件系统

容器镜像内部并不是一个平坦的结构,而是由许多的镜像层组成,每层都是只读不可修改修改的一组文件,相同的层可以在镜像之间共享,然后多个层像搭积木一样堆叠起来,使用一种叫"Union FS联合文件系统"的技术将它们合并在一起,形成了容器最终看到的文件系统

使用docker inspect可查看镜像的分层信息

$ sudo docker inspect nginx:alpine
...
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:ec34fcc1d526fba48f7f88e4ec765fccc17d4692570db85cf32d9d6b020330f2",
"sha256:5c497738d8721551c4835d7860e90259e10a1396c988377654fdfa775bf6f3a5",
"sha256:a2a3844a950f5f1872001e95f272cf298f60e5afdea9ac5456be96283038f972",
"sha256:6dec34c67396c2da53c440189accfc7359b6d6f29f1fe028c056f75f2c3b51a4",
"sha256:5b75fcec28b0cfd2ea2143d9de81409e98f4ed2c396877b45522919e0821bea0",
"sha256:7d4368f5306ea780e22b1bc0d0960ba2a5b84b7488d9e2eaacdfcabffd10ca35"
]
},
...

Dockerfile

Dockerfile是一个纯文本,里面记录了一系列构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个Layer,而Docker顺序执行这个文件里的所有步骤,最后创建出一个新的镜像

创建一个最简单的Dockerfile:

FROM busybox
CMD echo "hello world"

该文件里仅有两条指令,第一条指令是FROM,所有的Dockerfile都要从它开始,表示选择构建使用的基础镜像

第二条指令是CMD,指定了docker run启动容器时默认运行的命令,这里使用echo命令,输出字符串"hello world"

使用docker build命令创建出镜像:

$ sudo docker build -f Dockerfile.busybox .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox
---> 62aedd01bd85
Step 2/2 : CMD echo "hello world"
---> Running in 6047b8d8741c
Removing intermediate container 6047b8d8741c
---> 35c82ebb67d7
Successfully built 35c82ebb67d7

命令的格式: 用-f参数制定Dockerfile文件名,后面必须跟一个文件路径,叫做"构建上下文",这里使用了点号,表示当前路径

$ sudo docker run 35c
hello world

新的镜像暂时没有名字,使用"IMAGE ID"可以指定它,如上通过指定路径前缀运行容器

Docker会逐行地读取并执行Dockerfile里的指令,依次创建镜像层,再生成完整的镜像

简单编写方法

构建镜像的第一条指令必须是FROM,所以基础镜像的选择非常关键,关注镜像的安全性和大小的话,一般选择Alpine,如果关注的是应用的运行稳定性,那么可能会选择Ubuntu、Debian、CentOS

FROM alpine:3.15      # 选择Alpine镜像
FROM ubuntu:bionic # 选择Ubuntu镜像

COPY命令可以将文件放到容器中,但源文件路径必须是"构建上下文"路径下

COPY ./a.txt /tmp/a.txt   # 将构建上下文中的a.txt拷贝到镜像的/tmp目录里

Dockerfile中最重要的指令是RUN,它可以执行任意shell命令,比如更新系统、安装应用、下载文件、创建目录、编译程序等等,实现任意的镜像构建步骤,其中一条指令只能是一行,所以有的RUN指令会在每行的末尾使用续行符,命令之间也会用&&来连接,如下所示:

RUN apt-get update \
&& apt-get install -y \
build-essential \
curl \
make \
unzip \
&& cd /tmp \
&& curl -fSL xxx.tar.gz -o xxx.tar.gz\
&& tar xzf xxx.tar.gz \
&& cd xxx \
&& ./config \
&& make \
&& make clean

也可以将这些Shell命令集中到一个脚本文件里,用COPY命令拷贝进去再用RUN执行:

COPY setup.sh  /tmp/                # 拷贝脚本到/tmp目录

RUN cd /tmp && chmod +x setup.sh \  # 添加执行权限
&& ./setup.sh && rm setup.sh # 运行脚本然后再删除

RUN指令实际上就是Shell编程,使用ARG和ENV可以创建变量,区别在于ARG创建的变量只在镜像构建过程中可见,容器运行时不可见,而ENV创建的变量不仅能够在构建镜像的过程中使用,在容器运行时也能够以环境变量的形式被应用程序使用

ARG IMAGE_BASE="node"
ARG IMAGE_TAG="alpine" ENV PATH=$PATH:/tmp
ENV DEBUG=OFF

还有一个重要的指令是EXPOSE,它用来声明容器对外服务的端口号

EXPOSE 443
EXPOSE 53/udp

每个指令都会生成一个镜像层,所以Dockerfile里最好不要滥用指令,尽量精简合并,否则太多的层会导致镜像臃肿不堪

Docker入门实践笔记-Dockerfile的更多相关文章

  1. 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

    操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...

  2. 这是一次 docker 入门实践

    前言 其实接触 docker 也有一段时间了,但是一直没有做下总结,现在网上关于 docker 的介绍也有很多了,本着好记性不如烂笔头的原则,还是自己再记录一波吧. 实现目标 安装 docker ce ...

  3. Docker 入门实践

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张戈 导语 本文从新手视角记录了一个实际的Dokcer应用场景从创建.上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法 ...

  4. docker入门实战笔记

    1.什么是docker: docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致 ...

  5. Docker入门实践(三) 基本操作

    Docker安装完毕.我们就能够试着来执行一些命令了.看看docker能够干什么. (一) 创建一个容器 首先.让我们执行一个最简单的容器,hello-world.假设安装没有问题.并执行正确的话,应 ...

  6. docker入门-学习笔记

    docker可以类比成window下的VMware或者virtualbox软件.docker有两个基本的概念:容器(container)和镜像(image),分别对应为VMware中的系统镜像和系统镜 ...

  7. Docker入门实践

    Docker是一门很成熟的容器技术,类似虚拟机技术主要用做环境的隔离,方便环境的复制镜像,虚拟机是基于操作系统这一层的,而Docker更加的轻量级,像是“应用”层级的.比如我需要一个MySQL环境.一 ...

  8. Docker入门学习笔记

    Docker 什么是Docker 虚拟化技术 在计算机中,虚拟化是一种资源管理技术,将计算机中的各种实体资源如:CPU.硬盘.内存等予以抽象.转换后呈现出来打破实体结构间的不可切割的障碍,使用户可以比 ...

  9. 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker

    Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  10. Docker入门与实践之 Dockerfile 语法详解

    一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...

随机推荐

  1. jmeter 数据库连接

    位置:右击添加>配置元件>JDBC Connection Configuration 作用:需要对数据库发起请求查询数据或者对数据库施加压力 3.设置说明 Variable Name(变量 ...

  2. 运行python脚本报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created

    运行python脚本报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created 原因: ...

  3. C语言转义序列

    转义序列 含义 \a 报警(ANSIC) \b 退格 \f 换页 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \\ 反斜杆\ \' 单引号 \" 双引号 \? 问号 \0oo ...

  4. tag 总结

    通用的: (((masterpiece))),((best quality)),ultra-detailed,extremely detailed CG unity 8k wallpaper,best ...

  5. SpringBoot——常用配置

    application.yml配置信息 spring: profiles: active: dev application: name: jwt-token-security # Jackson 配置 ...

  6. 【RSocket】使用 RSocket(二)——四种通信模式实践

    Source Code: https://github.com/joexu01/rsocket-demo 0. 四种通信模式 让我们来简单复习一下 RSocket 的四种通信模式: 即发即忘 - Fi ...

  7. 全网最详细中英文ChatGPT接口文档(一)开始使用ChatGPT——导言

    目录 Introduction 导言 Overview 概述 Key concepts 关键概念 Prompts and completions 提示和完成 Tokens 标记/符号 Models 模 ...

  8. Web自动化——介绍与安装以及第一个web自动化程序(一)

    1. 为什么要做Web自动化测试 什么是web自动化测试 让程序代替人,去验证网页上功能的过程 web自动化测试与手工测试的比较 web自动化测试执行的测试用例是手工功能测试的子集 web自动化测试的 ...

  9. Jira使用浅谈篇二

    本篇参考:https://university.atlassian.com/student/collection/850385/path/1083901 本篇接上文,上文已经对项目设置了一个基础的配置 ...

  10. Auto Photoshop StableDiffusion - 这是一款可以在 Photoshop 中使用 AI 智能 Automatic1111 进行插画、海报等设计的插件

    简介 Auto Photoshop StableDiffusion - 这是一款可以在 Photoshop 中使用 AI 智能 Automatic1111 进行插画.海报等设计的插件,此插件可以是你在 ...