【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解【附加实战】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令(Instruction)和操作命令;每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建(也就是你要执行的操作命令)。

@[toc]

一、dockerfile简介

  什么是dockerfile?

  Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令(Instruction)和操作命令;每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建(也就是你要执行的操作命令)。

  dockerfile是什么?

  •  dockerfile是纯文本文件;
  •  dockerfile是用来构建镜像的;
  •  dockerfile 用于指示 docker image build 命令自动构建Image的源代码;

dockerfile构建镜像的的格式:

docker build -t 要打的镜像名:版本号 Dockerfile路径

dockerfile构建镜像的的实例:

docker build -t work:v1 .

  为什么要用dockerfile?

  ❓在dockerhub中官方提供很多镜像已经能满足我们99%的服务了,为什么还需要自定义镜像?

  🤔️解析:是,官方的镜像很多,同时也可以满足我们99%的服务;但是,如果有的公司要做自己的产品,那么,官网的镜像肯定是没有的,这时候就需要用到自定义镜像,而自定义镜像就是dockerfile构建成的;

  🥳我们可以用dockerfile自定义写需要的操作,来用dockerfile的指令来实现,最终采用docker build来构建镜像,构建完镜像可以采用docker save 命令打成tar包,以便于日后在其他服务器上使用,也可以采用docker push提交到私有镜像仓库或dockerhub中。

在这里插入图片描述
如上图所示,Dockerfile是独立于本地docker实例的一个文本文件,用于自动化地构建具有特定功能的docker镜像。

Dockerfile镜像构建三部曲:
(1)构建Dockerfile文件;
(2)采用 docker build命令构建镜像;
(3)采用 docker run命令依据镜像运行容器实例。

  Dockerfile、Docker镜像和Docker容器的关系

从应用软件开发角度来看,它们分别表示软件开发的三个阶段:

  • (1)Dockerfile是软件开发的原材料;
  • (2)Docker镜像是软件的交付品;
  • (3)Docker容器是Docker交付镜像的实例化,代表软件的实际运行过程。

在这里插入图片描述

总结:Dockerfile面向开发,Docker镜像为交付标准,Docker容器与部署、运维相关,三则相辅相成缺一不可,他们是Docker的三大基石。Docker在实际运行中,Dockerfile、Docker镜像、Docker容器三者的运作内容如下所示:
  • 1、Dockerfile定义了进程需要的一切内容,包括:代码执行、文件/环境变量、依赖包、运行环境、操作系统发行版本、服务进程、内核进程等等,很多与操作系统底层相关的内容。
  • 2、通过docker build指令会生成一个Docker镜像,它是为用户提供各种服务的基础;
  • 3、Docker容器则是一个实例化的服务进程。

二、DockerFile需要注意的编写规范

1. # 代表注释

2.指令必须要大写,后面最少需要带一个参数,最多无限制;

3.执行dockerfile的时候,指令是按照从上到下的顺序执行的;

三、Docekrfile指令解析

