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安装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值