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可执行 ...
随机推荐
- bigNumber.js的简单使用
sum 计算传入的参数和,参数类型可以是 String,Number // 两数之和 var x = BigNumber.sum('11', 23) x.toNumber() // 34 // 多个参 ...
- 【javascript】chormeV8源码阅读之 GC(垃圾回收)过程 笔记
1.为何需要垃圾回收 在V8引擎逐行执行JavaScript代码的过程中,当遇到函数的情况时,会为其创建一个函数执行上下文(Context)环境并添加到调用堆栈的栈顶,函数的作用域(handl ...
- getopt函数使用说明
一.查询linux命令手册: #include<unistd.h> #include<getopt.h> /*所在头文件 */ int getopt(intargc, char ...
- redis windows版本安装
1.redis3.0-win版本微软已停止更新 链接:https://github.com/microsoftarchive/redis 非官方在持续更新 链接:https://github.com/ ...
- 【Python】pcap抓MySQL网络包
pcap # -*- coding:utf-8 -*- # yum install libpcap-devel python-devel # pip install pypcap hexdump -i ...
- 把OSC_IN/OSC_OUT引脚作为GPIO端口PD0/PD1
外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现.这个重映射只适用于36. 48和64脚的封装(100脚和 ...
- Centos7.6操作系统安装
新建虚拟机 默认下一步 稍后安装操作系统 选择对应的操作系统和版本 指定虚拟机名称和存储位置 处理器配置 内存配置:图形化界面至少2G,字符界面至少1G. 网络类型默认为NAT I/O控制器类型默认L ...
- Android进度表示
在连接上数据库之后,一切都变得简单了呢! 开心,很轻松地就能够将APP里面的相关内容写完啦! 尝试了好久的连接Mysql数据库,最后还是没有成功: 虽然Android studio里面自带的SQLit ...
- ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- P4555 [国家集训队]最长双回文串 回文树(回文自动机)简单题
贴个题目链接:https://www.luogu.org/problem/P4555 题目:输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(∣X∣,∣Y∣≥1)且X和Y都是回文 ...