当前位置: 首页 > news >正文

SpringCloud微服务 【实用篇】| Dockerfile自定义镜像、DockerCompose

目录

一:Dockerfile自定义镜像

1. 镜像结构

2. Dockerfile语法

3. 构建Java项目

二: Docker-Compose

1. 初识DockerCompose

2. 部署微服务集群


前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,感兴趣的同学可以进行学习人工智能学习

一:Dockerfile自定义镜像

前面我们怎么拉取镜像,怎么去创建运行容器;但是都是基于DockerHub官方制作的镜像。接下来就学习一下怎么自己制作镜像!

1. 镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成!

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

基础镜像(BaseImage):一定是某个镜像依赖的系统函数库,这一层称为基础镜像。

入口(Entrypoint):等所有的安装步骤完成,就需要暴露一个端口出去,用来启动使用。

层(Layer):在基础层的基础上给应用配置环境变量,下载安装包,依赖等,每一个操作都是新的一层。

2. Dockerfile语法

什么是Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

更详细语法说明,请参考官网文档:Dockerfile reference | Docker Docs

3. 构建Java项目

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

步骤1:新建一个空文件夹docker-demo

mkdir docker-demo

步骤2:拷贝资料中的docker-demo.jar(项目)、jdk8.tar.gz(Java运行环境)、Dockerfile(构建说明书)文件到docker-demo这个目录

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
# 进入目录,解压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#-------------------以上配置基本上都是安装JDK
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

步骤3:运行命令,构建镜像

-t表示tag版本号,点“.”表示当前目录,当前Dockerfile文件所在的目录!

docker build -t javaweb:1.0 . #当前就在Dockerfile所在的目录,所以使用点

构建完成后查看镜像docker images

运行容器

docker run --name web -p 8090:8090 -d javaweb:1.0

浏览器进行访问

http://192.168.2.129:8090/hello/count

成功构建并部署成功

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

上面的过程看起来很繁琐,但是大部分的操作都是安装JDK而已;所以可以基于java:8-alpine镜像来构建Java项目项目,这个镜像默认已经安装了JDK。

Dockerfile文件

# 指定基础镜像
FROM java:8-alpine
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

再次构建

docker build -t javaweb:2.0 . 

二: DockerCompose

1. 初识DockerCompose

什么是DockerCompose

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

version: "3.8" # 版本
services: #---------------------第一种方式mysql: # 服务名称,相当于--nameimage: mysql:5.7.25 # 镜像名称environment: # 配置密码,相当于 -e ;对于端口不需要暴露,在集群内部使用,所以不需要配MYSQL_ROOT_PASSWORD: 123 volumes: # 数据卷配置,-d默认就是- "/tmp/mysql/data:/var/lib/mysql"-  "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"#---------------------第二种方式web: # 名称webbuild: . # 点表示在当前目录构建ports: # 构建完以后直接启动容器- "8090:8090"# -------------原来的方式
#---------------------第一种方式
# 容器的启动
docker run \--name mysql \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=123456 \ # 设置密码-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ # 挂载配置文件-v /tmp/mysql/data:/var/lib/mysql \ #挂载数据目录-d  mysql:5.7.25 
#---------------------第二种方式
# 构建镜像
docker build -t web:1.0
# 容器的启动‘
docker run --name web -p 8080:80 -d web:1.0

DockerCompose的详细语法参考官网:Overview | Docker Docs

安装DockerCompose

第一步:Linux下需要通过命令下载

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

 当然如果有现成的docker-compose文件直接上传到/usr/local/bin/目录也可以

第二步:修改文件的权限

# 修改权限,增加可执行权限
chmod +x /usr/local/bin/docker-compose

补充:Base自动补全命令,以后编写docker-compose命令会有提示 

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果上述出现错误,需要修改自己的hosts文件:

# 上述出现错误可能是域名识别不了raw.githubusercontent.com
echo "185.199.108.133 raw.githubusercontent.com" >> /etc/hosts

2. 部署微服务集群

将之前学习的cloud-demo微服务集群利用DockerCompose部署到服务器上

第一步:对于cloud-demo需要部署网关gateway、order-service、user-service、nacos、mysql

 第二步:在gateway、order-service、user-service编写Dockerfile

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar # 这个app.jar就是我们需要打的jar包
ENTRYPOINT java -jar /tmp/app.jar

