docker安装_使用docker在带有SSL的Nginx反向代理后面部署Quarkus或任何基于Java的微服务…

docker安装

docker安装

已经有一段时间了,但是根据一位朋友的要求,我将向您展示如何使用docker在Nginx反向代理后面部署Quarkus微服务。

我们会做什么…

我将在centos 8主机上安装docker和docker-compose,并部署一个将在端口80和443上公开Nginx的docker容器以及使用Quarkus的微服务。 相同的技术可以与任何Java微服务框架(例如microprofile,Springboot等)一起使用,因为最后您将要做的是运行一个简单的jar文件(java神奇吗?)。

开始吧…

我将跳过docker和docker-compose的安装详细信息。 如果您还没有听说过docker-compose,请查看https://gabrieltanner.org/blog/docker-compose ,您会喜欢的。 它可以自动执行您的容器部署,简直是摇摇晃晃!

先决条件

首先确保您已打开所需的端口

 sudo firewall-cmd --zone= public --add-masquerade --permanent sudo firewall-cmd --zone= sudo firewall-cmd --zone= public --add-port= 22 /tcp sudo firewall-cmd --zone= public --add-port= 80 /tcp sudo firewall-cmd --zone= public --add-port= 443 /tcp sudo firewall-cmd --reload 

现在根据文档安装docker

 #remove previous versions if any sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #install sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https: //download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl start docker #Verify that Docker Engine is installed correctly by running the hello-world image. sudo docker run hello-world 

最后但并非最不重要的是安装docker-compose

 #curl is required dnf install curl #Download the latest version of Docker Compose. Currenlty I am using version #Download the latest version of Docker Compose. Currenlty I am using version 1.25 #Download the latest version of Docker Compose. Currenlty I am using version . 4 curl -L https: //github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # Test the installation. docker-compose --version 

现在到有趣的东西…

检出我使用Quarkus开发的示例应用程序,该应用程序通过执行git clone https://github.com/diakogiannis/pacecalculatorapi.git来计算跑步者的步伐

如果您忘记安装GIT(如果您执行sudo yum install git我不会告诉任何人)

现在让我们在Docker映像中构建它(是的,您甚至不必安装Java)…

docker run --name=pacecalculator -d -p 9090 : 8080 diakogiannis/pacecalculator:latest

瞧! 该应用程序已准备好运行!

实际上,我们告诉码头工人运行该容器,并给他起了步步计算器的名字,“-d”告诉我们处于“分离”模式,因此它将在后台运行,而“ -p 9090:8080”则告诉他公开运行系统中内部的8080端口到9090端口。

让我们测试一下它是否有效,并且由于我是一名糟糕的长跑运动员,因此我将尝试计算不到30分钟(1.700秒)的5公里跑步速度

curl " http://localhost:9090/api?distance=5&seconds=1700 "

这将导致{"pace":"5.67"}

让我们检查一下docker文件

 # Stage 1 : build with maven builder image FROM maven: 3.6 . 0 -jdk- 11 -slim AS BUILD MAINTAINER Alexius Diakogiannis COPY . /usr/app/ RUN mvn -f /usr/app/ clean package # Stage 2 : copy from the previous container the jar file, put it in a java one and run it FROM adoptopenjdk: 11 -jdk-openj9 WORKDIR /app COPY --from=BUILD /usr/app/target/PaceCalculatorApp-runner.jar /app/ ENTRYPOINT [ "java" , "-jar" , "/app/PaceCalculatorApp-runner.jar" ] 
  1. 首先,我们将Maven容器与JDK-11一起使用,并使用COPY命令将其中的所有项目复制到其中。
  2. 之后,我们通过在mvn clean package指出pom.xml文件的位置,以与在常规开发环境中相同的方式构建它。 之后,我们使用另一个容器(因为毕竟可能需要一个不同的环境来运行该应用程序),在这种情况下,我们使用的是JDK-11,但使用的是OpenJ9 JVM(这动摇了它的来历,并且它起源于IBM的Java SDK / IBM J9,并且具有很大的内存)管理)
  3. 然后,我们将从前一个容器创建的jar文件复制到新容器
  4. 最后,我们告诉java -jar /app/PaceCalculatorApp-runner.jar在容器启动时执行java -jar /app/PaceCalculatorApp-runner.jar 。 请特别注意,使用ENTRYPOINT时,每个参数必须位于单独的部分。

