1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 通过docker-composer启动容器nginx 并完成spring.boot的web站点端口转发

通过docker-composer启动容器nginx 并完成spring.boot的web站点端口转发

时间:2020-12-22 09:37:12

相关推荐

通过docker-composer启动容器nginx 并完成spring.boot的web站点端口转发

前面已经讲过2篇基于docker的mysql、redis容器编排并启动。这次将练习下nginx的docker方式的部署,以及通过nginx去代理宿主主机上的Web服务应该怎么配

PS:(这里由于nginx是容器上运行,然后web服务是运行在linux上,所以有区别)

准备环境:

docker 18.06.1-ce

docker-compose 1.23.0-rc3

nginx镜像

spring.boot的web项目 demo-0.0.1-SNAPSHOT.jar(越简单越好,这里主要用于测试)

开始:

新建目录/usr/iqeq/nginx,目录结构如下

------[ nginx ]

------docker-compose.yml

------demo-0.0.1-SNAPSHOT.jar

------start.sh

------stop.sh

------------------------------[ conf ]

---------------------------------------nginx.conf

------------------------------[ data ]

------------------------------[ log ]

1、我们先把编写sh脚本,用于启动、停止spring.boot项目。

start.sh

#!/bin/bashSERVER_NAME='demo'# jar名称JAR_NAME='demo-0.0.1-SNAPSHOT.jar'cd `dirname $0`BIN_DIR=`pwd`SERVER_PORT=8080PIDS=`ps -ef | grep java | grep "$JAR_NAME" |awk '{print $2}'`if [ "$1" = "status" ]; thenif [ -n "$PIDS" ]; thenecho "The $SERVER_NAME is running...!"echo "PID: $PIDS"exit 0elseecho "The $SERVER_NAME is stopped"exit 0fifiif [ -n "$PIDS" ]; thenecho "ERROR: The $SERVER_NAME already started!"echo "PID: $PIDS"exit 1fiif [ -n "$SERVER_PORT" ]; thenSERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`if [ $SERVER_PORT_COUNT -gt 0 ]; thenecho "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"exit 1fifiecho -e "Starting the $SERVER_NAME ..."STDOUT_FILE=$BIN_DIR/stdout.lognohup java -jar $BIN_DIR/$JAR_NAME > $STDOUT_FILE 2>&1 &COUNT=0while [ $COUNT -lt 1 ]; doecho -e ".\c"sleep 1if [ -n "$SERVER_PORT" ]; thenCOUNT=`netstat -an | grep $SERVER_PORT | wc -l`elseCOUNT=`ps -f | grep java | grep "$BIN_DIR" | awk '{print $2}' | wc -l`fiif [ $COUNT -gt 0 ]; thenbreakfidoneecho "OK!"

stop.sh

#!/bin/bashSERVER_NAME='demo'# jar名称JAR_NAME='demo-0.0.1-SNAPSHOT.jar'cd `dirname $0`SERVER_PORT=8080PIDS=`ps -ef | grep java | grep "$JAR_NAME" |awk '{print $2}'`if [ -z "$PIDS" ]; thenecho "ERROR: The $SERVER_NAME does not started!"exit 1fiecho -e "Stopping the $SERVER_NAME ...\c"for PID in $PIDS ; dokill $PID > /dev/null 2>&1doneCOUNT=0while [ $COUNT -lt 1 ]; doecho -e ".\c"sleep 1COUNT=1for PID in $PIDS ; doPID_EXIST=`ps -f -p $PID | grep java`if [ -n "$PID_EXIST" ]; thenCOUNT=0breakfidonedoneecho "OK!"echo "PID: $PIDS"

2、然后我们把测试的web服务启动起来

这个spring.boot项目很简单,打印一行字符串。

说明web已经起来了。。到这步为止,我们可以看到端口暴露的是8080,没关系,我们下面几个步骤准备来用nginx做代理,转到80端口。

3、编写compose文件

version: '3'services:nginx:container_name: nginx_containerimage: nginxports:- "80:80"restart: unless-stoppedvolumes:- $PWD/nginx/conf/nginx.conf:/etc/nginx/nginx.conf - $PWD/nginx/logs/:/var/log/nginx/- $PWD/nginx/data/:/var/share/nginx/html/

在/usr/iqeq/nginx/conf下面新建的那个一个文件:nginx.conf,改下配置如下。

worker_processes 1;events {use epoll;worker_connections 10240;}http {include mime.types;default_type application/octet-stream;gzip on; #开启压缩gzip_min_length 1000;#小于1000KB文件不压缩gzip_comp_level 4; #压缩比率 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;sendfile on;keepalive_timeout 65;server {listen 80;server_name demo_web;if ($request_method !~ ^(GET|POST)$ ) {return 444;}location / {proxy_pass http://172.18.0.1:8080/; #?????? proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}

对了上面配置文件中打????的标记部分,得解释下:这个IP地址是宿主linux本机与容器nginx建立的网络中分配的地址(原因是每个容器都是运行于沙箱环境,容器与容器之间可以通过暴露的端口去访问,)

4、启动docker-compose

到这步,其实就nginx已经起来了,代理也完成了。先再介绍下,刚才那个????的标记部分是为什么。

查看显示所有容器IP地址的命令

docker inspect --format='{{.Name}} - {{range .works}}{{.IPAddress}}{{end}}' $(docker ps -aq)

上面容器的ip是172.18.0.2,那么可以推断,我们linux宿主的ip是172.18.0.2了。

5、验证nginx代理是不是成功到80端口了。看下面截图:

我们把web服务停了看看。

在刷新下网页

OK!验证完成。。。

今天就到这吧。。谢谢。

代码实例我放在github上,本来想贴链接,但是不懂博客园让不让贴,之前在 csdn贴了自己的源码链接,csdn把我的博客板块给强制关闭了,唉。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。