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