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: # 服务名称,相当于--name
    image: 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: # 名称web
    build: . # 点表示在当前目录构建
    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: # ---------------第一个服务nacos
    image: nacos/nacos-server # nacos的镜像
    environment: # 环境,相当于-m单击运行的配置
      MODE: standalone
    ports: # 端口
      - "8848:8848"
  mysql: # ---------第二个服务mysql
    image: 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-service
    build: ./user-service
  order-service: # ---------第四个服务order-service
    build: ./order-service
  gateway: # ---------第五个服务gateway,网关暴露了接口
    build: ./gateway
    ports:
      - "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能正常访问,表示部署成功!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RedisInsight - Redis官方可视化工具

一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#…

UE5 给自己的数字人重定向Mixamo动画

1 、准备动画骨格文件&#xff0c;动画文件&#xff0c;下面是Mixamo动画素材下载网站Mixamo动画骨格文件下载网站https://www.mixamo.com/2、下载动画骨格文件&#xff0c;打Mixamo网站&#xff0c;选择Characters骨格菜单&#xff0c;在下面找到对应的骨格。如下图所示&#…

在Ubuntu22.04上离线部署Tailchat(一)

一&#xff1a;Tailchat介绍 Tailchat 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能性。前端微内核架构 后端微服务架构 使得 Tailchat 能够驾驭任何定制化/私有化的场景&#xff0c;是面向企业与私域用户打造&#xff0c;高度自由的群组管理与定制化…

csdn中的资源文件如何删除?

csdn中的资源文件如何删除&#xff1f; 然后写文章的时候 点击资源绑定&#xff0c;解锁资源&#xff0c;就可以再次上传。

玫瑰之国保加利亚与葡萄酒的碰撞

玫瑰之国保加利亚与葡萄酒的碰撞 一、玫瑰与葡萄美酒 提起保加利亚&#xff0c;大家第一个想到的可能就是玫瑰花&#xff0c;没错&#xff0c;保加利亚就是被誉为“上帝后花园”的玫瑰之国&#xff0c;每年从这里出产的玫瑰与玫瑰精油&#xff0c;可以说受到了全球消费者的喜爱…

idea将本地编译好的代码上传到hub镜像仓库

第一步&#xff1a;编译打包本地的文件 package 第二步&#xff1a;执行docker bulid打包命令 docker build -t sunyuhua/algo-ability:1.0.0 .sunyuhuasunyuhua-HKF-WXX:~/workspace/shbgit/algo-ability$ docker build -t sunyuhua/algo-ability:1.0.0 . [] Building 141.…

I.MX6ULL开发笔记(三)——挂载NFS网络文件系统

0x01 网络文件系统 当我们在编译一个文件时&#xff0c;正常是在一个pc上编译好一个文件&#xff0c;之后丢到开发板上去运行。如果有了NFS网络文件系统&#xff0c;那么我们就可以在PC以及开发板上共享文件了。 网络文件系统&#xff0c;常被称为NFS&#xff08;Network Fil…

操作系统期末复习知识点

目录 一.概论 1.操作系统的介绍 2.特性 3.主要功能 4.作用 二.进程的描述与控制 1.进程的定义 2.特性 3.进程的创建步骤 4.基本状态转化 5.PCB的作用 6.进程与线程的比较 三.进程同步 1.同步的概念&#xff08;挺重要的&#xff09; 2.临界区 3.管程和进程的区…

python中抓取小米应用商城xpath实例

页面源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>手机游戏应用商店_软件商店app下载-小米应用商店</title> <…

网络通信(10)-C#TCP客户端实例

本文使用Socket在C#语言环境下完成TCP客户端的实例。 实例完成的功能: 客户端与服务器连接,实现实时刷新状态。 客户端接收服务器的数据。 客户端发送给服务器的数据。 客户端实时判定状态,断开连接后自动重连。 客户端与服务器端发送心跳包。 在VS中创建C# Winform项…

web期末个人引导页透明版

效果图 代码 css代码 * {box-sizing: border-box; }body {color: #2b2c48;font-family: "Jost", sans-serif;background-image: url(../img/bg.jpg);background-repeat: no-repeat;background-size: cover;background-position: center;background-attachment: fix…

计算机环境安全

操作系统安全----比如windows,linux 安全标识--实体唯一性 windows---主体&#xff1a;账户&#xff0c;计算机&#xff0c;服务 安全标识符SID-Security Identifier 普通用户SID是1000&#xff0c;管理用SID是500 linux---主体&#xff1a;用户&#xff0c;用户组&#xf…

Linux基础——进程地址空间

1. 地址空间的验证 之前我们在学习语言时&#xff0c;曾知道有下面这张图 对于这个图我们可以用下面的代码验证 运行后我们可以发现 其对应关系如下 我们使用fork函数&#xff0c;来分别对父子进程中的g_val进行修改&#xff0c;即 运行后我们可以发现 在子进程修改了g_val后…

凸优化 3:最优化方法

凸优化 3&#xff1a;最优化方法 最优化方法适用场景对比费马引理一阶优化算法梯度下降最速下降 二阶优化算法牛顿法Hessian矩阵Hessian矩阵的逆Hessian矩阵和梯度的区别牛顿法和梯度下降法的区别 拟牛顿法DFP、BFGS/L-BFGS 数值优化算法坐标下降法SMO算法 基于导数的函数优化解…

计算机视觉技术-区域卷积神经网络(R-CNN)

区域卷积神经网络&#xff08;region-based CNN或regions with CNN features&#xff0c;R-CNN&#xff09; (Girshick et al., 2014)也是将深度模型应用于目标检测的开创性工作之一。 本节将介绍R-CNN及其一系列改进方法&#xff1a;快速的R-CNN&#xff08;Fast R-CNN&#x…

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证&#xff0c;为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…

软件测试|docker ps命令 管理和监视容器的利器

简介 Docker是一种流行的容器化平台&#xff0c;用于构建、分发和运行应用程序。Docker提供了许多命令行工具&#xff0c;其中之一是docker ps命令。本文将深入介绍docker ps命令&#xff0c;解释其用途、参数和功能&#xff0c;以及如何使用该命令来管理和监视运行中的Docker…

netcore html to pdf

一、新建项目&#xff1a;QuestPDFDemo <PackageReference Include"NReco.PdfGenerator" Version"1.2.1" /> 二、上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging;using QuestPDFDemo.Models; using System; using Sys…

力扣刷题记录(25)LeetCode:583、72、647

583. 两个字符串的删除操作 题目说可以删除任意一个字符串中的字符&#xff0c;实际上就是在求两个字符串的公共子序列。求得公共子序列后与字符串长度做个减法即可得需要的步数。 class Solution { public://求最长子数组int minDistance(string word1, string word2) {vecto…

C++ 数组详解,很全,很详细

数组 (C) 数组是相同类型的对象序列&#xff0c;它们占据一块连续的内存区。 传统的 C 样式数组是许多 bug 的根源&#xff0c;但至今仍很常用&#xff0c;尤其是在较旧的代码库中。 在新式 C 中&#xff0c;我们强烈建议使用 std::vector 或 std::array&#xff0c;而不是本部…