Docker入门实践笔记-Dockerfile
镜像是一个打包文件,其中包含了应用程序及其运行所依赖的环境,例如文件系统、环境变量、配置参数等等
联合文件系统
容器镜像内部并不是一个平坦的结构,而是由许多的镜像层组成,每层都是只读不可修改修改的一组文件,相同的层可以在镜像之间共享,然后多个层像搭积木一样堆叠起来,使用一种叫"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的更多相关文章
- 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World
操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...
- 这是一次 docker 入门实践
前言 其实接触 docker 也有一段时间了,但是一直没有做下总结,现在网上关于 docker 的介绍也有很多了,本着好记性不如烂笔头的原则,还是自己再记录一波吧. 实现目标 安装 docker ce ...
- Docker 入门实践
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张戈 导语 本文从新手视角记录了一个实际的Dokcer应用场景从创建.上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法 ...
- docker入门实战笔记
1.什么是docker: docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致 ...
- Docker入门实践(三) 基本操作
Docker安装完毕.我们就能够试着来执行一些命令了.看看docker能够干什么. (一) 创建一个容器 首先.让我们执行一个最简单的容器,hello-world.假设安装没有问题.并执行正确的话,应 ...
- docker入门-学习笔记
docker可以类比成window下的VMware或者virtualbox软件.docker有两个基本的概念:容器(container)和镜像(image),分别对应为VMware中的系统镜像和系统镜 ...
- Docker入门实践
Docker是一门很成熟的容器技术,类似虚拟机技术主要用做环境的隔离,方便环境的复制镜像,虚拟机是基于操作系统这一层的,而Docker更加的轻量级,像是“应用”层级的.比如我需要一个MySQL环境.一 ...
- Docker入门学习笔记
Docker 什么是Docker 虚拟化技术 在计算机中,虚拟化是一种资源管理技术,将计算机中的各种实体资源如:CPU.硬盘.内存等予以抽象.转换后呈现出来打破实体结构间的不可切割的障碍,使用户可以比 ...
- 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker
Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...
- Docker入门与实践之 Dockerfile 语法详解
一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...
随机推荐
- 第12组 Beta冲刺 (5/5)
1.1基本情况 ·队名:美少女战士 ·组长博客:https://www.cnblogs.com/yaningscnblogs/p/14016978.html ·作业博客:https://edu.cnb ...
- DNS服务学习笔记
1.基本概念 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务. DNS是一个分布式数据库,命名系统采用层次的逻辑 ...
- sql server clr json to table
背景 SQL SERVER 2016 之前版本不支持 直接解析json 步骤: 1 vs 数据库项目 2 生成dll 3 加入信任 DECLARE @hash AS BINARY(64) = (SEL ...
- [C++] epoll server实例
// IO多路复用,事件驱动+非阻塞,实现一个线程完成对多个fd的监控和响应,提升CPU利用率 // epoll优点: // 1.select需要每次调用select时拷贝fd,epoll_ctl拷贝 ...
- 有关C++数据结构
1.临时变量的访问速度远远大于成员变量. 2.C++中唯一一种函数返回值可以做左值的就是引用,本质上也是指针. 3.成员函数末尾加const,表示只读成员函数,不能修改成员变量的值.只读成员函数仅仅用 ...
- ubuntu手动创建快捷方式
新建document,重命名为XXX.desktop,打开文件 以sublime为例,填写 [Desktop Entry] Version=1.0 Type=Application Name=Subl ...
- Swust OJ977: 统计利用先序遍历创建的二叉树中的空链域个数
题目描述 利用先序递归遍历算法创建二叉树并计算该二叉树中的空链域个数. 输入 输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树). 输出 输出该 ...
- Javaweb学习笔记第六弹
本章节的存在意义是:学到PreparedStatement反应较慢,理解不透彻,来做个比较,加深印象 详细讲述PrepareStatement 与 Statement 连接数据库的部分区别 在我学习的 ...
- 【读书笔记】Young Tableau_Calculus of tableaux_bumping and sliding
目录 bumping Schensted bumping algorithm 举例 sliding/digging a hole 一些定义 Schiitzenberger sliding algori ...
- KCP协议浅析
概述 KCP协议结合了TCP和UDP协议的特点,是一个快速可靠的协议. 引述官方介绍: KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大 ...