初识Docker:(5)Docker自定义镜像

news2024/12/24 10:15:22

初识Docker:(5)Docker自定义镜像

  • 镜像结构
  • Dockerfile语法
      • 什么是Dockerfile
  • 构建Java项目
      • 案例1:基于ubuntu镜像构建一个新镜像,运行一个java项目
      • 案例2:基于java:8-alpine镜像,将一个java项目构建为镜像
  • 总结

镜像结构

  • 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成
    在这里插入图片描述

镜像是分层结构,每一层称为一个Layer

  • BaseImage层:包含基本的系统函数库、环境变量、文件系统
  • Entrypoint:入口,是镜像中应用启动的命令
  • 其他:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

Dockerfile语法

什么是Dockerfile

在这里插入图片描述

构建Java项目

案例1:基于ubuntu镜像构建一个新镜像,运行一个java项目

在这里插入图片描述

编写Dockerfile:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
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

构建java项目镜像:

# 步骤一:构建javaweb镜像
$ docker build -t javaweb:1.0 .

Sending build context to Docker daemon  211.1MB
Step 1/9 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
58690f9b18fc: Pull complete
b51569e7c507: Pull complete
da8ef40b9eca: Pull complete
fb15d46c38dc: Pull complete
Digest: sha256:1f1a2d56de1d604801a9671f301190704c25d604a416f59e03c04f5c6ffee0d6
Status: Downloaded newer image for ubuntu:16.04
 ---> b6f507652425
Step 2/9 : ENV JAVA_DIR=/usr/local
 ---> Running in 56b1aa0c0caa
Removing intermediate container 56b1aa0c0caa
 ---> 7aa1180d13dd
Step 3/9 : COPY ./jdk8.tar.gz $JAVA_DIR/
 ---> 56a3e08c07ab
Step 4/9 : COPY ./docker-demo.jar /tmp/app.jar
 ---> 22005446b7a4
Step 5/9 : RUN cd $JAVA_DIR  && tar -xf ./jdk8.tar.gz  && mv ./jdk1.8.0_144 ./java8
 ---> Running in 9416f8f3ad24
Removing intermediate container 9416f8f3ad24
 ---> 9fd66f7be0e0
Step 6/9 : ENV JAVA_HOME=$JAVA_DIR/java8
 ---> Running in c91fcc94f02e
Removing intermediate container c91fcc94f02e
 ---> cd925bdf19b8
Step 7/9 : ENV PATH=$PATH:$JAVA_HOME/bin
 ---> Running in fee99c64381b
Removing intermediate container fee99c64381b
 ---> b82e606ede47
Step 8/9 : EXPOSE 8090
 ---> Running in 6a7c4c4041c0
Removing intermediate container 6a7c4c4041c0
 ---> 22dd1186d176
Step 9/9 : ENTRYPOINT java -jar /tmp/app.jar
 ---> Running in bb6b25baa1e3
Removing intermediate container bb6b25baa1e3
 ---> f02cf425f5c5
Successfully built f02cf425f5c5
Successfully tagged javaweb:1.0

# 步骤二:查看javaweb镜像
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
javaweb      1.0       f02cf425f5c5   59 seconds ago   722MB

# 步骤三:启动java项目容器
$ docker run --name web -p 8090:8090 -d javaweb:1.0
32c1b2a4b58f52f7fdbbbe85635f140abfc38d44bc00f19572c96d07d9f3f038

# 步骤四:查看java容器状态
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
32c1b2a4b58f   javaweb:1.0    "/bin/sh -c 'java -j…"   3 seconds ago   Up 2 seconds   0.0.0.0:8090->8090/tcp, :::8090->8090/tcp              web

# 步骤五:访问java项目路径
$ curl 127.0.0.1:8090/hello/count
今天被访问了1次

案例2:基于java:8-alpine镜像,将一个java项目构建为镜像

在这里插入图片描述
实践:

(1)简化编写dockerfile

# 指定基础镜像
FROM openjdk:8u92-jdk-alpin

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

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

(2)编译镜像

# 步骤一:构建javaweb镜像
$ docker build -t javaweb:2.0 .
Sending build context to Docker daemon  211.1MB
Step 1/4 : FROM openjdk:8u92-jdk-alpine
 ---> f23144173f4f
Step 2/4 : COPY ./docker-demo.jar /tmp/app.jar
 ---> 26bd15928365
Step 3/4 : EXPOSE 8090
 ---> Running in 0d96cd08728d
Removing intermediate container 0d96cd08728d
 ---> d15bfdb1312d
Step 4/4 : ENTRYPOINT java -jar /tmp/app.jar
 ---> Running in c7edf773e60f
Removing intermediate container c7edf773e60f
 ---> 6565afa9c4f9
Successfully built 6565afa9c4f9
Successfully tagged javaweb:2.0

# 步骤二:启动java项目container
$ docker run --name web -p 8090:8090 -d javaweb:2.0
98c9d9dc90fa59fc73486d2a8264b6db4a015ce1f1de8f1515af469655753fb9

# 步骤三:查看镜像状态
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
98c9d9dc90fa   javaweb:2.0    "/bin/sh -c 'java -j…"   3 seconds ago   Up 2 seconds   0.0.0.0:8090->8090/tcp, :::8090->8090/tcp              web

# 步骤四:访问镜像服务
$ curl 127.0.0.1:8090/hello/count
今天被访问了1次

总结

  1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一行必须是From,从一个基础镜像来构建
  3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,如:java:8-alpine

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

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

相关文章

Java+JSP机房课表管理系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用技术CSSJavaScriptMySQLServlet、MySQL数据库、项目含有源码、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍: 系统管理:包含用户的注册,管理,信息修改 课程管理:包含课程录入、维…

