Dockerfile详解构建镜像

news2024/11/17 13:46:21

Dockerfile构建企业级镜像

在服务器上可以通过源码或rpm方式部署Nginx服务,但不利于大规模的部署。为提高效率,可以通过Dockerfile的方式将Nginx服务封装到镜像中,然后Docker基于镜像快速启动容器,实现服务的快速部署。

Dockerfile是一个用来构建镜像的文本文件,文本内容包含一条条构建镜像所需的指令和说明。

Dockerfile构建

Dockerfile用于定义Docker镜像构建过程的文件。是一个文本文件,包含一系列的指令和参数,用于自动化构建Docker镜像。Dockerfile中每个指令代表一个构建步骤,可以指定所使用的基础镜像、安装软件、配置环境变量、复制文件、运行命令等。

  • 构建镜像

在Dockerfile文件所在目录下执行命令

docker build -t image_name:tag .

# 例子
docker build -t myapp:1.0 .

-t指定镜像名称和标签 .表示是Dockerfile文件的所在目录

  • 运行容器
docker run -d -p 8080:80 myapp:1.0

Dockerfile文件内容语法

  • FROM:指定所用的基础镜像,如FROM centos:latest
FROM centos
RUN yum install -y httpd
COPY index.html /var/www/html/
EXPOSE 80
CMD ["httpd","-DFOREGROUND"]

该Dockerfile创建一个基于CentOS的镜像,安装httpd服务器,将index.html文件复制到/var/www/html/目录下,将容器的80端口暴露,最后容器启动时启动httpd服务器

  • MAINTAINER:指定镜像维护者的信息,MAINTAINER yourname <email>
  • RUN:在容器中执行的命令,如RUN apt-get update && apt-get install -y curl

RUN用于在镜像构建过程中的执行命令。在Dockerfile中,每一个RUN指令都会在一个新的镜像层上执行,最终形成一个新的镜像。

RUN命令中可以执行任何有效的Linux命令,如安装软件包、创建文件夹、运行脚本等。

RUN指令有两种模式:shell模式和exec模式。shell模式下,命令在容器默认的shell中运行,在exec模式下,命令以exec系统调用的方式运行。exec模式更加高效和安全

exec模式示例

FROM alpine
RUN apk add --no-cache git
RUN --mount=type=cache,target=/root/.cache \
	git clone https://github.com/example/example.git
WORKDIR /example
RUN --mount=type=cache,target=/root/.cache \
	apk add --no-cache python3 \
	&& pip3 install -r requirements.txt
CMD ["python3", "app.py"]

使用exec模式,第一个RUN命令,使用apk安装git,第二个和第三个RUN指令中,使用–mount选项指定缓存目录,安装Python3和Python依赖库。第二个RUN指令中,使用Git克隆了一个仓库目录。最后在CMD中执行了python的程序。

  • CMD:容器启动时执行的命令

CMD命令可以有多个,但是只有最后一个会被执行。

同样有shell模式和exec模式,exec模式更安全和高效。要注意的是:使用exec模式时,必须将CMD指令和参数放入JSON数组中。否则Docker会将整个字符串当成命令执行,可能导致错误。

  • ENTRYPOINT: 指令用于设置容器启动时默认命令或应用程序,与CMD指令类似,都是容器启动时执行的命令。但当ENTRYPOINTCMD同时出现时,CMD指令的作用就是为ENTRYPOINT命令指定的程序或命令提供默认参数。也就是说,CMD中定义的参数将会把ENTRYPOINT中的参数给覆盖。
FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl
ENTRYPOINT ["curl","-s","-o","/dev/null"]
CMD ["https://www.google.com"]

最后的效果就是使用curl指令获取Google网站的内容…,达到了参数拼接的效果。

  • EXPOSE:声明容器运行监听的端口,EXPOSE 80

声明容器监听的网络端口。此指令不会在容器启动时自动将端口映射到宿主机上,而是提供给运行容器的人员一个提示,告诉他们应该监听的 端口。

