docker_基础_DockerFile

1.利用 dockerfile 定制镜像

??镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile
?? Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建.

配置第一个dockerfile文件
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
内容:
FROM nginx
RUN echo ‘<h1> hello,docker! </h1>‘ > /usr/share/nginx/html/index.html

FROM 指定基础镜像
??所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令
??除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像

            FROM scratch

??如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
??不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如swarm 、 coreos/etcd 。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go是特别适合容器微服务架构的语言的原因之一

RUN 执行命令
??RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:
??shell 格式: RUN <命令> ,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
??例如:RUN echo "123" > /tmp/1.txt

??exec 格式: RUN ["可执行文件", "参数1", "参数2"] ,这更像是函数调用中的格式

??Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像,Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过127 层

??因此,这里没有使用很多个 RUN对应一一不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来, 以下只是一个演示,可能不能运行,在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建

比如 RUN yum -y install nginx                                 && echo "hello docker" > /usr/share/nginx/html/index.html                                && systemctl start nginx                                 && tail -f /var/log/nginx/access.log
        Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯

构建镜像
? 语法: docker build [选项] <上下文路径/URL/->

[[email protected] mynginx]# docker build -t nginx:v4 .
                Sending build context to Docker daemon  2.048kB
                Step 1/2 : FROM nginx
                 ---> 7f70b30f2cc6
                Step 2/2 : RUN echo ‘<h1> hello,docker! </h1>‘ > /usr/share/nginx/html/index.html
                 ---> Running in 065c3e52b540
                Removing intermediate container 065c3e52b540
                 ---> 3d80dfa73097
                Successfully built 3d80dfa73097
                Successfully tagged nginx:v4

                [[email protected] mynginx]# docker images
                    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
                    nginx               v4                  3d80dfa73097        About a minute ago   109MB

             运行   以后台方式运行 名称为test 端口映射80:80
            $ docker run -dit --name test -p 80:80 nginx:v4

镜像构建上下文(Context)
build 构建时最后带的那个. 并不是指定Dockerfile所在的路径,这样理解是不正确的,如果对应上面的命令格式,这其实是在指定上下文路径

??docker build 工作原理: Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 DockerRemote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举

原文地址:http://blog.51cto.com/xiong51/2093846

时间: 2024-08-04 04:26:24

docker_基础_DockerFile的相关文章

docker_基础_4_监控

接上篇12-20 21.监控 21.1.使用InfluxDB+cAdvisor+Grafana配置Docker监控   cAdvisor: Google开源的用于监控基础设施应用的工具,它是一个强大的监控工具,不需要任何配置就可以通过运行在Docker主机上的容器来监控Docker容器,而且可以监控Docker主机.更多详细操作和配置选项可以查看Github上的cAdvisor项目文档.  influxDB: 它是一个分布式时间序列数据库.cAdvisor仅仅显示实时信息,但是不存储监视数据.因

Docker_基础运用

1 docker的好处 开箱即用:快速部署:可移植性强:环境隔离 2 docker的常用命令 查看系统存在的镜像 docker images 网络搜索镜像(镜像名称组成 repository:tag) docker search 镜像名称 拉取镜像下载到本地(镜像名称组成 repository:tag) docker pull 镜像名称 删除镜像(-f 强制删除) docker rmi -f 镜像id 运行 (-d 表示守护进程,后台运行; -p表示端口映射,后面表示容器端口,前面表示物理机端口

docker_基础_2

接上篇 [上篇文件](http://blog.51cto.com/xiong51/2093556) 8.数据管理 docker数据持久化,数据共享,容器数据管理操作 数据卷(Volumes):容器内数据直接映射到本地主机环境数据卷容器 (Bind mounts):使用特定容器维护数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:数据卷 可以在容器之间共享和重用对 数据卷 的修改会立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即使容器

docker_基础_3

接上篇 第8-11章 12.基本架构 ?? 早期的docker是基于已经成熟的LXC(linux container)技术实现的.自0.9版本起,docker已经逐渐从LXC转移到新的libcontainer上,并且积极推动开放容器规范runc:?? 从OS功能上看,目前Docker底层依赖的核心技术主要包括linux操作系统的命名空间(name space), 控制组( cgroup ),联合文件系统( union file system 或 aufs )和linux网络虚拟化支持. ?? d

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

NumPy基础:数组和失量计算

NumPy : Numerical Python,是高性能科学计算和数据分析的基础包. 部分功能: ndarray:一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组: 用于对整组数据进行快速运算的标准数学函数(无需编写循环): 用于读写磁盘数据的工具以及用于操作内存映射文件的工具: 线性代数.随机数生成以及傅里叶变换功能: 用于集成C.C++.Fortran等语言编写的代码工具: 大部分数据分析应用关注的功能: 用于