[Docker学习笔记]利用Dockerfile创建镜像

news2024/11/18 23:02:07

Dockerfile 指令

指令作用
from继承基础镜像
maintainer镜像制作者信息(可缺省)
run用来执行shell命令
expose暴露端口号
cmd启动容器默认执行的命令
entrypoint启动容器真正执行的命令
volume创建挂载点
env配置环境变量
add复制文件到容器
copy复制文件到容器
workdir设置容器的工作目录
user使用容器的用户

from:指定基础镜像

必须为第一个命令

  • 格式

    from <image[:tag]> #tag可以缺省,拉取最新版
    from <image>@<digest> #摘要唯一地标识了镜像的特定版本,不会改变,即使镜像的内容发生变化
    # 同样digest摘要也可以省略
    
  • 示例

    FROM mysql:5.6
    

run:构建镜像时执行的命令

RUN是Dockerfile中的一个重要指令,用于在镜像中执行命令,以便在构建过程中安装软件包、配置环境、生成文件等。RUN指令执行的命令会在新的镜像层中运行,并且在后续构建中,只有在该层之前的内容发生变化时才会重新运行,利用了Docker的缓存机制,提高了构建速度。

run指令执行方式
shell 格式(默认格式)
RUN apt-get update && apt-get install -y python3
exec 格式

数组格式,可以避免在Shell中发生意外的解释问题

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", ""]

cmd:定义容器启动时默认要执行的命令

一个Dockerfile中只能包含一个CMD指令,如果有多个,则只有最后一个CMD指令会生效

cmd指令执行方式
shell 格式
CMD python app.py
exec格式
CMD ["python", "app.py"]
【补充】如果在docker run命令中指定了其他命令,则会覆盖CMD指令中的默认命令。

例如,如果在启动容器时执行以下命令,就会覆盖CMD中定义的默认启动命令

docker run my_image python script.py
# 容器启动时会执行script.py脚本

entrypoint:配置容器启动时的默认执行命令

  1. ENTRYPOINT指令的命令会在容器启动时始终执行,无论在docker run命令中是否指定了其他命令。它不会被覆盖,而是作为容器的主要执行命令。
  2. 如果在docker run命令中指定了其他命令,这些命令将作为ENTRYPOINT指令的参数进行传递。也就是说,ENTRYPOINT指令中的命令将成为执行时的前缀
entrypoint例子
FROM centos:7
 
ENTRYPOINT ["echo", "Hello"]
如果我们构建该镜像并运行容器,不提供其他参数,那么容器启动后将输出 “Hello”
$ docker build -t my_image .
$ docker run my_image
Hello
如果我们在运行容器时提供了其他参数,那么这些参数将作为ENTRYPOINT指令中命令的参数
$ docker run my_image ls
Hello ls
# 此时的ls已经不是命令了,而是作为一个参数传递给entrypoint
# 类似于ENTRYPOINT ["echo", "Hello","ls"]

在实际应用中,可以使用ENTRYPOINT指令来定义一个可执行的程序或脚本,然后在容器启动时运行这个程序,并将Docker容器作为可执行应用来使用。这样可以确保容器在运行时的行为是可预期的,而且可以将容器配置和执行逻辑完全封装在镜像内部,使得容器的使用更加方便和易于管理。

这段话说简单点:无论用户以什么样的方式执行docker run,最后都会执行entrypoint指定的动作(前提是有entrypoint)

expose:用于暴露网络端口

它并不会实际上打开或映射端口,而是作为一个文档功能,用于告知用户该镜像内的服务或应用程序将使用指定的端口

FROM centos:7
 
# 声明容器将监听80端口
EXPOSE 80

在使用docker run命令启动容器时,如果需要通过主机访问容器的80端口,还需要使用-p选项来进行端口映射

$ docker built -t my_image . #先docker build创建镜像
$ docker run -p 8080:80 my_image # 映射宿主机8080端口提供容器服务

env:设置环境变量

格式

ENV [key]=[value]
# key是环境变量的名称,value是环境变量的值
# 在镜像构建过程中,这些环境变量会被设置为指定的值
FROM centos:7
 
# 设置环境变量
ENV MY_NAME yy
ENV APP_HOME /app
 
