通過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把我的博客板塊給強制關閉了,唉。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM