Docker支持:三分钟教你学会创建具有微服务的Docker镜像
nanshan 2024-10-23 11:50 32 浏览 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.感谢大家的支持!
相关推荐
- Let’s Encrypt免费搭建HTTPS网站
-
HTTPS(全称:HyperTextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入...
- 使用Nginx配置TCP负载均衡(nginx tcp负载)
-
假设Kubernetes集群已经配置好,我们将基于CentOS为Nginx创建一个虚拟机。以下是实验种设置的详细信息:Nginx(CenOS8Minimal)-192.168.1.50Kube...
- Nginx负载均衡及支持HTTPS与申请免费SSL证书
-
背景有两台minio文件服务器已做好集群配置,一台是192.168.56.41:9000;另一台是192.168.56.42:9000。应用程序通过Nginx负载均衡调用这两台minio服务,减轻单点...
- HTTPS配置实战(https配置文件)
-
原因现在网站使用HTTPS是规范操作之一,前些日子买了腾讯云服务,同时申请了域名http://www.asap2me.top/,目前该域名只支持HTTP,想升级为HTTPS。关于HTTPS的链接过程大...
- 只有IP地址没有域名实现HTTPS访问方法
-
一般来说,要实现HTTPS,得有个注册好的域名才行。但有时候呢,咱只有服务器的IP地址,没注册域名,这种特殊情况下,也能照样实现HTTPS安全访问,按下面这些步骤来就行:第一步,先确认公网...
- 超详解:HTTPS及配置Django+HTTPS开发环境
-
众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种。在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数...
- Godaddy购买SSL之后Nginx配置流程以及各种错误的解决
-
完整流程:参考地址:https://sg.godaddy.com/zh/help/nginx-generate-csrs-certificate-signing-requests-3601生成NGI...
- Nginx从安装到高可用,一篇搞定(nginx安装与配置详解)
-
一、Nginx安装1、去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本2、上传nginx到linux系统3、安装依赖环境(1)安装gcc环境yuminstallgc...
- 阿里云免费证书申请,配置安装,使用tomcat,支持http/https访问
-
参数说明商品类型默认已选择云盾证书服务(无需修改)。云盾证书服务类型SSL证书服务的类型。默认已选择云盾SSL证书(无需修改),表示付费版SSL证书。如果您需要免费领取或付费扩容DV单域名证书【免费试...
- 你试过两步实现Nginx的规范配置吗?极速生成Nginx配置小工具
-
NGINX是一款轻量级的Web服务器,最强大的功能之一是能够有效地提供HTML和媒体文件等静态内容。NGINX使用异步事件驱动模型,在负载下提供可预测的性能。是当下最受欢迎的高性能的Web...
- 从零开始搭建HTTPS服务(搭建https网站)
-
搭建HTTPS服务的最初目的是为了开发微信小程序,因为wx.request只允许发起HTTPS请求,并且还必须和指定的域名进行网络通信。要从零开始搭建一个HTTPS的服务需要下面4...
- 群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问
-
安全第一步,群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问【新手导向】NAS本质还是一个可以随时随地访问的个人数据存储中心,我们在外网访问的时候,特别是在公网IP下,其实会面临着很多安...
- 让网站快速升级HTTPS协议提高安全性
-
为什么用HTTPS网络安全越来越受到重视,很多互联网服务网站,都已经升级改造为https协议。https协议下数据包是ssl/tcl加密的,而http包是明文传输。如果请求一旦被拦截,数据就会泄露产生...
- 用Https方式访问Harbor-1.9版本(https访问流程)
-
我上周在头条号写过一篇原创文章《Docker-Harbor&Docker-kitematic史上最详细双系统配置手册》,这篇算是它的姊妹篇吧。这篇文章也将用到我在头条写的另一篇原创文章的...
- 如何启用 HTTPS 并配置免费的 SSL 证书
-
在Linux服务器上启用HTTPS并配置免费的SSL证书(以Let'sEncrypt为例)可以通过以下步骤完成:---###**一、准备工作**1.**确保域名已解析**...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
【系统配置】信创终端挂载NAS共享全攻略:一步到位!
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)