【SpringCloud学习笔记】Docker(中篇)

Docker

1. 自定义镜像

前面我们都是使用docker pull拉取仓库中现成的镜像,但是如果我们想要将一个Java应用程序构建成镜像然后部署应该怎么做呢?这个时候我们就需要自定义镜像了
**镜像:**本质上就是一堆文件的集合,包含了应用程序本身以及它运行时所需要的系统函数库、环境、配置、应用程序。
**自定义镜像步骤:**1、准备Linux运行环境 => 2、安装Java运行环境 => 3、拷贝jar包 => 4、配置启动脚本
但是需要注意的是:镜像文件不是无序随意摆放的,构建文件之间存在依赖关系,因此需要有结构的组织在一起,镜像可以看做是由多个Layer(层)构成的,最底层的就是BaseImage(基础镜像)通常是模拟Linux环境的镜像,最上层的就是Entrypoint(入口),通常是应用程序启动脚本。

而构建镜像我们只需要借助Dockerfile文件即可,该文件就是用来描述构建镜像的结构与步骤的,我们只需要了解如何编写Dockerfile,然后使用命令:docker build就可以构建镜像了。
Dockerfile语法:
只有了解Dockerfile的语法我们才可以编写出Dockerfile文件:

指令说明示例
FROM指定基础镜像FROM centos:6
ENV设置环境变量ENV key value
COPY拷贝本地文件到镜像目录中COPY ./xx.jar /tmp/app.jar
RUN执行Linux shell脚本RUN yum install -y gcc
EXPOSE指定运行时监听端口EXPOSE 8080
EXTRYPOINT应用启动脚本ENTRYPOINT java -jar xx.jar

例如:要基于Ubuntu镜像构建一个Java应用,Dockerfile如下所示:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装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 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

但是还是太麻烦了,毕竟我们每次部署Java应用都需要准备好Linux环境以及JDK运行环境,因此大佬也准备好了JDK的基础镜像,因此上述Dockerfile可以简化为如下Dockerfile:

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

接下来我们准备好程序jar包就可以来构建java镜像了:image.png
执行命令:docker build -t myimage .

  • -t:指定构建的镜像名称(不能包含大写字母)
  • . 表示Dockerfile所在目录

image.png
此时镜像已经创建完毕,我们尝试创建并运行该容器:

docker run -d \
--name hm \
-p 8080:8080 \
myimage

2. 网络

我们已经创建完了一个Java项目的容器,而Java项目通常需要访问其他中间件比如MySQL、Redis、ES等等,我们的容器能否互连呢?
使用命令:docker inspect hm / nginx发现两个容器的IP地址分别为:172.17.0.2以及172.17.0.3说明在同一网段中,接下来使用命令:docker exec -it hm bash进入容器,尝试ping nginx所在IP
image.png
但是此处容器的IP并不是固定的,比如我先启动nginx,然后再启动hm,此时IP地址就会发生变化,但是我们Java项目配置中间件连接地址必须是固定的,因此Docker提供了** 网络**,常见命令有:

命令说明
docker network create创建一个网络
docker network ls查看所有网络
docker network rm删除某个网络
docker network connect使指定容器加入网络
docker network disconnect使指定容器离开网络
docker network inspect查看网络具体信息

最重要的是,如果我们在自定义网络(默认网络不行)中,可以让处于同一个网络的多个容器通过容器名称进行访问!!!

下面我们就来尝试重新创建并运行容器并指定网络:

[root@VM-16-5-opencloudos heima-demo]# docker network create hmall
2702b65a783ca46b6a77f197d7ccfe8ab22914d97fa5d8f7acd5cce0818e8971
[root@VM-16-5-opencloudos heima-demo]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
05b67283cbd7   bridge    bridge    local
2b819e8b339d   hm-net    bridge    local
2702b65a783c   hmall     bridge    local
6184100a188f   host      host      local
03009a872cf1   none      null      local
[root@VM-16-5-opencloudos heima-demo]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@VM-16-5-opencloudos heima-demo]# docker run -d --name hm -p 8080:8080 --network hmall myimage
a6b1de8b0ff6a269cd0472f9202af0381609e672d3dbc8b3bb443098a3d2305e
[root@VM-16-5-opencloudos heima-demo]# docker run -d --name nginx -p 80:80 --network hmall nginx
df88a660872488114dbadb5f8fce176038e66359727096c59aeb70bbfcef250f
[root@VM-16-5-opencloudos heima-demo]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
df88a6608724   nginx     "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds    0.0.0.0:80->80/tcp, :::80->80/tcp           nginx
a6b1de8b0ff6   myimage   "java -jar /app.jar"     28 seconds ago   Up 27 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   hm[root@VM-16-5-opencloudos ~]# docker exec -it hm bash
root@a6b1de8b0ff6:/# ping nginx
PING nginx (172.19.0.3) 56(84) bytes of data.
64 bytes from nginx.hmall (172.19.0.3): icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from nginx.hmall (172.19.0.3): icmp_seq=2 ttl=64 time=0.065 ms

此时我们已经实现了基于容器名称实现互连

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

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

相关文章

深入探讨5种单例模式

文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览 以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。 …

淘宝扭蛋机小程序,扭蛋市场创新模式

扭蛋机作为潮玩市场的娱乐消费方式,成为了当下消费者的新宠。扭蛋机凭借自身性价比高、商品多样、惊喜性等特点,吸引了各个年龄层的消费者,不仅年轻人喜欢,不少小学生和老年人也非常喜欢,扭蛋机市场迎来了快速发展期。…