# 创建目录并设置工作目录
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
 
# 复制应用程序到镜像中
COPY . .
 
# 在运行时输出环境变量
CMD echo "Hello, i am $MY_NAME"
 docker build -t dockerfile:test .

在这里插入图片描述

docker images

在这里插入图片描述

docker run --name env_test1 dockerfile:test

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【补】在运行容器时,你可以通过docker run -e选项来覆盖环境变量的值
docker run --name env_test2 -e MY_NAME="Alice" dockerfile:test

在这里插入图片描述

add:将文件、目录或远程URL复制到镜像中

格式

add [源文件][目的地址]

除了复制文件和目录,ADD指令还支持自动解压缩。如果源文件是一个压缩文件(例如.tar、.tar.gz、.tgz、.zip等),那么ADD指令会自动解压缩该文件到指定的目录

例子

复制本地文件到镜像中

ADD app.py /app/

复制本地目录到镜像中

ADD src/ /app/

从远程URL下载文件并复制到镜像中

ADD https://example.com/file.tar.gz /tmp/

解压缩压缩文件并复制到镜像中

ADD app.tar.gz /app/

copy:将本地文件或目录复制到镜像

不支持自动解压缩

复制本地文件到镜像中:

COPY app.py /app/

复制本地目录到镜像中

COPY src/ /app/

【补】copy 和 add 的区别

在构建镜像时,Docker将会在镜像的文件系统层中添加复制的文件或目录。这使得镜像的构建过程更加明确,不会产生自动解压缩的不确定行为。相对于ADD指令,COPY指令更为推荐,特别是在只需要简单复制本地文件或目录的情况下。COPY指令功能简单,不容易引起不必要的意外行为。对于大多数复制文件的场景,建议使用COPY指令

volume:用于声明挂载点

挂载点(数据卷)是一个特殊的目录,它可以绕过联合文件系统(UnionFS),并在容器间共享数据

在一个Dockerfile中可以使用多个VOLUME指令来声明多个挂载点

FROM centos:7
 
# 声明两个挂载点/app/data和/app/logs,这样在运行容器时,可以将这两个挂载点映射到主机的文件系统中,以实现数据持久化和共享
VOLUME ["/app/data", "/app/logs"]

运行容器时,可以使用-v选项或–mount选项来将主机的目录或数据卷映射到容器的挂载点

docker run -v /host/data:/app/data -v /host/logs:/app/logs my_image
# 将主机的/host/data和/host/logs目录分别映射到容器中的/app/data和/app/logs挂载点,实现了主机和容器之间的数据共享

workdir:用于设置工作目录

在容器启动时,进程的当前工作目录将被设置为WORKDIR指令所指定的目录

FROM centos:7
 
# 设置工作目录
WORKDIR /app
 
# 容器启动时运行的命令
CMD ["python", "app.py"]

# 当容器启动时,进程的当前工作目录将自动设置为/app,这样在执行CMD指令时,不需要使用绝对路径来运行python app.py

user:用于指定在容器中运行镜像时要使用的非特权用户

默认情况下,Docker容器在启动时以root用户身份运行,这意味着容器内的进程具有最高权限。然而,为了加强安全性,避免潜在的安全风险,最好以非特权用户的身份运行容器中的应用程序

FROM centos:7
 
# 创建一个新用户并切换到该用户
RUN useradd -ms /bin/bash myuser
USER myuser
 
# 设置工作目录
WORKDIR /app
 
# 复制应用程序到工作目录
COPY . .
 
# 设置环境变量
ENV APP_ENV production
 
# 容器启动时运行的命令
CMD ["python", "app.py"]

#使用useradd命令创建了一个名为myuser的新用户,并使用-ms /bin/bash选项指定了创建用户时使用的shell。
#通过USER指令切换到了myuser用户
#在容器运行时,进程将以myuser用户的身份运行,而不是以root用户身份

用dockerfile制作镜像

命令

docker build -t <容器名[:标签名]> <dockerfile所在目录>
docker build -t dockerfile:test_new .

在这里插入图片描述

docker images

在这里插入图片描述

接下来就可以用docker run 命令来启动容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝卓亮相中国工博会,打造以数据驱动的智能工厂

