Dockerfile详解构建镜像

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.mzph.cn/news/791703.shtml

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

相关文章

【Vue3】el-checkbox-group实现权限配置和应用

一. 需求 针对不同等级的用户&#xff0c;配置不同的可见项 配置效果如下 &#xff08;1&#xff09;新增&#xff0c;获取数据列表 &#xff08;2&#xff09;编辑&#xff0c;回显数据列表 应用效果如下 &#xff08;1&#xff09;父级配置 &#xff08;2&#xff09;子级…

详解TCP/IP五层模型

目录 一、什么是TCP五层模型&#xff1f; 二、TCP五层模型的详细内容 1. 应用层 2. 传输层 3. 网络层 4. 数据链路层 5. 物理层 三、网络设备所在分层 封装和分⽤ 三、Java示例 引言&#xff1a; 在网络通信中&#xff0c;TCP/IP协议是至关重要的。为了更好地理解TCP协议的工…

详解设计模式:单例的进化之路

概念 单例模式(Singleton Pattern)是设计模式中一个重要的模式之一&#xff0c;是确保一个类在任何情况下都绝对只有一个实例。单例模式一般会屏蔽构造器&#xff0c;单例对象提供一个全局访问点&#xff0c;属于创建型模式。 根据初始化时间的不同&#xff0c;可以将单例模式…

文件操作讲解

目录 一.为什么使用文件 二.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 三.文本文件和二进制文件 fwrite函数 fclose函数 四.文件的打开和关闭 4.1流和标准流 4.2文件指针 4.3文件的打开和关闭 五.文件的顺序读写 5.1文件的顺序读写函数 5.1.1fgetc函数…

【软件工程】概要设计

1. 导言 1.1 目的 该文档的目的是描述学生成绩管理系统的概要设计&#xff0c;其主要内容包括&#xff1a; 系统功能简介 系统结构简介 系统接口设计 数据设计 模块设计 界面设计 本文的预期读者是&#xff1a; 项目开发人员 项目管理人员 项目评测人员&#xff08;…

VS2022使用属性表快速设置OpenCV工程属性

1.创建C++控制台应用 2.配置工程 3.打开工程后,为工程添加属性表 打开属性管理器窗口,选择Debug|x64 然后右击选择添加新的项目属性表 并命名为opencv490_debug_x64 点击添加 Debug版本属性表添加成功 使用相同方法添加Release版本属性表

Windows通过git配置github代码仓库全流程

git git是代码的版本控制工具 git安装和github注册 这个默认弄过了 通过git和github之间的SSH配置 在github上面新建仓库&#xff0c;做好配置 git绑定GitHub账号 先cd到上传的文件所在的目录 git config --global user.name "你的github用户名"git config -…

网络原理 - HTTP / HTTPS(3)——http响应

目录 一、认识 “状态码”&#xff08;status code&#xff09; 常见的状态码 &#xff08;1&#xff09;200 OK &#xff08;2&#xff09;404 Not Found &#xff08;3&#xff09;403 ForBidden &#xff08;4&#xff09;405 Method Not Allowed &#xff08;5&…

基于java实现的弹幕视频网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示自定义字符应用

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864显示自定义字符应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD12864简单介绍一、LCD…

使用ffmpeg将视频解码为帧时,图像质量很差

当使用ffmpeg库自带的ffmpeg.exe对对视频进行解帧或合并时&#xff0c;结果质量很差。导致这种原因的是在使用ffmpeg.exe指令进行解帧或合并时使用的是默认的视频码率&#xff1a;200kb/s。 如解帧指令&#xff1a; ffmpeg.exe -i 600600pixels.avi -r 2 -f image2 img/%03d.…

深度学习arm cache系列--一篇就够了

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 1. cache的基本概念介绍 1.1、为什么要用cache? ARM 架构刚开始开发时&#xff0c;处理器的时钟速度和内存的访问速度大致相似。今天的处理器内核要复杂得多&#xff0c;并且时…

【基于HTML5的网页设计及应用】——-正则表达式.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

ctf_show笔记篇(web入门---SSRF)

ssrf简介 ssrf产生原理&#xff1a; 服务端存在网络请求功能/函数&#xff0c;例如&#xff1a;file_get_contens()这一类类似于curl这种函数传入的参数用户是可控的没有对用户输入做过滤导致的ssrf漏洞 ssrf利用: 用于探测内网服务以及端口探针存活主机以及开放服务探针是否存…

C语言交换二进制位的奇数偶数位

基本思路 我们要先把想要交换的数的二进制位给写出来假如交换13的二进制位&#xff0c;13的二进制位是 0000 0000 0000 0000 0000 0000 0000 1101然后写出偶数位的二进制数&#xff08;偶数位是1的&#xff09; 1010 1010 1010 1010 1010 1010 1010 1010然后写出奇数位的二进…

uniapp切换中英文

一、安装 npm install uni-i18n --save 二、创建中英文切换的文件 1.英文en.js文件 2.中文zh_CN.js文件 三、 main.js中引用 // Vue i18n 国际化 import VueI18n from /common/vue-i18n.min.js; Vue.use(VueI18n);// i18n 部分的配置&#xff0c;引入语言包&#xff0c;注意路…

Linux :进程的程序替换

目录 一、什么是程序替换 1.1程序替换的原理 1.2更改为多进程版本 二、各种exe接口 2.2execlp ​编辑 2.2execv 2.3execle、execve、execvpe 一、什么是程序替换 1.1程序替换的原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往…

0基础安装配置Linux-ubuntu环境

Vmtools的安装参见 0基础教你安装VM 17PRO-直接就是专业许可证版_vm17许可证-CSDN博客 在vmtools中安装ubuntu 等待安装 这时候发现没有继续按钮&#xff0c;我们关闭这个界面&#xff0c;进入系统中&#xff0c;先更改分辨率 点击这个三角&#xff0c;因为还么有安装成功&am…

【Canavs与艺术】绘制蓝白绶带大卫之星勋章

【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用Canvas绘制蓝白绶带大卫之星勋章</title><style type&quo…

从 MongoDB 到 PostgreSQL 的大迁移

Infisical&#xff0c;一家做密钥管理的开源商业公司&#xff0c;主要对标的是 HashiCorp Vault Infisical 在过去一年里迅速发展&#xff0c;平台现在每天处理超过 5000 万个密钥&#xff0c;将应用程序配置和私密数据发送给需要的团队、CI/CD 流水线以及服务器 / 应用程序。 …