百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Docker支持:三分钟教你学会创建具有微服务的Docker镜像

nanshan 2024-10-23 11:50 31 浏览 0 评论

创建具有微服务的Docker镜像

前文已经讨论了可用于运行、创建和管理容器的基本Docker命令。现在是时候创建和构建我们的第一个Docker镜像,以启动我们之前介绍的示例微服务。为此,开发人员应该回到地址htps:/ithb.co/piomi/saompl spring -cloud. comm.git.上的存储库,然后切换到feign. with. _discovery 分支( htpgithub.com/piomin/samople-spring cloud .comm/tee/feign_ with. discovery) 。在该地址上,开发人员将找到每个微服务、网关和发现的Dockerfile。

在讨论这些示例之前,开发人员应该参考Dockerfile的一些资料来理解其基本命令。实际上,Dockerfile 并不是构建Docker镜像的唯一方法, 之前的文章中还将演示如何使用Maven插件创建具有微服务的镜像。

Dockerfile

Docker可以通过读取Dockerfile中提供的指令自动构建镜像, Dockerfile是一个文档,其中包含在命令行上调用以组成镜像的所有命令。所有这些命令都必须以Dockerfile规范中定义的关键字开头。以下是最常用指令的列表,它们按照在Dockerfile中找到它们的顺序执行。在表14.1中,我们还可以附加一些注释,这些注释的后面必须跟着#字符。

现在来看一看它在实践中是如何运作的。我们应该为每个微服务定义一个Dockerfile,并将其放在Git项目的根目录中。以下是为account-service服务创建的Dockerfile.

FROM openjdk:8u151-jdk-slim-stretch

MAINTAINER Piotr Minkowski <piotr .minkows ki@gmail. com>

ENV SPRING PROFILES ACTIVE zonel

ENV EUREKA DEFAULT ZONE http://localhost:8761/eureka/

ADD target/account -service-1.0-SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-Xmx160m", "-jar",

"-Dspring.profiles .active-s (SPRING PROFILES ACTIVE}",

"-Deureka.client .serviceUrl. defaultZone-$ { EUREKA DEFAULT ZONE}",

"/app.jar"]

EXPOSE 8091

前面的例子并不复杂。它只将由微服务生成的胖JAR文件添加到Docker容器中,并使用java -jar命令作为ENTRYPOINT。为了更好地理解它,下 文将逐步进行分析。我们的示例Dockerfile将执行以下指令。

口 该镜像扩展了现有的OpenJDK镜像,该镜像是Java平台标准版(Java Platform Standard Edition) 的官方开源实现。OpenJDK镜像有很多种,可用镜像变体之间的主要区别在于它们的大小。标记为8ul51-jdk-slim-stretch 的镜像提供了JDK8,并包含运行Spring Boot微服务所需的所有库。它也比8u151-jdk 版本Java的基本镜像小得多。

口 在这里,我们使用dockerrun命令的-e选项定义了两个可以在运行时覆盖的环境变量。第一个是活动的Spring配置文件名称,默认情况下它将使用zonel值初始化。第二个是发现服务器的地址,默认情况下等于ht://ocalhost:/761/eureka/。

口 胖JAR文件包含所有必需的依赖项以及应用程序的二进制文件。因此,我们必须使用ADD指令将已生成的JAR文件放入容器中。

口 我们将容器配置为可执行Java应用程序。定义的ENTRYPOINT相当于在本地计算机上运行以下命令。

java -Xmx160m -jar -Dspring.profiles.active = zone1-

Deureka . client. serviceUrl. defaultZone = http: //localhost: 8761/eureka/

apP. jar

口 使用EXPOSE指令,我们告知Docker它可能会公开应用程序的HTTPAPI,该API在端口8091上的容器内可用。

运行容器化微服务

假设我们为每个服务准备了一个有效的Dockerfile, 下一步是使用mvn clean install命令构建整个Maven项目,然后为每个服务构建一个Docker镜像。

构建Docker镜像时,应始终位于每个微服务源代码的root目录中。在基于微服务的系统中运行的第一个容 器必须是发现服务器。其Docker镜像已被命名为piomin/discovery-service。在运行Docker的build命令之前,应转到模块discovery-service。这个Dockerfile比其他微服务稍微简单- - 些,因为在容器内没有设置环境变量,如下所示。

FROM openjdk:8u151-jdk-slim-stretch

MAINTAINER Piotr Minkowski <piotr . minkowski@gmail. com>