现在让我们停止并删除容器docker stop pacecalculator && docker rm pacecalculator

准备文件系统

为了使NGinX SSL正常工作,我们需要将证书存储在某个地方。 另外,还需要一个用于NGinX日志的文件夹。 最好的做法是不在Docker映像内生成IO,因此在生产中还要外部化Java应用程序的控制台日志,但这只是PoC。

对于我的安装,我通常使用/ volumes / {docker映像名称} / {feature}模式,并且我不让docker决定将卷存储在何处。 所以在这种情况下,我创建了

  • / volumes / reverse / config
  • / volumes / reverse / certs
  • / volumes / reverse / logs

reverse将是NGinX将运行的docker容器的名称

我已经在自由权限下颁发了证书,并将其两个文件(pacecalculator.pem和speedcalculator.key)放在/ volumes / reverse / certs目录中

我用内容创建文件/volumes/reverse/config/nginx.conf

 user nginx; worker_processes 1 ; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024 ; } http { default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65 ; gzip on; gzip_http_version 1.0 ; gzip_proxied any; gzip_min_length 500 ; gzip_disable "MSIE [1-6]\." ; gzip_types text/plain text/html text/xml text/css text/comma-separated-values text/javascript application/x-javascript application/javascript application/atom+xml application/vnd.ms-fontobject image/svg+xml; proxy_send_timeout 120 ; proxy_read_timeout 300 ; proxy_buffering off; tcp_nodelay on; server { listen *: 80 ; server_name jee.gr; # allow large uploads of files client_max_body_size 80M; # optimize downloading files larger than 1G #proxy_max_temp_file_size 2G; location / { # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup proxy_pass http: //pacecalculator:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 443 ssl; server_name nomisma.com.cy www.nomisma.com.cy app.nomisma.com.cy; ssl_certificate /etc/ssl/ private /pacecalculator.pem; ssl_certificate_key /etc/ssl/ private /pacecalculator.key; ssl_protocols TLSv1 TLSv1. 1 TLSv1. 2 ; ssl_ciphers HIGH:!aNULL:!MD5; # allow large uploads of files client_max_body_size 80M; # optimize downloading files larger than 1G #proxy_max_temp_file_size 2G; location / { # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup proxy_pass http: //pacecalculator:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } 

我将不对配置进行详细介绍,但通常,它将对客户端和反向代理之间的通信进行gzip压缩,并将侦听主机名jee.gr。 80和443端口都将在微服务的端口80上反向代理,这意味着内部docker通信未加密(但是我们需要对其进行加密吗?)。 我们当然可以对其进行加密,但这不在本教程的讨论范围之内。 请注意,我们将内部主机名使用docker名称“ pacecalculator”。

让我们创建Orchestrator aka docker-compose.yml文件,它将以正确的顺序协调两个微服务的部署。

nano docker-compose.yml

和内贴

 version: '3' services: reverse: depends_on: - pacecalculator container_name: reverse hostname: reverse image: nginx ports: - 80 : 80 - 443 : 443 restart: always volumes: - /volumes/reverse/config/:/etc/nginx/ - /volumes/reverse/logs/:/var/log/nginx/ - /volumes/reverse/certs/:/etc/ssl/ private / pacecalculator: container_name: reverse hostname: reverse image: diakogiannis/pacecalculator:latest restart: always networks: default : external: name: proxy-net 

因此,我们在这里所做的是,我们启动了心律计算器服务,并且反向服务告诉它暴露端口80和443,但也要等待(depends_on),直到心律计算器成功启动。 另外,我们正在使用内部专用网络进行通讯,我们将其命名为proxy-net

时间到了!

我们通过发行来启动容器

docker-compose -f /{path to}/docker-compose.yml up --remove-orphans -d

这将清理剩余的容器并以分离模式(也称为背景)再次启动

如果我们想停止它,我们发出

docker-compose -f /{path to}/docker-compose.yml down

就像法国人所说的“难解之谜”? 没有最简单的方法!

翻译自: https://www.javacodegeeks.com/2020/11/deploying-a-quarkus-or-any-java-based-microservice-behind-an-nginx-reverse-proxy-with-ssl-using-docker.html

docker安装

原文链接:https://blog.csdn.net/cunfu5234/article/details/112543635

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享