9月28日&#xff0c;以“工业聚能&#xff0c;新质领航”为主题的第24届中国国际工业博览会&#xff08;以下简称“工博会”&#xff09;在国家会展中心&#xff08;上海&#xff09;圆满拉下帷幕。本届工博会共设9大专业展区&#xff0c;吸引了来自全球28个国家和地区的2600余…

针对考研的C语言学习(定制化快速掌握重点4)

typedef的使用 简化变量类型 逻辑结构 集合结构&#xff1a;无关系 线性结构&#xff1a;一对一 树形结构&#xff1a;一对多 图形结构&#xff1a;多对多 存储结构 顺序存储和链式存储&#xff08;考代码&#xff09; 顺序存储优点&#xff1a;1.可以实现随机存取。2.…

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中&#xff0c;我们开启了Spring Boot的入门之旅&#xff0c;成功构建了第一个Spring Boot应用。我们从环境搭建开始&#xff0c;详细介绍了JDK的安装以及IDE的选择与配置&#xff0c;然后利用Spring Initializr创建了项目&#xff0c;分析了项目结构&am…

资质申请中常见的错误有哪些?

在申请建筑资质的过程中&#xff0c;企业可能会犯一些常见的错误&#xff0c;以下是一些需要避免的错误&#xff1a; 1. 资料准备不充分&#xff1a; 申请资质需要提交大量的资料&#xff0c;包括企业法人资料、财务报表、业绩证明等。资料不齐全或不准确都可能导致申请失败。…

多线程(一):线程的基本特点线程安全问题ThreadRunnable

目录 1、线程的引入 2、什么是线程 3、线程的基本特点 4、线程安全问题 5、创建线程 5.1 继承Thread类&#xff0c;重写run 5.1.1 创建Thread类对象 5.1.2 重写run方法 5.1.3 start方法创建线程 5.1.4 抢占式执行 5.2 实现Runnable&#xff0c;重写run【解耦合】★…

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…

【Mysql】SQL语言基础

1、SQL的概述 SQL全称&#xff1a;Structured Query Language,是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统systemr上实现。 美国国家标准局&#x…

亚信安全发布第34期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件91起&#xff0c;近三周勒索事件数量较为稳定。从整体上看&#xff0c;Ransomhub是影响最严重的勒索家族&#xff1b;Play和ElDorado恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。本周&#xff0c;土耳其公司巴克皮…

小红书2024秋招后端开发(Java工程师、C++工程师等)

前几天做了美团&#xff0c;OPPO的秋招笔试题&#xff0c;然后又做了一场小红书&#xff0c;总体难度我觉得都差不多&#xff0c;涉及到的知识点要么是语法模拟&#xff0c;或者就是一些基础算法&#xff0c;所以这样看秋招编程题还是很简单的&#xff0c;对于笔试我们还要把除…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在&#xff0c;只需要复制到指定的位置即可。 sentinel是独立进程&#xff0c;有对应的脚本来执行。 基于之前的redis 一主二从的架构&#xff0c;我们继续启动3个sentinel进程。 哨兵模式的…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中&#xff0c;使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据&#xff0c;非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

GPU参数指标

以英伟达的A800卡为例&#xff0c;简单聊聊GPU卡的核心参数指标&#xff0c;A800的核心指标主要有5个&#xff0c;为算力、显存大小、显存带宽、功耗情况和卡间互联速率。 性能&#xff1a;则可以理解为货车对不同货物类型的马力大小&#xff0c;决定能“拉动”多少重量的货&…

实用工具推荐---- PDF 转换

直接上链接&#xff1a;爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下&#xff1a; 全免费&#xff01;&#xff01;&#xff01;&#xff01;

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…

httpsok-v1.17.0-SSL通配符证书自动续签

&#x1f525;httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻…

Java中使用接口实现回调函数的详解与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;记账本小…

【游戏分组】

题目来源 from itertools import combinations def get_input(): """获取输入的整数列表。""" return list(map(int, input("请输入10个整数&#xff08;用空格分隔&#xff09;: ").split())) def get_min_difference(arr): &q…

OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform)&#xff0c;它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间&#xff0c;来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…