通过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 $`
BIN_DIR=`pwd`
SERVER_PORT= 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
else
echo "The $SERVER_NAME is stopped"
exit
fi
fi if [ -n "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $PIDS"
exit
fi if [ -n "$SERVER_PORT" ]; then
SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
if [ $SERVER_PORT_COUNT -gt ]; then
echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
exit
fi
fi echo -e "Starting the $SERVER_NAME ..." STDOUT_FILE=$BIN_DIR/stdout.log
nohup java -jar $BIN_DIR/$JAR_NAME > $STDOUT_FILE >& &
COUNT=
while [ $COUNT -lt ]; do
echo -e ".\c"
sleep
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 ]; then
break
fi
done echo "OK!"
stop.sh
#!/bin/bash SERVER_NAME='demo'
# jar名称
JAR_NAME='demo-0.0.1-SNAPSHOT.jar'
cd `dirname $`
SERVER_PORT= PIDS=`ps -ef | grep java | grep "$JAR_NAME" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME does not started!"
exit
fi echo -e "Stopping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
kill $PID > /dev/null >&
done COUNT=
while [ $COUNT -lt ]; do
echo -e ".\c"
sleep
COUNT=
for PID in $PIDS ; do
PID_EXIST=`ps -f -p $PID | grep java`
if [ -n "$PID_EXIST" ]; then
COUNT=
break
fi
done
done echo "OK!"
echo "PID: $PIDS"
2、然后我们把测试的web服务启动起来

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

说明web已经起来了。。 到这步为止,我们可以看到端口暴露的是8080,没关系,我们下面几个步骤准备来用nginx做代理,转到80端口。
3、编写compose文件
version: '' 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 ;
events {
use epoll;
worker_connections ;
}
http {
include mime.types;
default_type application/octet-stream;
gzip on; #开启压缩
gzip_min_length ; #小于1000KB文件不压缩
gzip_comp_level ; #压缩比率
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
sendfile on;
keepalive_timeout ;
server {
listen ;
server_name demo_web;
if ($request_method !~ ^(GET|POST)$ ) {
return ;
}
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 /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把我的博客板块给强制关闭了,唉。。
通过docker-composer启动容器nginx,并完成spring.boot的web站点端口转发的更多相关文章
- Docker每次启动容器,IP及hosts指定
原文链接:https://blog.csdn.net/u012834750/article/details/80508464 前言 每次在使用Docker启动Hadoop集群的时候,都需要重新绑定下网 ...
- docker中启动容器提示端口被占用
docker中启动容器提示端口被占用,但是 docker ps -a 查不到信息 1.查询端口被占用的id netstat -ntpl |grep 3306 2.杀掉该id kill -9 如果kil ...
- Spring Boot 嵌入式Web容器
目录 前言 1.起源 2.容器启动流程解析 2.1.获取应用类型 2.2.容器启动流程 3.加载 Web 容器工厂 4.总结 前言 最近在学习Spring Boot相关的课程,过程中以 ...
- docker 无法启动容器,run容器后状态为restarting
问题:如题,无法进入容器,docker logs 容器id 发现 哦 ,原来缺少个文件,这些就容易了
- Docker - Deepin中docker不能启动容器,-d也无效
问题重现 1. 搭建mysql docker run -p 3306:3306 --name docker-mysql-5.7 -v $PWD/conf:/etc/mysql/conf.d -v $P ...
- 启动类加注解@MapperScan spring boot mybatis 启动错误
Description: Field userDao in com.gcy.springsecuritydemo.service.user.UserService required a bean of ...
- MySQL安装+Navicat_Premium(安装+破解)+Navicat_Premium中MySQL的localhost不能正常连接+不能连接Docker启动容器中的MySQL
MySQL安装 安装MySQL 我这里安装的是 MySQL 8.0 Command Line Client 下载+安装 详情见 https://www.cnblogs.com/taopanfeng/p ...
- Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...
- (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...
随机推荐
- Codeforces Round #267 (Div. 2) C. George and Job(DP)补题
Codeforces Round #267 (Div. 2) C. George and Job题目链接请点击~ The new ITone 6 has been released recently ...
- 并不对劲的st表
对于带修改的区间求和能做到O(n log n)预处理,O(log n)查询:而不带修改的可以做到O(n)预处理,O(1)查询.那么不带修改的区间最值能做到O(1)查询吗? 区间最值有这样一个性质:对于 ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 C序列变换
链接:https://www.nowcoder.com/acm/contest/91/C来源:牛客网没有账号的同学这样注册,支持博主 题目描述 给定两个长度为n的序列,ai, bi(1<=i&l ...
- URAL1553 Caves and Tunnels 树链剖分 动态树
URAL1553 维护一棵树,随时修改某个节点的权值,询问(x,y)路径上权值最大的点. 树是静态的,不过套动态树也能过,时限卡的严就得上树链剖分了. 还是那句话 splay的核心是splay(x) ...
- RDA 重现率
文件目录: timing_info/AspectRatioOverscan&TimingTool/Aspect_Ratio_Overscan&Timing_Tool_330.xls 重 ...
- 为什么Markdown能夺得程序员的青睐
Markdown基本情况概述 Markdown是在HTML的基础上产生的.HTML的功能已经足够强大,可以编写出漂亮的网页.HTML在没有CSS的加持上,尽管不能显示出绚丽多彩的网页,但是仍然可以达到 ...
- 最大流增广路(KM算法) HDOJ 1533 Going Home
题目传送门 /* 最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法 */ #include <cstdio> #include <cmath> #incl ...
- Android内存管理(14)*使用开源库LeakCanary检查内存泄漏
1.简介 它是一个非常简单好用的内存泄漏检测工具库.可以轻松检测Activity,Fragment的内存泄漏.如果有内存泄漏,它会产生一个通知. 2.资料 官网: https://github.com ...
- [书目20140824]触动人心:设计优秀的iPhone应用
关于作者致谢译者序入门设计令人欣喜且易用的应用等下……先吸口气阅读本书不需要专业知识忠言一切从点击开始 我们是如何使用iPhone应用的行走中:一只手,一只眼睛,一直在抖动尽快搞定满满一箱 ...
- pom.xml详情
这里借鉴一下csdn中的一个系列的博客: 第一篇:POM文件详解 第二篇:maven中的依赖作用范围 第三篇:maven中的可选依赖和依赖排除 第四篇:maven中的dependencies和depe ...