Dockerfile 自定义镜像

大家好 , 今天我要和大家分享一个现代软件开发中不可或缺的工具 - 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.rhkb.cn/news/356019.html

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

相关文章

成都晨持绪:现在的抖音网店怎么做更快起店

在当今社交媒体的浪潮中,抖音已经成为一个不可忽视的电商平台。对于想要快速起步的抖音网店来说,掌握一些关键策略至关重要。 首要的是定位清晰。你的网店需要有一个鲜明的主题,这可以是某一特定领域的产品,如美妆、服饰或是手工艺…

银河麒麟V10安装docker和docker-compose

1. 说明 系统镜像使用的是Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso如果是在VMware中安装这个系统,需选择Ubuntu,如果选Centos会有问题。 尝试使用在线方式安装docker,报了很多错误,比较麻烦,建议使用离…

分享由AI制定一个商城网站的开发计划及推荐的开发语言

商城网站开发计划 一、项目概述 本商城网站开发计划旨在创建一个功能齐全、用户友好的在线购物平台,为顾客提供商品浏览、搜索、购物车管理、订单跟踪、在线支付等服务。商城将支持多种商品分类,包括但不限于电子产品、家居用品、服饰鞋帽等。 二、开…

数据结构【二叉树】

前言 我们在前面学习了使用数组来实现二叉树,但是数组实现二叉树仅适用于完全二叉树(非完全二叉树会有空间浪费),所以我们本章讲解的是链式二叉树,但由于学习二叉树的操作需要有一颗树,才能学习相关的基本…

【Web APIs】DOM 文档对象模型 ④ ( querySelector 函数 | querySelectorAll 函数 | NodeList 对象 )

文章目录 一、querySelector 函数1、querySelector 函数简介2、完整代码示例 二、querySelectorAll 函数1、querySelectorAll 函数简介2、完整代码示例 三、NodeList 对象1、NodeList 对象简介2、完整代码示例 本博客相关参考文档 : WebAPIs 参考文档 : https://developer.moz…

Java中将文件转换为Base64编码的字节码

在Java中,将文件转换为Base64编码的字节码通常涉及以下步骤: 读取文件内容到字节数组。使用java.util.Base64类对字节数组进行编码。 下面是一个简单的Java示例代码,演示如何实现这个过程: import java.io.File; import java.io…

【HarmonyOS NEXT】鸿蒙 如何在包含web组件的页面 让默认焦点有效

页面包含web组件Button组件等,把页面的默认焦点放到Button组件上,不起效果。 因为web组件默认会在组件加载完成后获取焦点; 可以在web的网页加载完成时onPageEnd回调中,将设置默认获焦的组件通过focusControl.requestFocus方法主…

gitlab升级16.11.3-ee

背景 这是事后一段时间补充记录的博客。 升级目的:修补漏洞CVE-2024-4835 未经认证的威胁攻击者能够利用该漏洞在跨站脚本 (XSS) 攻击中,轻松接管受害者账户。 gitlab版本为14.6.2-ee升级至16.11.3-ee 思路 翻阅文档找升级方法及升级版本路径。使用…

切割游戏介绍

简介 上大学时,在学校实验室里玩过一个貌似使用VC写的小游戏,一个小球在界面上四处游荡,玩家使用鼠标切割背景,将背景切割剩余到一定的百分比后,就胜利了,后边的背景图会全部展示出来。 使用qt的qml技术&a…

Linux_文件IO

目录 一、库函数进行文件操作 1、fopen/fclose 2、fwrite 3、追加方式-“a” 4、fread 5、三个默认文件流 二、系统函数进行文件操作 1、open/close 2、write 3、追加方式-“O_APPEND” 4、read 5、struct file结构体 6、文件描述符 6.1 struct file的引用…

Pyqt QCustomPlot 简介、安装与实用代码示例(一)

目录 简介安装实用代码示例带有填充的简单衰减正弦函数及其红色的指数包络线具有数据点的 sinc 函数、相应的误差条和 2--sigma 置信带几种散点样式的演示展示 QCustomPlot 在设计绘图方面的多功能性 结语 所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转…

数学-奇异值

有点名词党 奇异值的计算通常涉及矩阵的奇异值分解Singular Value Decomposition, SVD。奇异值分解是将一个矩形矩阵 ( A ) 分解为三个矩阵的乘积: [ A U ΣVT] 其中: - ( U ) 是一个 ( m m ) 的正交矩阵,它的列向量是 ( A AT) 的特征向…

课程标准包括哪些内容?

老师们常常会思考:课程标准究竟包含哪些要素?课程标准不仅仅是一系列冷冰冰的条条框框,而是活生生的指导原则,引领教学实践,激发学生的潜能。 课程标准,简而言之,是对学习成果的期望和要求的明确…

Starlink全系卫星详细介绍,波段频谱、激光星间链路技术、数据传输速率等等

Starlink全系卫星详细介绍,波段频谱、激光星间链路技术、数据传输速率等等。 Starlink是SpaceX公司开发的一个低轨道(LEO)卫星网络系统,旨在为全球用户提供高速宽带互联网服务。截至2024年6月,Starlink已经发射并运行…

rknn转换后精度差异很大,失真算子自纠

下面是添加了详细注释的优化代码: import cv2 import numpy as np import onnx import onnxruntime as rt from onnx import helper, shape_inferencedef get_all_node_names(model):"""获取模型中所有节点的名称。参数:model (onnx.ModelProto): O…

wordpress站群搭建3api代码生成和swagger使用

海鸥技术下午茶-wordpress站群搭建3api代码生成和swagger使用 目标:实现api编写和swagger使用 0.本次需要使用到的脚手架命令 生成 http server 代码 goctl api go -api all.api -dir ..生成swagger文档 goctl api plugin -plugin goctl-swagger"swagger -filename st…

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据-08

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据 1. Kafka Broker 工作流程1.1 Zookeeper 存储的 Kafka 信息1.2 Kafka Broker总体工作流程1.2.1 Controller介绍 1.3 Broker 重要参数 2. 节点服役与退役3. Kafka副本 1. Kafka Broker 工作流程 …

Python 数据可视化 散点图

Python 数据可视化 散点图 import matplotlib.pyplot as plt import numpy as npdef plot_scatter(ref_info_dict, test_info_dict):# 绘制散点图,ref横,test纵plt.figure(figsize(80, 48))n 0# scatter_header_list [peak_insert_size, median_insert…

深入探索C++中的AVL树

引言 在数据结构和算法的世界里,平衡二叉搜索树(Balanced Binary Search Tree, BST)是一种非常重要的数据结构。AVL树(Adelson-Velsky和Landis发明的树)就是平衡二叉搜索树的一种,它通过自平衡来维护其性质…

支付宝推出NFC(近场通信)碰一碰支付功能

近日,支付宝推出NFC(近场通信)碰一碰支付功能,支持iPhone、安卓手机。NFC支付早已不是新事物,从二维码支付重回NFC支付,支付宝能撬动市场吗? 根据网友反馈,目前支付宝正在上海静安大…