第三步:编写docker-compose(每个服务启动)

version: "3.2" # 版本services: # 服务nacos: # ---------------第一个服务nacosimage: nacos/nacos-server # nacos的镜像environment: # 环境,相当于-m单击运行的配置MODE: standaloneports: # 端口- "8848:8848"mysql: # ---------第二个服务mysqlimage: mysql:5.7.25 # 镜像名称environment:MYSQL_ROOT_PASSWORD: 123 # 密码volumes: # 数据卷挂载- "$PWD/mysql/data:/var/lib/mysql" # $PWD得到当前的目录- "$PWD/mysql/conf:/etc/mysql/conf.d/"user-service: # ---------第三个服务user-servicebuild: ./user-serviceorder-service: # ---------第四个服务order-servicebuild: ./order-servicegateway: # ---------第五个服务gateway,网关暴露了接口build: ./gatewayports:- "10010:10010"

第四步:修改自己的cloud-demo项目(gateway,order-service,user-service),将数据库、nacos地址都命名为docker-compose中的服务名------------》localhost改为对应的服务名,使用Docker-compose部署,所有服务之间都可以用服务名进行访问

例如:以下这种情况,localhost改为服务名称nacos

第五步:使用maven打包工具,将项目中的每个微服务(gateway,order-service,user-service)都打包为app.jar

   <build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

对cloud-demo项目,利用生命周期,先clean,然后在打包package;将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中

整体目录

每一个服务的目录结构

第六步:将cloud-demo上传至虚拟机,进入cloud-demo目录

docker-compose up -d  # up参数表示创建并执行容器,-d后台运行

docker ps查看创建的容器

注:如果你的网速够快一下子就把镜像构建出来,在启动时查看docker-compose logs -f查看日志会发现有的服务启动有问题,这是因为nacos还没有完全启动的原因

# 建议重启一下除nacos的其它服务
docker-compose restart order-service gateway user-service

打开浏览器去访问http://192.168.2.129:10010/user/2?authorization=admin能正常访问,表示部署成功!

相关文章:

SpringCloud微服务 【实用篇】| Dockerfile自定义镜像、DockerCompose

目录 一&#xff1a;Dockerfile自定义镜像 1. 镜像结构 2. Dockerfile语法 3. 构建Java项目 二&#xff1a; Docker-Compose 1. 初识DockerCompose 2. 部署微服务集群 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…...

Vue3+TS+ElementPlus的安装和使用教程【详细讲解】

前言 本文简单的介绍一下vue3框架的搭建和有关vue3技术栈的使用。通过本文学习我们可以自己独立搭建一个简单项目和vue3的实战。 随着前端的日月更新&#xff0c;技术的不断迭代提高&#xff0c;如今新vue项目首选用vue3 typescript vite pinia……模式。以前我们通常使用…...

浅析锂电池保护板(BMS)系统设计思路(四)SOC算法-扩展Kalman滤波算法

BMS开发板 1 SOC估算方法介绍 电池SOC的估算是电池管理系统的核心&#xff0c;自从动力电池出现以来&#xff0c;各种各样的电池SOC估算方法不断出现。随着电池管理系统的逐渐升级&#xff0c;电池SOC估算方法的效率与精度不断提高&#xff0c;下面将介绍常用几种电池SOC估算方…...

构建异步高并发服务器:Netty与Spring Boot的完美结合

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…...

uniapp实现文字超出宽度自动滚动(在宽度范围之内不滚动、是否自动滚动、点击滚动暂停)

效果如下: 文字滚动 组件代码: <template><view class="tip" id="tip" @tap.stop="clickMove"><view class=...

win11 电脑睡眠功能失效了如何修复 win11 禁止鼠标唤醒

1、win11睡眠不管用怎么办&#xff0c;win11电脑睡眠功能失效了如何修复 在win11系统中拥有许多令人激动的新功能和改进&#xff0c;有些用户在使用win11电脑时可能会遇到一个问题&#xff1a;睡眠模式不起作用。当他们尝试将计算机置于睡眠状态时&#xff0c;却发现系统无法进…...

内坐标转换计算