ADD target/discovery-service-1.0-SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-Xmx144m", "-jar", "/app.jar"]

EXPOSE 8761

这里仅执行5个步骤,可以在运行dockerbuild命令之后在目标镜像构建期间生成的日志中看到这些步骤。如果一切正常,开发人员应该看到在Dockerfile中定义的所有5个步骤的进度以及以下最终消息,这些消息告诉开发人员镜像已成功构建和标记。

$ docker build -七piomin/discovery-service:1.0.

Sending build context to Docker daemon 39 。9MB

Step 1/5 : FROM openjdk : 8u151- jdk-slim-stretch

8u151-jdk-slim-stretch: Pulling from library/openjdk

8176e34d5d92: Pull complete

2208661344b7: Pull complete

99f2896660b2: Pull complete

e991b55a8065: Pull complete

aee568884a84: Pull complete

18b6b371c215: Pull complete

Digest:

sha256 :bd394fdc7 6e8aa73adba2a7547fcb6cde3281 f70d6b3cae6fa62ef1 fbde327e3

Status: Downloaded newer image for openjdk: 8u151 -jdk-slim-stretch

---> 52de5d98a41d

Step 2/5 : MAINTAINER Piotr Minkowski <piotr . minkowskiegmail. com>

---> Running in 78fc78cc21f0

---> 0eba7a369e43

Removing intermediate container 78fc78cc21£0

Step 3/5 : ADD target/di scovery- service-1.0- SNAPSHOT. jar app. jar

---> 1c6a2e04c4dc

Removing intermediate container 98138425b5a0

Step 4/5 : ENTRYPOINT java -Xmx144m -jar /app . jar

---> Running in 7369ba693689

---> c24 6470366e4

Removing intermediate container 7369ba693689

Step 5/5 : EXPOSE 8761

---> Running in 74493ae54220

---> 06af6a3c2d41

Removing intermediate container 74493ae54220

Successfully built 06af6a3c2d41

Successfully tagged piomin/discovery- service:1.0

如果成功构建了一个镜像,则应该运行它。我们建议创建一个网络,其中将启动包含微服务的所有容器。要在新创建的网络中启动容器,必须使用--network 参数将其名称传递给docker run命令。要检查容器是否已成功启动,可以运行docker logs命令。此命令将应用程序记录的所有行打印到控制台,如下所示。

$ docker network create sample- spring-cloud network

$ docker run -d --name discovery -P 8761:8761 --network samp1e- spring-

cloud-network piomin/discovery-service:1. 0

de2 fac673806e134faedee3c0addaa31 f2bbadef fbdff42a53f8e4ee44ca0674

$ docker logs -f discovery

下一步是使用我们的4个微服务——account-service 服务、customer-service 服务、order-service服务和product-service服务来构建和运行容器。每个服务的过程都是相同的。例如,如果想要构建account-service 服务,则首先需要转到示例项目源代码的该目录中。这里的build命令与发现服务的命令相同,唯一的区别在于镜像名称,如下面的代码段所示。

$ docker build -t piomin/ account-service:1.0

运行Docker镜像的命令对于discovery-service来说有点复杂。在这种情况下,必须将Eureka服务器的地址传递给起始容器。由于此容器与发现服务容器在同一网络中运行,因此,开发人员可以使用其名称而不是其IP地址或任何其他标识符。或者,也可以使用-m参数设置容器的内存限制,如设置为256MB。最后,还可以使用docker logs命令查看运行在容器上的应用程序生成的日志,如下所示。

$ docker run -d --name account -P 8091:8091 -e

EUREKA DEFAULT ZONE http://discovery:8761/eureka -m 256M - - network

sample- spring-cloud network piomin/account- service:1.0

$ docker logs -f account

对于所有其他微服务,应该重复与前面描述相同的步骤。最终结果是5个正在运行的容器,这可以使用dockerps命令显示,如图14.4所示。

所有微服务都在Eureka服务器中注册。Eureka仪表板的地址为htp://92.1/8.99.100:8761/,如图14.5所示。

在这里有我们提到过的另一个有趣的Docker命令: docker stats。此命令打印一些与已启动容器相关的统计信息,如内存或CPU使用情况。如果使用该命令的-format参数,则可以自定义打印统计信息的方式。例如,可以打印容器名称而不是其ID.在运行该命令之前,可以执行一些测试,以检查-切是否正常 工作。开发人员可以注意检查在容器上启动的微服务之间的通信是否已成功完成。此外,如果想要尝试调用customer service服务的端点GET /withAccounts/{id} (它将调用account-service服务公开的端点),则可以运行以下命令。