MySQL: 表的增删改查(基础)

文章目录 1. 注释2. 新增(Create)3. 查询(Retrieve)3.1 全列查询3.2 指定列查询3.3 查询字段为表达式3.4 别名3.5 去重: distinct3.6 排序: order by3.7条件查询3.8 分页查询 4. 修改 (update)5. 删除(delete)6. 内容重点总结 1. 注释 注释:在SQL中可以使用“–空格…

Spring Boot 集成 zxing 生成条形码与二维码

前面我们知道了怎么通过 使用 zxing 生成二维码以及条形码, 由于我们现在都是 web 端的项目了,那么我们看下怎么使用 Spring Boot 集成然后返回给前端展示: 工程源码 对应的工程源码我放到了这里:github源码路径,点击…

大模型Prompt-Tuning技术进阶

LLM的Prompt-Tuning主流方法 面向超大规模模型的Prompt-Tuning 近两年来,随之Prompt-Tuning技术的发展,有诸多工作发现,对于超过10亿参数量的模型来说,Prompt-Tuning所带来的增益远远高于标准的Fine-tuning,小样本甚至…

基于STM32的各种数学函数优化计算方法(代码开源)

前言:本文为手把手教学 STM32 的数学计算公式优化方法的教程,本教程的 MCU 使用 STM32F103ZET6 。本篇博客将使用非传统数学库计算手段进行各种数学函数的计算,优化的数学计算包括:sin()、cos()、arctan()、arcsin() 与 1/sqrt()。…

Python魔法之旅专栏(导航)

目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先,感谢老铁们一直以来对我的支持与厚爱,让我能坚持把Python魔法方法专栏更新完毕! 其次,为了方便大家查阅,我将此专栏…

NetSuite精益实施 之 系统切换作业标准化

这个题目为近日所思,一直没有落笔。今天是端午假日,得空卸货。 标准化是精益实施的三个基础之一,在我们的项目实践中没有须臾忘记。在此我们不再赘述标准化为啥这么重要,更多来分享如何标准化。 在项目实施的各阶段中&#xff0…

冯喜运:6.10周一黄金原油行情趋势分析及独家操作建议

【黄金消息面分析】:上周全球金融市场惊现戏剧性大逆转,美国多项经济数据证实劳动力市场降温,9月降息重返视野令全球风险情绪几乎陷入狂热状态,全球股市接连创新高,但上周五意外“爆表”的非农令市场惊现大逆转&#x…

【LeetCode】39.组合总和

组合总和 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个…

c#未能加载基类System错误 这台计算机上缺少此项目引用的 NuGet 程序包

拷贝代码到另一台计算机运行,打开Form1.cs报错 首先确认package的框架 如果是472,则更换472的框架 打开项目->xx属性,进行修改 如果框架正确,就是未识别到程序包 可以参考: https://www.cnblogs.com/txwtech/p/1…

深入ES6:解锁 JavaScript 类与继承的高级玩法

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! ES5、ES6介绍 文章目录 💯Class🍟1 类的由来🍟2 co…

一、Socket创建和连接

C网络编程(asio) 文章目录 C网络编程(asio)1、Asio概述2、网络编程基本流程2、创建socket3、创建监听socket4、绑定accpet监听套接字5、连接指定的端点6、服务器接收连接 点击查看代码 1、Asio概述 ​ Asio起源于Boost库&#xf…

Kafka 架构

1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务,用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈,…

【Vue】获取模块内的actions方法

目标: 掌握模块中 action 的调用语法 (同理 - 直接类比 mutation 即可) 注意: 默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块。 调用语法: 直接通过 store 调用 $store.di…

【Linux多线程】线程的终止、等待和分离

文章目录 线程终止正常退出return 退出pthread_exit函数终止线程 pthread_cancel强制终止线程进程终止 线程等待为什么需要等待线程?pthread_join函数 分离线程pthread_detach函数 线程终止 下面给出终止线程的三种方式: 正常退出: 线程执行…

【深度学习】PuLID: Pure and Lightning ID Customization via Contrastive Alignment

论文:https://arxiv.org/abs/2404.16022 代码:https://github.com/ToTheBeginning/PuLID 文章目录 AbstractIntroductionRelated WorkMethods Abstract 我们提出了一种新颖的、无需调整的文本生成图像ID定制方法——Pure and Lightning ID customizatio…

机器学习笔记 - LoRA:大型语言模型的低秩适应

一、简述 1、模型微调 随着大型语言模型 (LLM) 的规模增加到数千亿,对这些模型进行微调成为一项挑战。传统上,要微调模型,我们需要更新所有模型参数。这也称为完全微调 (FFT) 。下图详细概述了此方法的工作原理。 完全微调FFT 的计算成本和资源需求很大,因为更新每…

Vue TypeScript 实战:掌握静态类型编程

title: Vue TypeScript 实战:掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境下为Vue.js应用搭建项目结构,包括初始化配置、创建Vue组件、实现状态管理利用Vuex、配置路由以及性能优化的方法&#x…

拐点已至:企业如何借助AI重塑增长?

2024年的激进增长与AI数智化创新并行,传统策略的功效已经减弱。在这篇文章中,我们将展望并深度探索2024年的6大创新增长策略,包括AI驱动的实验,产品再造,超个性化,自动化运营,短视频和KOL营销等…