FROM nginx
EXPOSE 80

启动容器时,使用-p参数指定宿主机和容器的端口映射配置。

docker run -d -p 8080:80 my-nginx-image

宿主机监听8080端口,转发到容器的80端口上。

  • ENV: 设置环境变量,ENV_MYSQL_ROOT_PASSWORD=123456
FROM ubuntu:latest
ENV MY_NAME="Docker"
CMD echo "Hello, ${MY_NAME}!"

输出Hello, Docker但是需要注意的:Docker中ENV的变量只能是容器内部使用,只有像CMD,ENTRYPOINT这样的命令来使用,像RUN等构建镜像时的命令是使用不了的,可以用ARG声明的环境变量。

  • ARG:设置环境变量或传递Docker镜像构建时参数,可以动态进行传值
# 定义一个构建参数,可以设置默认值,若无指定参数的值,采用默认值
ARG <name>[=<default value>]

# 实例
ARG BUILD_VERSION
ARG COMMIT_SHA

Dockerfile中使用

ARG VERSION=latest
FROM ubuntu:${VERSION}

构建镜像时可以动态传值,若无值则使用默认值

docker build --build-arg VERSION=1.0.0 -t myimage
  • ADD: 将本地文件或目录复制到容器中,若本地是一个压缩包,先把压缩包解压后放入容器ADD ./app /app
# 语法
ADD <源路径> <目标路径>

# 示例
ADD example.tar.gz /app/	# ADD命令自动解压
ADD https://example.com/file.tar.gz /app/ # 可以从URL下载文件到容器中

注意:ADD命令会修改文件的权限和属主信息,若不需要ADD高级功能尽量采用COPY

  • COPY: 复制本地文件或目录到容器中,是压缩包时不会解压

需要注意:源路径必须在构建上下文中存在(放到和Dockerfile文件统一目录),否则Docker构建过程会失败

# 语法
COPY <源路径> <目标路径>

# 示例:将宿主机本目录下的app目录,复制到容器中的app目录下
COPY ./app/ /app
  • WORKDIR: 设置工作目录 WORKDIR /app,类似于linux的cd命令
  • VOLUME: 设置持久化数据的挂载点 VOLUME /data

Docker中创建一个挂载点,实现数据持久化功能。使用VOLUME指令创建的挂载点会在容器启动时自动创建,且容器销毁时挂载点不会被删除,数据可以长久保存。

VOLUME指令不会在主机上创建一个新目录,而是将一个已经存在的目录挂载到容器中。因此在使用VOLUME指令时,需要在容器创建时通过-v--mount参数指定挂载目录。

VOLUME /data

启动容器时

docker run -v /path/to/data:/data <image>

将主机的/path/to/data目录和容器的/data目录进行挂载。若是未声明/path/to/data的主机目录,那么会在主机随机生成一个目录(匿名数据卷)和容器/data目录进行挂载。

匿名数据卷在docker的存储目录是/var/lib/docker/volumes中,匿名数据卷在容器被删除时,也会被清理掉,所以尽量采用命令数据卷方式,防止数据意外丢失。

案例:构建Nginx镜像

# 创建一个dockerfile的目录
mkdir nginxDockerfile

# 进入目录
cd nginxDockerfile

# 创建Dockerfile文件
vim Dockerfile

创建内容如下:

FROM centos											# 使用centos作为基础镜像
MAINTAINER xiaolu									# 作者

WORKDIR /etc/yum.repos.d/							# 进入yum配置目录
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \ && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*							# 设置os8的yum源
\&& yum makecache									# 更新缓存

\&& yum -y install nginx							# 安装nginx
\&& yum -y install wget								# 安装wget
COPY index.html /usr/share/nginx/html/				# 将文件拷贝到镜像
EXPOSE 80											# 提示暴露端口
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]	# 容器启动执行的命令