IT大侦“碳”:VxRail的可持续法宝

环境Environmental      社会责任Social Responsibility      企业治理Corporate Governance      随着碳达峰、碳中和的逐步推进,越来越多的“大厂”或各行业的明星企业都开始重视自己的ESG报告,已然成为了商界新风尚。      可持续发展战略也与前沿技术密切相…

matlab神经网络求解最优化,matlab神经网络训练数据

1、神经网络的准确率是怎么计算的? 其实神经网络的准确率的标准是自己定义的。 我把你的例子赋予某种意义讲解: 1,期望输出[1 0 0 1],每个元素代表一个属性是否存在。像着4个元素分别表示:是否肺炎,是否肝…

哈希知识点

目录对比map/set1. unordered系列关联式容器1.1 unordered_map2. 底层结构2.1 哈希概念2.2 哈希冲突2.3 哈希函数2.4 哈希冲突解决2.4.1 闭散列线性探测和二次探测扩容(负载因子)闭散列实现的hash2.4.2 开散列概念开散列思考实现模拟实现模板参数列表的改…

Java项目:springboot农业物资管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 农业物资管理系统,管理员可以对角色进行配置,分配用户角色; 主要功能包含:登录、注册、修改密码…

并查集解决重复员工问题

简介 工作一年多了,天天CRUD,终于以前学习的算法排上用场了。 背景 我们的系统在用户注册时没有校验身份id(身份证)和电话号码的唯一,可能使用相同的身份id或者电话号码创建多个账号,导致有些人开多个账…

面试者推荐 |【Redis面试专题】「常见问答系列」透析Redis常见技术相关的问题1~10题(进阶)

📚 前提回顾 首先如果没有阅读【面试者推荐 |【Redis面试专题】「常见问答系列」透析Redis常见技术相关的问题1~10题(基础) 】,简易先去看看基础10题,因为循序渐进才是正道,哈哈。 📚 1. Redis…

WebRTC源码之RTCPReceiver源码分析

WebRTC源码之RTCPReceiver源码分析 WebRTC源码之RTCPReceiver源码分析WebRTC源码之RTCPReceiver源码分析前言一、 RTCP接受数据的流程的堆栈信息的1、网络io 线程读取数据2、 线程切换的代码3、 线程切换 gcc二、 RTCPReceiver::IncomingPacket方法读取RTCP数据的格式1、 Parse…

【PyTorch深度学习项目实战100例】—— 基于DPCNN实现电商情感分析任务 | 第79例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

随机种子 3407 is all you need

文 | 天于刀刀你最常用的随机种子是哪个?在刀刀的团队里,关于随机种子的设置主要分化为两派~玄学派,可能设置为自己的纪念日,又或者是星座预测中的本月幸运数字;以及,自然派,随机种子是啥其实无…

Java项目:springboot健身房管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统; 主要功能如下: 管理员登录模块 会员管理模块 教练管理模块 课程管理模块 器材管理模块 物品遗失…

一些常见的移动端适配方案,你了解吗?

前言 移动端设备的尺寸很多,而 UI 设计稿一般只会基于一个尺寸(一般是 375px 或 750px )进行设计。 目前移动端适配方案有多种,本文将介绍一些具有代表性的适配方案。 媒体查询 media CSS3 中的媒体查询属性 media 分别为不同…

量子计算(十七):量子计算机硬件

文章目录 量子计算机硬件 一、量子芯片支持系统 二、量子计算机控制系统 量子计算机硬件 量子计算机的核心——量子芯片,具有多种不同的呈现形式。绝大多数量子芯片,名副其实地,是一块芯片,由集成在基片表面的电路结构构建出包…

关于 Camera 开始 Tuning 时的一些注意事项

1、问题背景: 最近有调试一个体感游戏机上带 Camera 的项目,原定搭配 ov13855 这颗 sensor, 但由于各种各样的问题,导致做了很多无用功,且各种延期。 本文主要总结下此次项目遇到的问题,及产品开始 tuning 时的一些注意…

【折腾服务器 4】ESXi 中 Ubuntu 安装 NPS 客户端 ( NPC )

Catch Up 书接上回,上一章中,群晖已经能定期给 Windows 物理机服务器做备份了,但是依然无法从外网访问服务器上的内容,本篇讲述如何在 Ubuntu 中安装 NPS 客户端,也就是所谓的 NPC ( Client )。 Chapter 1 准备一个 …

C#语言实例源码系列-实现FTP下载文件

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

SpringSecurity(十)【CSRF 漏洞保护】

十、CSRF 漏洞保护 简介 CSRF(Cross-Site Request Forgery 跨站请求伪造),也可称为一键式攻击(one-click-attack)通常缩写为 CSRF 或者 XSRF。CSRF 攻击是一种挟持用户在当前已登录的浏览器上,发送恶意请求…

Python绘制地磁场

文章目录简介磁场绘制简介 为国际参考磁场对Python的封装,可通过经纬高度以及时间来计算地磁场强度,使用方法简单粗暴,如下 import pyIGRF pyIGRF.igrf_value(lat, lon, alt, date)参数含义为 lat 纬度lon 经度alt 海拔date 日期&#xff…

vuejs中组件的两种不同的编写风格-选项式API及组合式API

前言随着vue3的逐渐稳定,以及周边生态的完善,现在vue3已经成为默认的使用方式了的所以,对于一个前端开发者,Vue2与Vue3都得要会,在vue3中新增很多东西,比如:Fragment,Teleport,Suspense,也去掉了vue2中一些特性,比如:移除keyCode支持作为v-on的修饰符等在编程风格上也有一些区别…

Java项目:springBoot+Vue汽车销售管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目基于spring boot以及Vue开发,为前后端分离的项目。针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等…