Dockerfile 自定义镜像

news2024/11/23 23:57:47

大家好 , 今天我要和大家分享一个现代软件开发中不可或缺的工具 - Docker . 在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 .

docker01.png

本文参考资源 : https://www.bilibili.com/video/BV1HP4118797/?spm_id_from=333.337.search-card.all.click

专栏地址 : https://blog.csdn.net/m0_53117341/category_12682419.html

文章目录

  • 一 . 镜像结构
  • 二 . Dockerfile 语法
    • 2.1 什么是 Dockerfile ?
    • 2.2 Dockerfile 的语法
    • 2.3 基于 Ubuntu 镜像构建出一个新镜像 , 运行一个 Java 项目
      • ① 新建一个空的文件夹 docker-demo
      • ② 将所需要的文件拷贝到 docker-demo 目录下
      • ③ 利用 Docker 构建镜像
      • ④ 构建容器
    • 2.4 基于 java:8-alpine 镜像 , 将一个 Java 项目构建为镜像

一 . 镜像结构

先来复习一下镜像的概念 : 镜像是将应用程序以及需要的系统函数库、环境、配置、依赖打包而成 .
我们以 MySQL 的镜像为例 , 分析一下镜像的结构
镜像的分层结构.png

镜像的分层结构.png

二 . Dockerfile 语法

2.1 什么是 Dockerfile ?

Dockerfile 就是一个文本文件 , 其中包含了一个个的指令 , 通过指令来说明要执行什么操作来去构建镜像 .
我们就可以把 Dockerfile 当做一个构建镜像的说明书 , Docker 就会按照说明书构建出指定的镜像了 .
那每一个指令 , 其实都会形成一层 Layer .

2.2 Dockerfile 的语法

指令说明实例
FROM指定基础镜像FROM centos:8
ENV设置环境变量 (可以理解为全局变量) , 可供后续指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录copy ./mysql-5.7 .rpm /tmp
RUN执行 Linux 的相关 Shell 命令 , 一般是安装命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口 , 也就是 -p 后面的参数EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令 , 容器运行时进行调用ENTRYPOINT java -jar xx.jar

2.3 基于 Ubuntu 镜像构建出一个新镜像 , 运行一个 Java 项目

① 新建一个空的文件夹 docker-demo

cd /tmp/
mkdir docker-demo
cd docker-demo/

image.png

② 将所需要的文件拷贝到 docker-demo 目录下

docker-demo.jar
jdk8.tar.gz
Dockerfile.zip

Dockerfile 需要进行解压之后再进行上传

我们可以来看一下 Dockerfile 的内容

# 指定基础镜像
FROM ubuntu:16.04

# 配置环境变量, JDK 的安装目录
# ENV 就相当于全局变量
ENV JAVA_DIR=/usr/local

# 拷贝 JDK 和 Java 项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/ 
COPY ./docker-demo.jar /tmp/app.jar

# 安装 JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090

# 入口, Java 项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

image.png

③ 利用 Docker 构建镜像

# docker build 表示构建镜像
# -t 表示版本 (tag)
# test:1.0 前半部分是镜像名称, 后半部分是镜像的版本号
# . 表示的是 Dockerfile 所在的目录, 当前 Dockerfile 文件就在此目录
docker build -t test:1.0 .

image.png
此时我们就可以看一下镜像是否构建完毕

# 查看本地镜像
docker images

image.png

④ 构建容器

我们可以构建并且启动容器

# docker run : 创建并运行容器
# --name web : 给当前容器起一个别名
# -p 8090:8090 : 将宿主机的 8090 端口和容器的 8090 端口进行绑定
# -d : 设置容器后台运行
# test:1.0 : 要操作的镜像
docker run --name web -p 8090:8090 -d test:1.0

image.png

2.4 基于 java:8-alpine 镜像 , 将一个 Java 项目构建为镜像

我们刚才的 Dockerfile 文件 , 其实我们观察一下 , 只有一个位置才发挥了作用
image.png
那 java:8-alpine 镜像就包含了基础环境的所有步骤 , 那所以我们就可以把无用代码全部删掉 , 基础镜像指定成 java:8-alpine 就可以了

# 指定基础镜像
FROM java:8-alpine

# 拷贝 java 项目包
COPY ./docker-demo.jar /tmp/app.jar

# 暴露端口
EXPOSE 8090

# 入口, Java 项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

那我们就可以把修改之后的 dockerfile 重新上传
image.png
我们重新构建镜像

我们需要提前关闭之前 1.0 版本的镜像
docker stop web

# 构建镜像
docker build -t test:2.0 .

image.png

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

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

相关文章

利用stream软件工具免费下载视频号视频,亲测可长期使用!

今天来说说stream软件工具下载视频号视频的工具,也是全网唯一利用手机下载视频号的视频方法!经过自己的研究发现,互联网上80%都不知道的下载方法! stream 网络数据流 stream是通过数据流可查看平台给服务器发送了什么请求,要服务…

BetterZip 5软件详细安装步骤(最新版软件下载)

​BetterZip是一款功能强大的Mac解/压缩软件,可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍,以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-…

混淆矩阵-召回率、精确率、准确率

