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

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:7ENTRYPOINT ["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.mzph.cn/web/54028.shtml

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

相关文章

QT C++ 自学积累 『非技术文』

QT C 自学积累 『非技术文』 最近一段时间参与了一个 QT 项目的开发&#xff0c;使用的是 C 语法&#xff0c;很遗憾的是我之前从来没有接触过 C &#xff0c;大学没有开过这堂课&#xff0c;也没用自己学习过&#xff0c;所有说上手贼慢&#xff0c;到现在为止其实也不是很清楚…

【IOS】申请开发者账号(公司)

目录 申请开发者账号前提 查询/申请D-U-N-S 编号 申请开发者 官网&#xff1a;Apple Developer (简体中文) 申请开发者账号前提 如果是第一次申请建议注册一个新的apple id作为组织的开发者账号。&#xff08;确保apple id的个人信息是真实的&#xff0c;不能是网名或者是…

Chainlit集成LlamaIndex实现知识库高级检索(组合对象检索)

检索原理 对象组合索引的原理 是利用IndexNode索引节点&#xff0c;将两个不同类型的检索器作为节点对象&#xff0c;使用 SummaryIndex &#xff08;它可以用来构建一个包含多个索引节点的索引结构。这种索引通常用于从多个不同的数据源或索引方法中汇总信息&#xff0c;并能…

【TabBar嵌套Navigation案例-新特性页面-介绍图片 Objective-C语言】

一、接下来,我们接着来说这个介绍图片啊, 1.看一下我们的示例程序,在这一块儿,有一些介绍图片, 这个飞镖的盘子,全新娱乐场,疯狂什么玩意儿,这些东西呢,实际上,都是我们的素材啊,在素材里边,Guide里边,我们这儿有一个guide1, Open With External Editor,这张图片…

MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵

监控服务器资源 参考网址&#xff1a;https://www.cnblogs.com/144823836yj/p/12126314.html 显示效果 MobaXterm提供有这项功能&#xff0c;在会话窗口底部&#xff0c;显示服务器资源使用情况 如内存、CPU、网速、磁盘使用等&#xff1a; &#xff08;完整窗口&#xff0…

蓝桥杯—STM32G431RBT6(RTC时钟获取时间和日期)

一、RTC是什么&#xff0c;有什么用&#xff1f; 在 STM32 中&#xff0c;RTC&#xff08;Real-Time Clock&#xff0c;实时时钟&#xff09;主要有以下作用&#xff1a; 时间保持&#xff1a;即使在系统断电情况下&#xff0c;也能持续记录时间。&#xff08;需要纽扣电池供电…

【2.使用VBA自动填充Excel工作表】

目录 前言什么是VBA如何使用Excel中的VBA简单基础入门控制台输出信息定义过程&#xff08;功能&#xff09;定义变量常用的数据类型Set循环For To 我的需求开发过程效果演示文件情况测试填充源文件测试填充目标文件 全部完整的代码sheet1中的代码&#xff0c;对应A公司工作表Us…

简易CPU设计入门:取指令(一),端口列表与变量声明

取指令这一块呢&#xff0c;个人觉得&#xff0c;不太好讲。但是呢&#xff0c;不好讲&#xff0c;我也得讲啊。那就尽量地讲吧。如果讲得不好的话&#xff0c;那么&#xff0c;欢迎大家提出好的意见&#xff0c;帮助我改进讲课的质量。 首先呢&#xff0c;还是请大家去下载本…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…

GIS中的投影坐标系

投影说明 GIS操作过程中&#xff0c;不可避免的涉及到处理数据的问题 而数据中有一个极为重要的东西就是其空间参考&#xff08;见下图&#xff09; 地理坐标系与投影坐标系 这里给出一些重要概念的简单定义 地理坐标&#xff1a;就是用经纬度表示地面点位的球面坐标。 地理…

Java项目实战II基于Java+Spring Boot+MySQL的新闻稿件管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 前在信息爆…

基于Springboot+Vue的视频点播系统设计与实现登录 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

基于Spring Boot的校园管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自…

GPT与大模型行业落地实践探索

简介 本课程探讨GPT和大模型技术在行业中的实际应用和发展。课程将涵盖GPT的基础知识、原理、及其在行业中的应用案例&#xff0c;如财报分析和客服机器人。重点在于结合实际案例中的使用效果&#xff0c;讲解如何利用GPT的API开发企业级应用以及利用更高级的功能构造AI Agent。…

react-native-Windows配置

一&#xff1a;官网&#xff1a; React Native for Windows macOS Build native Windows & macOS apps with Javascript and React 二&#xff1a;安装依赖 需要以管理员身份运行powershell,然后粘贴下面代码&#xff0c;注意&#xff1a;要安装淘宝镜像&#xff0c;要…

图解C#高级教程(一):委托

什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同&#xff0c;因为委托可以被执行。当执行委托时&#xff0c;委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…

Skywalking告警配置

背景 skywalking 9.7.0&#xff0c;地址&#xff1a;Backend setup | Apache SkyWalking helm&#xff1a;skywalking-helm:4.5.0&#xff0c;地址&#xff1a;skywalking-helm/chart/skywalking/values.yaml at v4.5.0 首先来说一下为什么使用skywalking告警&#xff1f; …

创客匠人第二期“老蒋面对面”交流会圆满收官!

磅礴的大雨浇不灭奋斗的激情。9月24日&#xff0c;创客匠人第二期老蒋面对面—“创客匠人让知识变现不走弯路”内部大会在集美隆重举行。 本次内部大会旨在传递公司战略精神&#xff0c;深度探讨公司品牌传播的价值、方向和策略。这不仅是一次内部的交流与分享&#xff0c;更是…

linux 内核代码学习(十)--Linux内核启动和文件系统

前面第九章介绍了linux内核文件系统从软盘启动的几种方式&#xff1a;1、从软盘直接启动的linux&#xff0c;软盘上包括内核及简单文件系统&#xff1b;2、从软盘直接启动的linux&#xff0c;将内核与文件系统分别放置在一张软盘上&#xff1b;3、Grub做为引导程序&#xff0c;…

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 随着自然语言处理&#xff08;NLP&#xff09;技术的飞速进步&#xff0c;基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构&#xff0c;如 GPT 系列模型&…