若是centos8镜像,记得给配置上yum源,同时最好可以一条RUN将他们全都执行完毕,因为每执行一个RUN,镜像就会增加一层。daemon off;是nginx的全局配置参数,用于让Nginx在前台运行,不作为守护进程在后台运行。

Tips:Docker容器启动时,默认把容器内第一个进程,也就是pid=1的程序作为判断docker容器是否在运行的依据,若pid=1的程序崩溃,那么docker容器自动关闭。该例中,nginx若是后台运行,Docker未执行自定义的CMD前,Nginx的pid=1,运行完毕后Nginx变成后台进程,docker将判断nginx程序崩溃或结束,自动关闭docker容器。

记得Dockerfile文件中把中文注释删了哦,小心报错!!,完整版贴这里

FROM centos
MAINTAINER xiaolu
WORKDIR /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \
 && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* \
 && yum makecache \
 && yum -y install wget \
 && yum -y install nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
  • 创建页面vim index.html
<html>
    <head>
        <title>page added to Dockerfile</title>
    </head>
    <body>
        <h1>
            Hello,My Name is Xiaolu,Welcome to my nginx page!
        </h1>
    </body>
</html>
  • 构建镜像
docker build -t xiaolu/nginx:v1 .
  • 查看镜像是否构建完毕
docker images |grep nginx

在这里插入图片描述

  • 镜像构建完毕了,创建启动容器
docker run -d -p 80:80 --name html2 xiaolu/nginx:v1

访问我们的宿主机的80端口将会映射到容器的80端口,获取到我们需要的资源。

这里说个小知识点,当80:80写成80时,意思是随机分配宿主机的端口和容器80端口进行映射。

在这里插入图片描述

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

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

相关文章

Python机器学习实验 Python 数据分析

1.实验目的 掌握常见数据预处理方法&#xff0c;熟练运用数据分析方法&#xff0c;并掌握 Python 中的 Numpy、 Pandas 模块提供的数据分析方法。 2.实验内容 1. Pandas 基本数据处理 使用 Pandas 模块&#xff0c;完成以下操作。 &#xff08;1&#xff09;创建一个由 0 到 50…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了&#xff0c;烦闷的时候&#xff0c;看到使用 AI 进行作图&#xff0c;可以使用本地话部署。刚好自己家里的电脑&#xff0c;之前买来玩暗黑4&#xff0c;配置相对来说来可以&#xff0c;就拿来试试。 此篇是按照 Github 上的 stable-d…