混淆矩阵 1 混淆矩阵2 混淆矩阵指标2.1 准确率2.2 精确率2.3 召回率2.4 特异度2.4 假正率2.5 假负率2.6 F1 分数 3 总结 1 混淆矩阵 混淆矩阵是一种用于评估分类模型性能的重要工具。它通过矩阵形式清晰地展示了模型对样本进行分类的结果,帮助我们理解模型在不同类…

[C++] 从零实现一个ping服务

💻文章目录 前言ICMP概念报文格式 Ping服务实现系统调用函数具体实现运行测试 总结 前言 ping命令,因为其简单、易用等特点,几乎所有的操作系统都内置了一个ping命令。如果你是一名C初学者,对网络编程、系统编程有所了解&#xff…

使用百度的长文本转语音API时无法下载.MP3文件

今天是学生们交作业的时候,结果是我最忙碌的一天,各种改bug。 有个学生来问: 我在百度提供的API代码(长文本转语音)的基础上添加了下载生成的.MP3文件的代码,运行之后成功建成了.MP3文件,但是文件的内容确实以下的报错…

监控室,屏幕显示不支持码流

1号屏,出现不支持码流 如下原因 老是录像机 无法关闭自动添加摄像头功能, 其他杂牌摄像头 会自动还ip 最终导致 ip冲突 更换ip 可以解决

openstack删除实例卡死在正在删除中

删除实例 问题描述解决办法 实验环境;服务器,openstackY版 问题描述 openstack在删除实例时一直显示正在删除中 解决办法 进入数据库修改实例状态,修改为错误,然后重新删除 首先查看对应实例id 进入数据库修改 rootcompute:~…

数据库原理(关系型数据库基本理论)——(

一、关系的概念 1.关系的定义 (1)域 域是一组具有相同数据类型的值的集合,可以理解为int[](int类型的数组)是一个域。 (2)笛卡儿积 简单来说,若干个域的笛卡儿积就是将这几个域的…

算法与数据结构--决策树算法

欢迎来到 Papicatch的博客 文章目录 🍉决策树算法介绍 🍈原理 🍈核心思想包括 🍍递归分割 🍍选择标准 🍍剪枝 🍈解题过程 🍍数据准备 🍍选择最佳分割特征 &…

pdf转图片,pdf转图片在线转

pdf转图片的方法,对于许多人来说可能是一个稍显陌生的操作。然而,在日常生活和工作中,我们有时确实需要将pdf文件转换为图片格式,以便于在特定的场合或平台上进行分享、展示或编辑。以下,我们将详细介绍一个pdf转成图片…

【每天学会一个渗透测试工具】dirsearch安装及使用指南

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨dirsearch介绍 dirsearch安装包百度网盘 disearch是基于Python开发的,因此需要确保你的系统中已经安装了pyth…

linux中acl策略+文件权限

文档归属的局限性 - 任何人只属于三种角色:属主 属组 其他人- 无法实现更精细的控制 acl访问策略 - 能够对个别用户个别组设置独立的权限- 大多数挂载ext3/4,xfs文件系统默认已支持 Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...setfacl [选项] u:用户名…

消息队列-分布式消息队列技术选型

Kafka Kafka 是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。 流式处理平台具有三个关键功能: 消息队列:发布和…

【C++入门(1)】命名空间

一、C出世 我们先简单认识下C的来历,C是在C语言的基础上发展来的。 当年C的设计者Bjarne Stroustrup,本贾尼斯特劳斯特卢普先生设计C语言之初,是为了对C语言做出一些更改,弥补C语言在一些方面的不足,或者做出其他的设…

JAVA开发 选择多个文件,系统运行后自动生成ZIP压缩包

选择多个文件,系统运行后自动生成ZIP压缩包 实现方法1.1 代码块1.2 运行结果截取 相关知识 实现方法 案例简述:通过启动java代码来打开文件选择器对话框,用户选择确认需要进行压缩的文件,可一次性选择多个文件,选择完…

whisper 模型源码解读

whisper官方源码 whisper 模型官方代码:https://github.com/openai/whisper/blob/main/whisper/model.py ;注释如下 import base64 import gzip from dataclasses import dataclass from typing import Dict, Iterable, Optionalimport numpy as np impo…

ffmpeg解封装rtsp并录制视频-(2)使用VLC模拟一个rtsp服务器并用ffmpeg解封装该rtsp流

VCL模拟服务器并打开播放该视频文件: - 准备好一个mp4文件,打开vlc软件 - 选择“媒体”》“流” - 添加一个mp4文件 - 点击下方按钮选择“串流” - 下一步目标选择rtsp 点击“添加” - 端口默认8554 - 路径设置 /test - 用…

XML Encoding = ‘GBK‘ after STRANS,中文乱码

最近帮同事处理了一个中信银行银企直连接口的一个问题,同事反馈,使用STRANS转换XML后,encoding始终是’utf-16’,就算指定了GBK也不行。尝试了很多办法始终不行,发到银行的数据中,中文始终是乱码。 Debug使用HTML视图看报文时也可以看到中文是乱码。 解决方案: 使用cl…

飞腾银河麒麟V10安装Todesk

下载安装包 下载地址 https://www.todesk.com/linux.html 安装 yum makecache yum install libappindicator-gtk3-devel.aarch64 rpm -ivh 下载的安装包文件后台启动 service todeskd start修改配置 编辑 /opt/todesk/config/config.ini 移除自动更新临时密码 passupda…