docker stats -- format "table

{ { .Name}}\t { {. Container} }\tl{. CPUPerc} }\t{ {.MemUsage} }"

如图14.6所示的是docker stats命令的打印结果。

使用Maven插件构建镜像

如前文所述,Dockerfile 不是创建和构建容器的唯一方法, 还有一些其他方法可用,如使用Maven插件。我们有许多可用于构建镜像的插件,它们与mvn命令一起使用。其中一个比较受欢迎的是com. sotify:docker-Maven-plugin插件。它在配置中具有等效标记,可用于代替Dockerfile指令。pom.xml 文件中用于account- service服务的插件配置如下。

<plugin>

<groupId>com . spotify</groupId>

<artifactId>docker -maven-plugin</artifactId>

<version>1.0.0</version>

<configuration>

<imageName>piomin/$ {project . artifactId}</ imageName >

<imageTags>$lproject. version}</ imageTags>

<base Image>openjdk:8u151 -jdk-slim-stretch</base Image>

<entryPoint> ["java", "-Xmx160m", "-jar" ,

"- Dspring.profiles.active=${SPRING PROFILES ACTIVE}",

“一Deureka. client. serviceUrl. defaultZone=$ EUREKA_ DEFAULT ZONE}",

"/$ (project . build. finalName}.jar"] </entryPoint>

<env>

<SPRING PROFILES ACTIVE>zone1</SPRING PROFILES ACTIVE>

<EUREKA DEFAULT ZONE>http://localhost :8761/eureka/</EUREKA DEFAULT ZONE>

</env>

<exposes>8091</exposes>

<maintainer>piotr .minkowskiegmail. com</maintainer>

<dockerHost>https://192.168.99. 100:2376</dockerHost>

<dockerCe rtPath>C: \Users\Piotr \. docker \machine Amachines default

</docker CertPath>

<resources>

<resource>

<directory>${project . build.directory}</directory>

<include>$ {project。build. finalName}。jar</ include>

</ resource>

</ resources>

</ configuration>

</plugin>

可以在Maven的build命令期间调用此插件。如果想要在构建应用程序之后构建Docker镜像,可以使用以下Maven命令。

$ mvn clean install docker: build

或者,开发人员也可以设置dockerDirectory标记,以便基于Dockerfile 执行构建。无论选择哪种方法,效果都是一样的。使用应用程序构建的任何新镜像都可以在Docker机器上使用。使用docker-maven-plugin时,可以通过将pushlmage设置为true来强制自动将镜像推送到存储库,如下所示。

<plugin>

<groupId>com. spotify</groupId>

<arti factId>docker -maven-plugin</artifactId>

<version>1.0.0</version>

<configuration>

<imageName>piomin/S (project.artifactId}</ imageName>

<imageTags>$ {project.version}</ imageTags>

<pushImage>true</pushImage>

<dockerDirectory>src/main/ docker</ dockerDirectory>

<dockerHost>https://192.168.99.100:2376</dockerHost>

<dockerCertPath>C: \Users\Piotr \. docker machine \machines \default

</docker CertPath>

<resources>

<resource>

<directory>$ project.build.directory}</directory>

<include>S {project .build. finalName}. jar</include>

</resource>

</ resources>

</configuration>

</plugin>

高级Docker镜像

到目前为止,我们已经构建了相当简单的Docker镜像。但是,有时需要创建更高级的镜像,我们需要这样的镜像用于持续交付(Continuous Delivery) 演示。这个Docker镜像将作为Jenkins从属(Slave) 服务器运行,并将连接到Jenkins主(Master)服务器,作为Docker容器启动。我们还没有在Docker Hub上找到这样的镜像,所以我们自己创建了一个。

在这里,镜像必须包含Git. Maven、 JDK8和Docker.这些是使用Jenkins从属服务器构建示例微服务所需的所有工具。我们将在本章的后面部分简要介绍使用Jenkins服务器进行持续交付的基本知识。目前,我们将专注于构建所需的镜像。以下是Dockerfile中提供的镜像的完整定义。

FROM docker:18-dind

MAINTAINER Piotr Minkowski <piotr .minkowski@gmail. com>

ENV JENKINS MASTER http:/ /localhost: 8080

ENV JENKINS_ SLAVE NAME dind- node

ENV JENKINS_ SLAVE SECRET

