通过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 我知道大家这段时间看了 ...
随机推荐
- YTU 2506: 切面条
2506: 切面条 时间限制: 1 Sec 内存限制: 128 MB 提交: 382 解决: 223 题目描述 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀, ...
- YTU 2625: B 构造函数和析构函数
2625: B 构造函数和析构函数 时间限制: 1 Sec 内存限制: 128 MB 提交: 772 解决: 513 题目描述 在建立类对象时系统自动该类的构造函数完成对象的初始化工作, 当类对象 ...
- Silverlight之控件应用总结(二)(4)
[置顶] Silverlight之控件应用总结(二)(4) 分类: 技术2012-04-03 22:12 846人阅读 评论(0) 收藏 举报 silverlightradiobuttonhyperl ...
- 准确率,精确率,召回率,F-measure 之间的关系
总结:(图上 R的计算的分母应该是 :40+10 )(笔误) 模型条件放宽,负类被误判为正类的可能性就变大(即FP变大)精确率和准确率会受影响(变小) 模型条件变严格,正类有可能被误判为负类(即FN变 ...
- 7章 Admin
Admin这个东西本身就已经存在于我们的项目中,是Django自己创建的.admin是Django自带的一个APP. # Application definition INSTALLED_APPS = ...
- 为了一个句号,写了好多行的代码——值!(html 表单的处理)
个人信息表 <span style="font-size:18px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...
- 人脸识别(初学篇)-VS2015+opencv3.2的配置
初学人脸识别,感觉安装也是一个很大的麻烦. 写在这里记录一下吧 一:先安装好我们需要的软件 首先安装Vs2015,在官网或者csdn搜一下应该找的到. 安装步骤没有太多讲究. 点击exe文件,我选择的 ...
- redis简介及常见问题
目录 简介 特点 优点 高性能 高并发 为什么要用 redis 而不用 map/guava 做缓存? redis 和 memcached 的区别 Redis快的原因 为什么redis是单线程 为什么r ...
- 乐搏讲自动化测试- Python环境搭建(7)
Python的下载和安装 Python可应用于多平台包括 Linux 和 Mac OS X.你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Py ...
- 2017杭电多校第五场Rikka with Subset
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...