注意:指令全部都必须为大写,后面跟的是你要执行的操作命令
指令 功能简介
FROM 指定构建新image是使用的基础image,通常必须是Dockerfile的第一个有效指令;定义一个基础镜像。
LABEL 附加到image之上的元数据,键值格式;定义一些元数据。
ENV 以键值格式设定环境变量,可被其后的指令所调用,且基于新生成的image运行的Container中也会存在这些变量。
RUN 以FROM中定义的image为基础环境运行指令命令,生成结果将作为新image的一个镜像层,并可由后续指令所使用。RUN后跟要执行的命令。
CMD 基于dockerfile生成的image运行的container时,CMD能够指定容器中默认运行的程序,因而其只应该定义一次。
ENTRYPOINT 类似于CMD指令的功能,但不能被命令行指定要运行的应用程序覆盖,且与CMD共存时,CMD的内容将作为该指令中定义的程序的参数。
WORKDIR 相当于cd切换目录的命令,如果切换的那个地方没有哪个目录,则会自动创建一个目录。
COPY 相当于cp命令,复制主机上或者前一阶段构建结果中(需要使用--from选项)文件或目录生成新的镜像。
ADD 与COPY指令的功能相似,但ADD传输压缩包的时候,是可以解压的。
VOLUME 指定基于新生成的Image运行Container时期望作为volume使用的目录。
EXPOSE 指定基于新生成的lmage运行Container时期望 暴露的端口,但实际暴露与否取决于"docker run”命令的选项,支持TCP和UDP协议。
USER 为Dockerfile中该指令后面的RUN、CMD和ENTRYPOING指令中要运行的应用程序指定运行者身份UID,以及一个可选的GID。
ARG 定义专用于build过程中的变量,但仅对该指标之后的调用生效,其值可由命令行选项"--build-arg"进行传递。
ONBUILD 触发器,生效于由该Dockerfile 构建出的新l/mage被用于另一个Dockerfile中的FROM指令作为基础镜像时。
STOPSIGNAL 用于通知Container终止的系统调用信号。
HEALTHCHECK 定义检测容器应用的健康状态的具体方法。
SHELL 为容器定义运行时使用的默认shel程序,Linux系统默认使用 [/bin/sh”,"-c"], Windows默认使用 [’cmd', "/S',"/C']。

四、常用的Dockerfile指令详解、格式与用法

(必须)是写dockerfile必须有的,没有加的是(可选)的。

4.1 FROM(必须)

指定一个基础镜像,必须为第一个命令。

格式

FROM 基础镜像

举例

一个nvidia、cuda10.1的centos7基础镜像
FROM nvidia/cuda:10.1-cudnn7-devel-centos7

4.2 MAINTAINER

维护者信息,可以写邮箱,编辑人等等。

格式

MAINTAINER 邮箱/名字

举例

展示邮箱和名字
MAINTAINER liucy
MAINTAINER 121212@qq.com
MAINTAINER 121212@163.com

4.3 USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

格式

USER 用户名
&&
USER user:group 
&& 
USER uid  
&&
USER uid:gid  
&&
USER user:gid  
&&
USER uid:group

举例

指定root用户
USER root

4.4 ENV(必须)

设置环境变量

格式

ENV 环境变量路径

举例

设置jdk1.8的环境变量
ENV JAVA_HOME=/usr/local/jdk1.8.0_333/
ENV export JRE_HOME=$JAVA_HOME/jre
ENV export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH=$JAVA_HOME/bin:$PATH

4.5 VOLUME

用于指定持久化目录(指定此目录可以被挂载出去)

格式

VOLUME 挂载路径

举例

挂载到/data目录
VOLUME ["/data"]

4.6 EXPOSE

设置端口,EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应该就会开启这个端口的服务。

在Dockerfile中写入这样的声明有两个好处:
是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
在运行是使随机端口映射时,也就是docker run -P(大写)时,会自动随机映射EXPOSE端口。

格式

EXPOSE 端口号

举例

设置一个8080端口
EXPOSE 8080

4.7 COPY

复制文件,相当于linux命令中的cp命令;
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

格式

COPY 源文件及路径 目标路径

举例

复制一个mysql到/usr/local/下
COPY /root/mysql /usr/local/

4.8 ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

格式

ADD 源文件及路径 目标路径

举例

移动一个mysql-2-2.tar
ADD /usr/local/mysql-2-2.tar /root/

4.9 WORKDIR

切换目录,相当于linux命令中的cd命令,切换到这个目录,进入容器时就是这个目录,所以,workdir就属于启动默认的目录。

格式

WORKDIR 目录名

举例

设置启动就在/data/目录
WORKDIR /data/

4.10 RUN(必须)

构建镜像时执行的命令,执行的命令就是你指定的要他干什么,使用linux命令就可以。

格式

RUN 要执行的命令

举例

打镜像时下载一个netstat命令
RUN yum -y install net-tools

4.11 CMD

构建镜像后调用,也就是在容器启动时才进行调用。写一次dockerfile只能出现一次CMD,而出现CMD的地方,就属于结尾,如果下面有RUN指令,则都不执行。

格式

CMD 要执行的命令

举例

执行删除dockerfile(打完镜像,要删除dockerfile)
CMD rm -rf /data/dockerfile

五、docker build构建镜像

dockerfile构建镜像的的格式:

docker build -t 要打的镜像名:版本号 Dockerfile路径

dockerfile构建镜像的的实例:

docker build -t work:v1 .

六、【实战】docker自定义镜像

说明:

  此处只是测试使用,并不能用到生产中,(生产中要根据自己的情况来写),可以构建成镜像,也可以创建容器,可以进入容器查看这些文件,但是web页面访问不到,因为没有加入jar包之类的,可以自行放入一个jar包,端口设置3000,然后启动jar包就可以了去访问web页面了。

前言:
  有一点特别重要,构建镜像的时候要看好你的文件是不是这个目录,要不然打到一半会报错,说找不到文件,切记要记得放文件,在放文件的目录执行。

1、编写Dockerfile

#创建Dockerfile文本
vim Dockerfile
#设置基础镜像
FROM nvidia/cuda:10.1-cudnn7-devel-centos7
#维护者信息
MAINTAINER liucy
MAINTAINER 121212@qq.com
MAINTAINER 121212@163.com
#指定运行时的用户以及镜像的实际用户
USER root
#下载netstat命令
RUN yum -y install net-tools
#设置jdk1.8的环境
ENV JAVA_HOME=/usr/local/jdk1.8.0_333/
ENV export JRE_HOME=$JAVA_HOME/jre
ENV export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH=$JAVA_HOME/bin:$PATH
#开放一个3000端口
EXPOSE 3000
#移动并解压Grafana.tar安装包
ADD /root/Grafana.tar /home/
#复制当前目录下的所有到/data/cs/里
COPY ./ /data/home/
#设置python3.6.8环境
RUN cd /data/Python-3.6.8/ && ./configure --prefix=/root/python36 && make && make install && ln -s /root/python36/bin/python3.6 /usr/bin/python3 && ln -s /root/python36/bin/pip3 /usr/bin/pip3
#切换到/data/目录
WORKDIR /data/
#最后执行删除Dockerfile
CMD rm -rf Dockerfile

2、构建镜像

docker build -t dockerfile:v1 .

等待构建完成。

3、查看镜像

[root@cs ~]# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
dockerfile                 v1                 15c89s63e742      2 months ago           8.5GB

七、总结

  相关文章

【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
Linux中基于Docker搭建harbor私有镜像仓库(超级详细)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
Docker搭建harbor私有镜像仓库(命令行模式)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
linux(centos)中部署docker(步骤超全,含带一些发展史和一些概念)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
如何从docker镜像里提取dockerfile
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  相关专栏

《docker从入门到精通》 《Linux从入门到精通》可以关注专栏奥,会持续更新的。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
Java Shell Linux
入职必会-开发环境搭建49-Docker必会构建镜像
前面一直都是从Docker仓库中下载镜像然后使用。我们项目中可以通过Dockerfile构建自己的镜像。 Dockerfile是由一系列命令和参数构成的文本文件,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。Dockerfile文件内容一般分为4部分 ● 基础镜像信息 ● 维护者信息 ● 镜像操作指令 ● 容器启动时执行的指令
|
3月前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
1天前
|
缓存 开发者 Docker
Dockerfile是Docker容器化过程中的核心组件,它允许开发者以一种可重复、可移植的方式自动化地构建Docker镜像
【8月更文挑战第19天】Dockerfile是构建Docker镜像的脚本文件,含一系列指令定义镜像构建步骤。每条大写指令后跟至少一个参数,按序执行,每执行一条指令即生成新的镜像层。常用指令包括:FROM指定基础镜像;RUN执行构建命令;EXPOSE开放端口;CMD指定容器启动行为等。优化策略涉及减少镜像层数、选择轻量基础镜像、利用缓存及清理冗余文件。示例:基于Python应用的Dockerfile包括设置工作目录、复制文件、安装依赖等步骤。掌握Dockerfile有助于高效自动化构建镜像,加速应用部署。
|
9天前
|
运维 监控 持续交付
构建高效自动化运维体系:Ansible与Docker的协同实践
【7月更文挑战第42天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为提升效率、确保系统稳定性的关键。本文将探讨如何利用Ansible这一强大的自动化工具与Docker容器技术相结合,搭建一个高效、可靠的自动化运维体系。文章首先简述了自动化运维的必要性和Ansible与Docker的基本概念,随后详细介绍了两者结合的优势,并通过实际案例分析展示了如何实现自动化部署、管理和扩展应用服务。通过阅读本文,读者将获得一套可行的自动化运维解决方案,以应对日益复杂的IT环境挑战。
|
11天前
|
存储 缓存 C++
Docker精华篇(三)-如何将 Docker 构建时间减少 40%
Docker精华篇(三)-如何将 Docker 构建时间减少 40%
|
18天前
|
测试技术 持续交付 开发者
使用Docker构建CI/CD流程:从理论到实践
【8月更文挑战第2天】使用Docker构建CI/CD流程,可以显著提高软件开发的效率和质量。通过容器化技术,开发者可以确保环境的一致性,快速部署和测试应用,并减少人为错误。结合合适的CI/CD工具和最佳实践,可以进一步加速软件交付过程,提高用户满意度。希望本文能为开发者在构建基于Docker的CI/CD流程时提供有价值的参考。
|
17小时前
|
缓存 运维 安全
在Docker中,构建镜像应该遵循哪些原则?
在Docker中,构建镜像应该遵循哪些原则?
|
1天前
|
弹性计算 Java Maven
阿里云云效操作报错合集之在构建Docker镜像时提示拉取次数达到限制,该怎么解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
1月前
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
1月前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
48 1