ENV JENKINS HOME /home/jenkins

ENV JENKINS_ REMOTING VERSION 3.17

ENV DOCKER HOST tcp://0.0.0.0:2375

RUN apk - - update add cur1 tar git bash openjdkB sudo

ARG MAVEN VERSION-3.5.2

ARG USER HOME DIR="/root"

ARG

SHA=707b1 f 6e390a 65bde4 af4cdaf2a24d45fc1 9a6ded00fff02e9162 6e3e42ceaff

ARG

BASE URL-https://apache 。osuosl . org/ maven/maven- 3/$ (MAVEN VERSION}/binaries

RUN mkdir -p /usr/share/maven /usr/share/maven/ref \

&& curl -fsSL -0 /tmp/apache -maven.tar.gz $ (BASE URL}/ apache-maven-

$ (MAVEN VERSION}-bin.tar.gz \

&& echo "S{SHA) /tmp/apache -maven. tar.gz" 1 sha256sum -C一

&& tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-

components=l

&& rm -f /tmp/apache -maven. tar.gz \

&& 1n -S /usr/share/maven/bin/mvn /usr/bin/mvn

ENV MAVEN HOME /usr/share/maven

ENV MAVEN CONFIG "SUSER HOME DIR/ . m2"

RUN adduser -D -h SJENKINS_ HOME -s /bin/sh jenkins jenkins && chmod

a+rwx SJENKINS_ HOME

RUN echo "jenkins ALL= (ALL) NOPASSWD: /usr/ local/bin/dockerd" >

/etc/sudoers.d/00jenkins && chmod 440 /etc/sudoers.d/00jenkins

RUN echo "jenkins ALL- (ALL) NOPASSWD: /usr/1ocal/bin/docker" >

/etc/sudoers.d/01jenkins && chmod 440 /etc/sudoers .d/01jenkins

RUN curl --create-dirs -sSLo /usr/share/jenkins/slave.jarhttp://repo . jenkins-ci . org/public/org/jenkins-ci/main/ remot ing/SJENKINS

REMOTING VERSION/ remoting- SJENKINS_ REMOTING VERSION.jar 5& chmod 755

/usr/share/jenkins G& chmod 644 /usr/share/jenkins/slave.jar

COPY entrypoint.sh /usr/loca1/bin/entrypoint

VOLUME $JENKINS HOME

WORKDIR SJENKINS HOME

USER jenkins

ENTRYPOINT ["/usr/1ocal/bin/entrypoint"]

现在我们来分析一下发生了什么。在这里,我们扩展了Docker基础镜像。这是一个非常聪明的解决方案,因为该镜像现在已经在Docker中提供了Docker. 虽然通常不建议在Docker中运行Docker,但是也有一些理想的用例,例如,使用Docker 进行持续交付。除了Docker之外,还使用RUN指令在镜像上安装其他软件,如Git、JDK、Maven或Curl。

我们还添加了一个操作系统用户,它在dockerd脚本中具有sudoers 权限,该脚本负责在机器上运行Docker守护程序。这不是必须在正在运行的容器中启动的唯一进程,还需要使用Jenkins从属服务器启动JAR。这两个命令在entrypoint.sh中执行,它被设置为镜像的ENTRYPOINT。有关此Docker镜像的完整源代码,请访问GitHub,其网址为htpt:/github. com/piomin/jenkins. slave- dind-jnlpgi.开发人员不必从源代码构建它,只需使用以下命令从笔者的Docker Hub账户下载已准备好的镜像。

docker pull piomin / jenkins-slave-dind-inlp

以下是Docker镜像中的脚本entrypoint.sh,它启动了Docker守护进程和Jenkins 从属服务器。

#! /bin/sh

set -e

echo "starting dockerd. . .

sudo dockerd --host=unix:///var/ run/docker.sock --

host=tcp://0.0.0.0:2375 --storage-driver =vfs &

echo "starting jnlp slave.. .”

exec java -jar /usr/share/jenkins/slave.jar \

-jnlpUrl $JENKINS URI/ computer/SJENKINS SLAVE NAME/slave-agent . jnlp \

-secret $JENKINS SIAVE SECRET

本文给大家讲解的内容是创建具有微服务的Docker镜像

1.下篇文章给大家讲解的是微服务的架构的关键优势——持续交付

2.觉得文章不错的朋友可以转发此文关注小编,有需要的可以私信小编获取资料;

3.感谢大家的支持!

相关推荐

