百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Docker镜像和Dockerfile详解 docker中的镜像是什么

wptr33 2024-11-13 15:04 28 浏览

镜像是容器的模板,容器是镜像运行的实例,可以类比为模具和实物的关系或者编程语言里面"类"和"实例"的关系,镜像是静态的定义,容器是动态运行的实体

一、镜像的构成

hello-world

Hello-world是docker官方提供的一个很小的镜像,用来测试docker是否正确运行

$ docker run hello-world
$ docker images

这个镜像才1.04kb,我们看下他的Dockerfile描述

FROM scratch
COPY hello /
CMD ["/hello"]

(1) FROM scratch 说明镜像是白手起家,从0开始构建

(2) COPY hello / 将文件"hello"复制到镜像的目录

(3) CMD ["/hello"] 容器启动时执行 /hello

二、Dockerfile的构建

概念:Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建我们自己需要的镜像

base镜像:

a、不依赖其他镜像,从scratch开始

b、以其他镜像为基础扩展

Dockerfile常用指令,主要分为配置指令和操作指令,一图展示各种命令


配置指令

2.1、ARG(定义镜像创建过程中的变量)

用法:ARG <name>[<default value>]

2.2、FROM

用法:FROM <image>
  • FROM指定构建镜像的基础源镜像,如果本地没有该镜像,默认会从 DockerHub上拉取镜像
  • FROM scratch 说明镜像是从0开始构建,不依赖其他镜像
  • FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像

2.3、LABEL

用法:LABEL <key>=<value> <key>=<value> <key>=<value>

例如:LABEL version="l.0.0-rc3"

LABEL author="yeasy@github" date="2020-01-01"

2.4、EXPOSE(声明镜像内服务监听的端口)

用法:EXPOSE <port>

例如:EXPOSE 22 80 8443

2.5、ENV

用法:ENV <key> <value>或 ENV <key>=<value>

例如:

ENV APP_VERSION=1.0.0

ENV APP_HOME=/usr/local/bin

ENV PATH $PATH:/usr/local/bin

2.6、ENTRYPOINT

支持两种格式:

□ ENTRYPOINT ["executable", "paraml ", "param2"]:exec 调用执行;

□ ENTRYPOINT command param 1 param2: shell 中执行;

每个Dockerfile 中只能有一个ENTRYPOINT, 当指定多个时,只有最后一个起效。

2.7、WORKDIR

指定工作目录

用法:WORKDIR <PATH>

WORKDIR /root/test

操作指令

2.8、RUN

用法:RUN <command>

例如:

RUN apt-get update \

&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \

&& rm -rf /var/cache/apt

2.9、CMD(启动容器时指定默认执行的命令)

用法:CMD command paraml param2 :在默认的Shell 中执行

每个Dockerfile 只能有一条CMD 命令。如果指定了多条命令,只有最后一条会被执行

2.10、ADD

格式为ADD <src> <dest>

COPY的作用和ADD类似,这里不再赘述

三、通过示例练习Dockerfile

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER pythontaotao

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

相关推荐

Python 中 必须掌握的 20 个核心:str()

str()是Python中用于将对象转换为字符串表示的核心函数,它在字符串处理、输出格式化和对象序列化中扮演着关键角色。本文将全面解析str()函数的用法和特性。1.str()函数的基本用法...

python中的函数报错后继续运行而不是停止整个程序

要让main...

如何在身份证号码中提取出生年月日的函数公式

在不同软件中,从身份证号码提取出生年月日的函数公式不同,以下是常见软件的方法:Excelo假设身份证号码在A列,在B列提取出生年月日,在B2单元格输入公式=TEXT(MID(A2,7,8),"...

sql中的一些CTE和开窗函数相关用法

CTE的优势提高可读性:将复杂查询分解为更简单的部分避免重复子查询:同一CTE可以在查询中多次引用递归查询:处理层次结构数据模块化SQL:将复杂查询拆分成逻辑模块...

【SQL】SQL 语法差异大全(PgSQL/MySQL/Oracle/TiDB/OceanBase)

以下是针对不同数据库系统的SQL语法差异总结,按功能分类展示:一、基础查询1.分页查询...

MySQL索引:从原理到实战的终极指南

MySQL索引原理揭秘MySQL索引是数据库高效查询的核心机制,其原理基于特定的数据结构(主要是B+Tree)和数据库引擎(如InnoDB)的实现策略。索引本质上是一种空间换时间的策略,虽然会占...

如何在本地安装开源人工智能Agent——AutoGen Studio的安装

AutoGen是微软出品的一个用于创建可自主行动,或与人类协同工作的多智能体AI应用程序的框架。下面来介绍如何在本地安装AutoGenStudio,AutoGenStudio是一个低代码界...

小巧WinForm库存系统,竟能实现这些功能?

第一次体验真正“握在手里的”库存控制,是在一个微型工厂的仓库运输带旁。顶着仓库里金属味和三十几平米的闷热,老王蹲在地上,一边用笔在账本上划格,一边嘴里嘟囔:“每次都说要数字化管理,数字在哪儿呢?”透过...

有关SQLite数据库的介绍

SQLite,是一种轻型的数据库,它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/U...

SQLite 数据库Web管理工具

概述SQLite数据库以其轻量级和易于配置的特点,成为了许多项目中的首选数据库。尽管它的便捷性受到了广泛的认可,但对于数据库的管理和维护,尤其是在没有图形界面工具的情况下,开发者往往需要通过复杂的命...

SqlLite数据库注意要点分析

1.验证sqlite是否安装配置好了。执行sqlite3命令。当执行该命令的时候没有传递任何参数表示默认连接到了一个内存数据库,当退出该程序的时候,数据库自动销毁。退出命令:.quit.ex...

python 连接sqlite

在Python中,你可以使用标准库sqlite3来连接SQLite数据库。在Python中,sqlite3模块是内置的,无需使用pip进行安装。sqlite3模块提供了与SQ...

提升数据库搜索效率:探索SQLite的向量搜索扩展

大家好!今天我们要聊一个特别酷炫的东西——sqlite-vec,一个能让SQLite飞起来的向量搜索扩展。如果你对数据库的搜索速度不满意,那你可得好好看看这篇文章了。...

Qt编程进阶(21):Qt操作SQLite数据库及实例

QtSql模块Qt提供的QtSql模块实现了对数据库的访问,同时提供了一套与平台和具体所用数据库均无关的调用接口。此模块为不同层次的用户提供了不同的丰富的数据库操作类。例如,对于习惯使用SQL语法的用...

5分钟快速掌握在Python使用SQLite数据库,

小巧、稳定、快速!我为什么喜欢用SQLite...