【智能算法】磷虾群算法(KHA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Gandomi等人受到自然界中磷虾生存行为启发&#xff0c;提出了磷虾群算法&#xff08;Krill Herd Algorithm, KHA&#xff09;。 2.算法原理 2.1算法思想 KHA受南极鳞虾群觅食行…

软件测试用例(2)

具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…

【C++】C++11类的新功能

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 默认成员函数 类成…

2024年阿里云服务器购买、续费、升级优惠活动价格表

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

计算机网络——32差错检测和纠正

差错检测和纠正 错误检测 EDC 差错检测和纠错位&#xff08;冗余位&#xff09; D 数据由差错检测保护&#xff0c;可以包含头部字段 错误检测不是100%可靠的 协议会泄露一些错误&#xff0c;但是很少更长的EDC字段可以得到更好的检测和纠正效果 奇偶校验 单bit奇偶校验 …

【办公类-47-01】20240404 Word内部照片批量缩小长宽(课题资料系列)

作品展示 背景需求 最近在做《运用Python优化3-6岁幼儿学习操作材料的实践研究》的课题研究资料&#xff08;上半学期和下半学期&#xff09;。 将CSDN里面相关的研究照片文字贴入Word后&#xff0c;就发现一张图片就占了A4竖版一页&#xff0c;太大了。我想把word里面的所有…

vue2源码解析——vue中如何进行依赖收集、响应式原理

vue每个组件实例vm都有一个渲染watcher。每个响应式对象的属性key都有一个dep对象。所谓的依赖收集&#xff0c;就是让每个属性记住它依赖的watcher。但是属性可能用在多个模板里&#xff0c;所以&#xff0c;一个属性可能对应多个watcher。因此&#xff0c;在vue2中&#xff0…

Qt + VS2017 创建一个简单的图片加载应用程序

简介&#xff1a; 本文介绍了如何使用Qt创建一个简单的图片加载应用程序。该应用程序可以打开图片文件并在界面上显示选定的图片&#xff0c;并保存用户上次选择的图片路径。 1. 创建项目&#xff1a; 首先&#xff0c;在VS中创建一个新的Qt Widgets应用程序项目&#xff0c;并…

Vulnhub:WESTWILD: 1.1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…

Springboot Thymeleaf 实现数据添加、修改、查询、删除

1、引言 在Spring Boot中使用Thymeleaf模板引擎实现数据的添加、修改、查询和删除功能&#xff0c;通常步骤如下&#xff1a; 在Controller类中&#xff0c;定义处理HTTP请求的方法。创建Thymeleaf模板来处理表单的显示和数据的绑定。 2、用户数据添加 1、 在Controller类中…

2024年福建三支一扶报名指南—照片<100kb

2024年福建三支一扶报名指南—照片<100kb

目标检测——监控下的汽车

一、重要性及意义 首先&#xff0c;车辆检测技术是保证视频监控系统正常运行的基础。通过监控摄像头实时获取的图像&#xff0c;可以自动检测出图像中的车辆&#xff0c;并进行车辆类型的分类和识别。这对于优化城市交通管理、实现智能交通系统具有重要意义。此外&#xff0c;…

智能小车测速(3.26)

模块介绍&#xff1a; 接线&#xff1a; VCC -- 3.3V 不能接5V&#xff0c;否则遮挡一次会触发3次中断 OUT -- PB14 测速原理&#xff1a; cubeMX设置&#xff1a; PB14设置为gpio中断 打开定时器2&#xff0c;时钟来源设置为内部时钟&#xff0c;设置溢出时间1s&#xff0c…

通义灵码功能上线:编程挑战中Claude3(opus)领先一步

最近好多AI博主都在推荐通义灵码&#xff0c;我就下载下来体验了一下&#xff0c;而且目前通义灵码暂时不收费&#xff0c;而且还有一个推荐奖励的活动&#xff0c;活动内容如下&#xff1a; 邀请好友达到一定人数&#xff0c;有一些奖励。 我目前看到微软的Azure云有个语音转…

LabVIEW电力设备在线监测系统

LabVIEW电力设备在线监测系统 在电力行业中&#xff0c;变电站的稳定运行对于保障电力系统的安全性和可靠性至关重要。开发了一种基于LabVIEW软件开发的变电站电力设备在线监测系统&#xff0c;实时监控变电站内部的电力设备状态&#xff0c;确保电力传输的高效与安全。通过对…

Java—抽象方法与接口

声明&#xff1a;以下内容是根据B站黑马程序员的Java课程&#xff0b;博主自己的理解整理而成&#xff0c;课程很好&#xff0c;适合初学者学习。 关于此类题目&#xff0c;重要的是识别出用什么来实现&#xff0c;到底是接口还是抽象方法&#xff0c;还是共有的属性等等&…

React之Diff 算法

在 React 中&#xff0c;通过 React.createElement 也能生成一个虚拟 DOM 节点&#xff08;ReactElement&#xff09;。在 React15 及以前&#xff0c;采用了递归的方式创建虚拟 DOM&#xff0c;递归过程是不能中断的。如果组件树的层级很深&#xff0c;递归会占用线程很多时间…

达梦配置ODBC连接

达梦配置ODBC连接 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 下载ODBC包 下载网址&#xff1a;https://www.unixodbc.org/ unixODBC-2.3.0.tar.gz2 编译并…