• 通过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/bash
    
    SERVER_NAME='demo'
    # jar名称
    JAR_NAME='demo-0.0.1-SNAPSHOT.jar'
    cd `dirname $0`
    BIN_DIR=`pwd`
    SERVER_PORT=8080
    
    PIDS=`ps -ef | grep java | grep "$JAR_NAME" |awk '{print $2}'`
    if [ "$1" = "status" ]; then
        if [ -n "$PIDS" ]; then
            echo "The $SERVER_NAME is running...!"
            echo "PID: $PIDS"
            exit 0
        else
            echo "The $SERVER_NAME is stopped"
            exit 0
        fi
    fi
    
    if [ -n "$PIDS" ]; then
        echo "ERROR: The $SERVER_NAME already started!"
        echo "PID: $PIDS"
        exit 1
    fi
    
    if [ -n "$SERVER_PORT" ]; then
        SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
        if [ $SERVER_PORT_COUNT -gt 0 ]; then
            echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
            exit 1
        fi
    fi
    
    echo -e "Starting the $SERVER_NAME ..."
    
    STDOUT_FILE=$BIN_DIR/stdout.log
    nohup java -jar $BIN_DIR/$JAR_NAME > $STDOUT_FILE 2>&1 &
    COUNT=0
    while [ $COUNT -lt 1 ]; do
        echo -e ".c"
        sleep 1
        if [ -n "$SERVER_PORT" ]; then
            COUNT=`netstat -an | grep $SERVER_PORT | wc -l`
        else
            COUNT=`ps -f | grep java | grep "$BIN_DIR" | awk '{print $2}' | wc -l`
        fi
        if [ $COUNT -gt 0 ]; then
            break
        fi
    done
    
    
    echo "OK!"

    stop.sh

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

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

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

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

    3、编写compose文件

    version: '3'
    
    services:
       
      nginx:
        container_name: nginx_container
        image: nginx
        ports:
          - "80:80"
        restart: unless-stopped
        volumes:
          - $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 .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

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

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

    我们把web服务停了看看。

    在刷新下网页

     

    OK!验证完成。。。

    今天就到这吧。。谢谢。

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

  • 相关阅读:
    关于ADO.NET连接池
    The Cost of GUIDs as Primary Keys
    数据库反规范设计
    如何快速的呈现我们的网页(转)
    小议数据库主键选取策略(转自吕震宇老师博文)
    javascript 单元测试 (Jsunit应用) 转
    sqlserver版本降级方法
    算术运算表达式正则及分析
    sql STUFF用法
    Flex DashBoard功能
  • 原文地址:https://www.cnblogs.com/contraII/p/10088974.html
Copyright © 2020-2023  润新知