MongoDB 从入门到实战:.NET 平台完整指南

一、什么是MongoDBMongoDB是一种功能强大且灵活的NoSQL数据库,适用于处理大规模的半结构化数据和高并发场景。它不依赖于固定的表结构和关系模型,而是以文档的形式存储数据,每个文档可...

NET Framework安装失败的原因及解决方法

大家好我是艾西,一个做服务器租用的游戏爱好者兼网络架构系统环境问题网络工具人。在我们平时使用PC安装某些程序会出现.NETFramework缺失的提示,那么也会有很多的小伙伴搞不懂什么原因导致的,这...

这可是全网eNSP安装最完整,最详细的图解,没有之一(常见问题)

eNSP安装大纲eNSP安装详细图解篇幅较长,会分三篇更完。急需安装的朋友可以在文末获取图解文档和所需软件工具。ENSP安装常见问题和解决方案Vbox安装错误eNSP在安装的过程当中,经常会出现一...

如何在windows 2012安装.NET Framework3.5

Windowsserver2012R2,自带的是.NETFramework4.5,如果想装SQLserver2008或者SQLserver2012需要安装.ENTFramework...

3款国内可用的「Chrome」扩展下载网站

身为程序员,有几个不使用Chrome浏览器提升下编码效率呢?Chrome拥有众多丰富强大的扩展程序,今天给大家分享三个国内可用的Chrome扩展下载网站,收藏一下吧,不然下次就找不到我咯!C...

下载 Windows 10 应用商店程序离线包方法

有厂商为了图方便,会把Windows10应用商店里面的UMP应用改成EXE程序版本。例如之前「网易云音乐」UMP版本简洁清爽,获得不少用户推荐,后来官方懒得更新了,直接把UMP版本...

极速安装!NET Framework 3.5零距离指南!

.NETFramework3.5是一款由微软开发的应用程序框架,它为许多Windows应用程序提供了基础支持。它的新版本带来了许多令人兴奋的功能和改进,比如增强的XML和JSON处理能力以及强大的...

Microsoft.NET离线运行库合集发布 2021

软件介绍.NET是微软具有战略意义的框架,也是装机必不可少的框架,想要一个一个安装略显繁琐,再加上很多电脑小白不知道怎么下载,不小心就下载到某某高速加载器,这个运行库极大解决了这个问题,采用微软官方....

缺少.net framework 3.5怎么办?(缺少.net4.5.1或以上环境)

很多电脑用户在玩某些程序游戏时都会遇到一个头痛的问题,弹出缺少“NETFramework3.5”的提示。微软从Windows8开始默认屏蔽了“.NET3.5”,如果用户有需要就必须选择在线安装...

Windows11无法正常安装.net 3.5组件的解决方法

最近因公司部分电脑升级至Windows11之后,重新安装某些需要加载.net3.5组件的应用软件时,都提示无法完成加载或安装.net3.5而导致无法完成安装。使用离线安装包亦一样无法完成安装。一...

离线安装.Net Framework 3.5(离线安装.net framework 4.0)

前言.Net3.5已经越来越少用到了,但是偶尔还是会遇到一些老软件需要。而Win10、Win11的系统,直接在控制面板的里添加,经常会添加失败!解决方法首先需要一个系统的ISO镜像来提取sxs文件夹:...

Jenkins 11个使用技巧,90%以上的人没用过

一、Performance插件兼容性问题自由风格项目中,有使用Performance插件收集构建产物,但是截至到目前最新版本(Jenkinsv2.298,Performance:v3.19),此...

6款Linux常用远程连接工具,你最中意哪一款?

点击上方头像关注我,每周上午09:00准时推送,每月不定期赠送技术书籍。本文2106字,阅读约需6分钟Hi,大家好。远程连接的实现方法有很多,概括地说有两种,一种是用系统自带的远程连接,另外一种是用...

Linux常用远程连接工具介绍,总有一款适合你

作为运维或者网工最常用就是ssh远程和远程桌面工具,本文就介绍几个常用的远程连接工具,你在用哪一款呢SecureCRT介绍:我觉得这个是最好的SSH工具,没有之一。SecureCRT支持SSH,同时支...

终极软路由网络设置,ESXi虚拟机安装iKuai+openWrt双路由系统

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:BigBubbleGum本文是软路由系列的第五篇,也是折腾时间最长的一篇,在ESXi下分别独立安装和使用iKuai和openWrt...

取消回复欢迎 发表评论: