![docker安装](https://i-blog.csdnimg.cn/blog_migrate/a0e55c0afa9fbffe5d6a4c967c2278c6.png)
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" ]
- 首先,我们将Maven容器与JDK-11一起使用,并使用COPY命令将其中的所有项目复制到其中。
- 之后,我们通过在
mvn clean package
指出pom.xml文件的位置,以与在常规开发环境中相同的方式构建它。 之后,我们使用另一个容器(因为毕竟可能需要一个不同的环境来运行该应用程序),在这种情况下,我们使用的是JDK-11,但使用的是OpenJ9 JVM(这动摇了它的来历,并且它起源于IBM的Java SDK / IBM J9,并且具有很大的内存)管理) - 然后,我们将从前一个容器创建的jar文件复制到新容器
- 最后,我们告诉
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
就像法国人所说的“难解之谜”? 没有最简单的方法!
docker安装