前言 化学这边的库太多了。 cs这边的库太少了。 去看化学的库太累了。 写一个简单的实现思路&#xff0c;让cs的人能看懂。 向量夹角的范围 [0, pi) 这是合理的。 因为两个向量只能构成一个平面系统&#xff0c;平面系统内的夹角不能超过pi。 二面角的范围 涉及二面角&…...

vue中 components自动注册,不需要一个个引入注册方法

1.在compontents文件夹新建js文件 componentRegister 不能引用文件夹里的组件** import Vue from "vue"; function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() string.slice(1); } const requireComponent require.context( ".…...

web自动化测试从入门到持续集成

在很多刚学习自动化的可能会认为我只需要会运用selenium&#xff0c;我只需要在一个编辑器中实用selenium java编写了一些脚本那么就会自动化了&#xff0c;是真的吗&#xff1f;答案肯定是假的。自动化肯定是需要做到真的完全自动化&#xff0c;那如何实现呢&#xff1f;接着往…...

python小工具之弱密码检测工具

一、引用的python模块 Crypto&#xff1a; Python中一个强大的加密模块&#xff0c;提供了许多常见的加密算法和工具。它建立在pyc.ypodome或pyc.ypto等底层加密库之上&#xff0c;为Python程序员提供了简单易用的API&#xff0c;使其可以轻松地实现各种加密功能。 commands…...

链接器--动态链接器--延迟绑定与动态链接器是什么?学习笔记二

内容在下面链接&#xff08;通过新建标签页打开&#xff09;&#xff1a; 链接器--动态链接器--延迟绑定与动态链接器是什么&#xff1f;学习笔记二一个例子来看延迟加载https://mp.weixin.qq.com/s?__bizMzkyNzYzMjMzNA&mid2247483713&idx1&snee90a5a7d59872287…...

JMeter CSV 参数文件的使用方法

.在 JMeter 测试中&#xff0c;参数化是非常重要的&#xff0c;参数化允许我们模拟真实世界中的各种情况。本文我们将探讨如何在 JMeter 中使用 CSV 参数文件。 创建 CSV 文件 首先&#xff0c;我们需要创建一个逗号分隔的值&#xff08;CSV&#xff09;文件&#xff0c;其中…...

how2heap-2.23-06-unsorted_bin_into_stack

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h>// 从 unsorted bin 的 bk 去找合适的 void jackpot(){ fprintf(stderr, "Nice jump d00d\n"); exit(0); }int main() {intptr_t stack_buffer[4] {0};fpr…...

(学习打卡2)重学Java设计模式之六大设计原则

前言&#xff1a;听说有本很牛的关于Java设计模式的书——重学Java设计模式&#xff0c;然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧&#xff0c;本文主要记录笔者的学习笔记和心得。 打卡&#xff01;打卡&#xff01; 六大设计原则 &#xff08;引读&#xff1a;这里…...

数据结构:第7章:查找(复习)

目录 顺序查找&#xff1a; 折半查找&#xff1a; 二叉排序树&#xff1a; 4. (程序题) 平衡二叉树&#xff1a; 顺序查找&#xff1a; ASL 折半查找&#xff1a; 这里 j 表示 二叉查找树的第 j 层 二叉排序树&#xff1a; 二叉排序树&#xff08;Binary Search Tree&…...

编程语言的未来?

编程语言的未来&#xff1f; 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; 在技…...

SpringBoot的测试

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…...

C++睡眠函数:Windows平台下的Sleep函数和Linux平台的usleep函数

C/C睡眠函数&#xff1a;Windows平台下的Sleep函数和Linux平台的usleep函数 WinAPI Sleep Sleep函数属于Windows API&#xff0c;使用它需要先包含synchapi.h。 void Sleep(DWORD dwMilliseconds);函数仅有一个参数&#xff08;睡眠时长&#xff09;&#xff0c;单位是毫秒。…...

详解白帽子以及红队、蓝队和紫队

企业继续数字化&#xff0c;其关键基础设施和运营扩大了攻击面&#xff0c;暴露于各种威胁途径的面前。为了解决这个问题&#xff0c;企业领导者认识到拥有内部专家的重要性。考虑到网络威胁领域不断发展的态势&#xff0c;企业领导者可以利用道德黑客以及红队、蓝队和紫队的工…...

1、docker常用技巧:docker数据位置更改

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…...

Uvicorn与Couchbase Analytics Service集成:构建高性能数据分析API的终极指南

Uvicorn与Couchbase Analytics Service集成&#xff1a;构建高性能数据分析API的终极指南 【免费下载链接】uvicorn An ASGI web server, for Python. &#x1f984; 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn 在现代数据驱动的应用开发中&#xff0c;…...

手把手教你用丹青识画:智能影像雅鉴系统保姆级入门教程

手把手教你用丹青识画&#xff1a;智能影像雅鉴系统保姆级入门教程 1. 认识丹青识画系统 "以科技之眼&#xff0c;点画意之睛。"这句话完美诠释了丹青识画系统的核心理念。这是一款将人工智能技术与东方美学相结合的创新工具&#xff0c;能够自动分析图像内容并生成…...

开源编解码工具技术选型与实战指南:跨场景应用的H.264解决方案

开源编解码工具技术选型与实战指南&#xff1a;跨场景应用的H.264解决方案 【免费下载链接】openh264 Open Source H.264 Codec 项目地址: https://gitcode.com/gh_mirrors/op/openh264 一、价值定位&#xff1a;为什么开源编解码工具是技术选型的最优解 在视频技术快…...

如何选择适合的单北斗变形监测一体机以提升基础设施安全?

本文将重点讨论如何选择适合的单北斗变形监测一体机&#xff0c;以增强基础设施的安全性。在当前基础设施建设快速发展的背景下&#xff0c;单北斗GNSS的应用显得尤为重要。通过深入理解单北斗变形监测的原理&#xff0c;用户能够更好地把握设备的核心优势&#xff0c;尤其是在…...

小米智能家居集成终极指南:5分钟快速接入HomeAssistant

小米智能家居集成终极指南&#xff1a;5分钟快速接入HomeAssistant 【免费下载链接】hass-xiaomi-miot Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices. 小米米家智能家居设备接入Hass集成 项目地址: https://…...

编译原理避坑指南:自顶向下语法分析的5个常见错误及解决方法

编译原理避坑指南&#xff1a;自顶向下语法分析的5个常见错误及解决方法 第一次接触自顶向下语法分析时&#xff0c;我盯着那个无限循环的递归文法整整三天没想明白——为什么明明按照教材步骤操作&#xff0c;程序却始终报错&#xff1f;直到助教指出我忽略了间接左递归的隐蔽…...

保姆级教程:用串口和Telnet连接Hi3559/Hi3516开发板,5分钟搞定环境搭建

5分钟极速上手&#xff1a;Hi3559/Hi3516开发板串口与Telnet连接实战指南 刚拿到海思开发板时&#xff0c;许多开发者会被一堆陌生的接口和术语吓退。其实只要掌握几个关键步骤&#xff0c;从拆箱到建立稳定连接只需一根串口线和五分钟时间。本文将用最直白的语言&#xff0c;带…...

UReport2实战:如何优雅地导出多Sheet页报表(动态/静态分页全解析)

UReport2实战&#xff1a;如何优雅地导出多Sheet页报表&#xff08;动态/静态分页全解析&#xff09; 在数据驱动的商业环境中&#xff0c;报表导出功能已成为企业级应用的标配需求。当面对海量数据时&#xff0c;传统的单Sheet页Excel导出方案往往导致文件臃肿、查阅困难。URe…...

【独家首发】Python扩展安全成熟度模型(PESMM v1.2):覆盖编译期/加载期/运行期的9维评分体系,仅限前500名开发者免费获取评估工具包

第一章&#xff1a;Python扩展模块安全概述Python 扩展模块&#xff08;如 C/C 编写的 .so/.dll 文件或 Cython 生成的二进制模块&#xff09;在提升性能的同时&#xff0c;也引入了原生层特有的安全风险。与纯 Python 代码不同&#xff0c;扩展模块直接操作内存、调用系统 API…...

从CMSIS-DAP到JTAG:一篇讲透Keil5/Keil4下ARM芯片的下载与调试设置差异

从CMSIS-DAP到JTAG&#xff1a;深度解析Keil环境下ARM芯片调试接口的实战差异 当你在Keil环境中从STM32F103切换到STM32F407时&#xff0c;是否遇到过下载算法突然失效的情况&#xff1f;或是更换了J-Link仿真器后&#xff0c;原本流畅的调试过程变得寸步难行&#xff1f;这些问…...