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

ops/2024/10/19 1:50:41/

Dockerfile 指令

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

from:指定基础镜像

必须为第一个命令

  • 格式

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

    dockerfile">FROM mysql:5.6
    

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

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

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

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

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

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

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

cmd指令执行方式
shell 格式
dockerfile">CMD python app.py
exec格式
dockerfile">CMD ["python", "app.py"]
docker_runCMD_74">【补充】如果在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:用于暴露网络端口

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

dockerfile">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:设置环境变量

格式

dockerfile">ENV [key]=[value]
# key是环境变量的名称,value是环境变量的值
# 在镜像构建过程中,这些环境变量会被设置为指定的值
dockerfile">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_184">【补】在运行容器时,你可以通过docker run -e选项来覆盖环境变量的值
docker run --name env_test2 -e MY_NAME="Alice" dockerfile:test

在这里插入图片描述

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

格式

dockerfile">add [源文件][目的地址]

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

例子

复制本地文件到镜像中

dockerfile">ADD app.py /app/

复制本地目录到镜像中

dockerfile">ADD src/ /app/

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

dockerfile">ADD https://example.com/file.tar.gz /tmp/

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

dockerfile">ADD app.tar.gz /app/

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

不支持自动解压缩

复制本地文件到镜像中:

dockerfile">COPY app.py /app/

复制本地目录到镜像中

dockerfile">COPY src/ /app/

【补】copy 和 add 的区别

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

volume:用于声明挂载点

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

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

dockerfile">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指令所指定的目录

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

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

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

dockerfile">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_314">用dockerfile制作镜像

命令

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

在这里插入图片描述

docker images

在这里插入图片描述

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


http://www.ppmy.cn/ops/122073.html

相关文章

基于大数据的二手房价数据可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

如何使用 Python 读取数据量庞大的 excel 文件

使用 pandas.read_excel 读取大文件时&#xff0c;的确会遇到性能瓶颈&#xff0c;特别是对于10万行20列这种规模的 .xlsx 文件&#xff0c;常规的 pandas 方法可能会比较慢。 要提高读取速度&#xff0c;关键是找到更高效的方式处理 Excel 文件&#xff0c;特别是在 Python 的…

[Day 82] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在風險控制中的應用案例 風險控制是企業管理中至關重要的一環&#xff0c;AI技術的引入為風險控制帶來了前所未有的自動化和智能化。無論是在金融、保險、製造業&#xff0c;還是網絡安全中&#xff0c;AI都能有效地分析和預測潛在風險。本文將探討AI在風險控制中的應用&…

SemiDesgin中后台组件库,字节跳动出品,能否火,有待检验。

2021年字节跳动SemiDesgin中后台组件库发布。 SemiDesgin官方解释&#xff1a;SemiDesgin由是字节跳动抖音前端与UED团队设计、开发并维护&#xff0c;包含设计语言、React 组件、主题等开箱即用的中后台解决方案&#xff0c;帮助设计师与开发者打造高质量产品。 SemiDesgin&a…

webpack/vite的区别

Webpack和Vite都是前端开发中常用的构建工具&#xff0c;它们在多个方面存在显著的区别。以下是对这两个构建工具的详细比较&#xff1a; 一、基础概念与定位 Webpack Webpack是一个现代JavaScript应用程序的静态模块打包器&#xff08;module bundler&#xff09;。它允许开发…

数据结构与算法篇((原/反/补)码 进制)

目录 讲解一&#xff1a;原/反/补)码 一、原码 二、反码 三、补码 四、有符号位整型 五、无符号位整型 六、Java中的整型 七、整数在底层存储形式 讲解二&#xff1a;进制 一、简介 二、常用的进制 十进制 二进制 八进制 十六进制 知识补充 三、进制转换 1. 二…

使用Expo开发RN应用

使用 Expo 来开发 React Native 应用程序是一个非常便捷的选择&#xff0c;特别是当你想快速开始移动应用开发时。Expo 为开发者提供了一系列的开发工具和 API&#xff0c;帮助你更快速地构建、测试和发布应用。以下是一些使用 Expo 开发应用的技巧和实用方法&#xff0c;帮助你…

【C语言】基础篇

简单输出“helloword” #include<stdio.h> int main(){printf("hello world!");return 0; } 和与商 #include<stdio.h> int main(){int a,b,sum,quotient;printf("Enter two numbers:");scanf("%d %d",&a,&b);sum a b…