前面已经讲过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 0fi
fiif [ -n "$PIDS" ]; thenecho "ERROR: The $SERVER_NAME already started!"echo "PID: $PIDS"exit 1
fiif [ -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 1fi
fiecho -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 ]; 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 ]; thenbreakfi
doneecho "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 1
fiecho -e "Stopping the $SERVER_NAME ...\c"
for PID in $PIDS ; dokill $PID > /dev/null 2>&1
doneCOUNT=0
while [ $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=0breakfidone
doneecho "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 .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把我的博客板块给强制关闭了,唉。。

转载于:https://www.cnblogs.com/contraII/p/10088974.html

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

  1. 探讨Docker不能启动容器的原因和解决方法

    Docker是一种虚拟化容器技术,能够提供一种快速.高效.可靠的容器化解决方案,广泛应用于云计算.大数据.微服务架构等场景.但是,有时候在使用Docker的过程中,我们会遇到一些问题,比如容器不能启动 ...

  2. 8s 使用本地打包镜像_在Docker环境构建、打包和运行Spring Boot应用

    为何考虑采用Docker? Docker是提供用户构建镜像的一种容器化技术,所构建的镜像包含了主要的应用程序和运行应用所需的所有依赖项.该镜像可在任何虚拟机或物理机器上的Docker容器上运行.它的强 ...

  3. docker build -t_在Docker环境构建、打包和运行Spring Boot应用

    为何考虑采用Docker? Docker是提供用户构建镜像的一种容器化技术,所构建的镜像包含了主要的应用程序和运行应用所需的所有依赖项.该镜像可在任何虚拟机或物理机器上的Docker容器上运行.它的强 ...

  4. 从服务器基础环境配置到搭建Docker+Gitlab+Gitlab Runner,完整介绍Spring Boot项目的持续集成与持续交付具体实现!

    1. 序言 在大学的课程学习,非常注重团队协作的培养,在企业开发中,团队协作开发项目的场景更是甚多.另外,在当下的热门技术栈中,微服务开发模式.前后端分离开发模式逐渐盛行,Spring Boot.VU ...

  5. spring boot没有web.xml,如何向嵌入式的servlet容器中注册servlet组件

    1. Spring boot默认使用Tomcat作为嵌入式的servlet容器,只要引入spring-boot-starter-web依赖,就会默认用Tomcat作为servlet容器. 2. Spr ...

  6. docker image设置jdk版本_Docker 部署 Spring Boot

    作者:云天 镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 一.Docker 简介 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容 ...

  7. localhost访问容器mysql失败_Docker - Spring Boot应用程序 - 无法访问localhost上的MySql服务器...

    如何将在Docker中运行的Spring Boot(JAR)应用程序连接到计算机上的MySql服务器? [我尝试了不同的帖子,但这没有帮助] 在我的Spring Boot'application.pr ...

  8. 完美解决systemctl start docker.service启动容器报错

    安装docker容器后,启动时报错如下: [root@joinApp2 ~]# systemctl  start  docker.service Job for docker.service fail ...

  9. Docker run 启动容器

    使用 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 选项 名称 描述 -a 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 ...

最新文章

  1. python学了有什么用处-Python主要用途是哪些,跟机器学习等有啥关系呢?
  2. win10怎么共享打印机_共享打印机添加不上怎么办?建议收藏备用
  3. 自动驾驶路径规划论文解析(5)
  4. Linux gedit
  5. DataSet数据筛选和排序
  6. Pandas系列(十六)快速进行日期处理
  7. c语言字符型计算器,C语言字符计算器
  8. 西门子1200plc与施耐德变频器modbus通讯程序
  9. 美团Android开发工程师岗位职能要求,薪资翻倍
  10. Exception in thread main java.util.UnknownFormatConversionException: Conversion = ';'
  11. 武汉科技大学计算机学院温文,第五届华中地区计算机类院校学生领袖峰会成功举行...
  12. 阿里云和腾讯云服务器10M带宽能支持多少人在线?
  13. iPhone支持杜比的机型
  14. 金庸秘笈英汉互译(zz)
  15. python使用python-docx自动化操作word
  16. 解密!看蚂蚁金服智能调度技术如何优化客服中心资源调配
  17. 华为手机日历的功能大全,赶快来试试
  18. 【视频课】行为识别课程更新!CNN+LSTM理论与实践!
  19. PyCharm导入库
  20. 重新定义公司:谷歌是如何运营的

热门文章

  1. linux make 无法生成 .o gch,Linux--makefile的使用
  2. java子线程切换到主线程_Android子线程切换到UI线程方法总结
  3. SpringBoot→thymeleaf静态模板
  4. pyinstaller下载_《快速掌握PyQt5》第二十五章 Pyinstaller打包
  5. 数据结构—树(大纲)
  6. Pikachu实验重现2(Sql的注入)
  7. 运算优先级、类型转换
  8. bzoj 3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四(set+BFS)
  9. bzoj 2707: [SDOI2012]走迷宫(Trajan+高斯消元+Dp)
  10. 图像形态学运算之图像开闭运算 含python实现