通过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 我知道大家这段时间看了 ...
随机推荐
- luogu1941 飞扬的小鸟
题目大意 游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度).小鸟始终在游戏界面内移动.小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成.小鸟每个 ...
- HDU5806 NanoApe Loves Sequence Ⅱ
NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Ja ...
- ExecuteNonQuery()的用法
ExecuteNonQuery()的用法 下面我们将详细讲解如何在Page_Load()中对数据库的增加.删除.修改,最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar ...
- bzoj2419
http://www.lydsy.com/JudgeOnline/problem.php?id=2419 ∑Ui−UjRi,j=0∑Ui−UjRi,j=0 ∑U1−UjR1,j=1∑U1−UjR1,j ...
- npm 是干什么的?
网上的 npm 教程主要都在讲怎么安装.配置和使用 npm,却不告诉新人「为什么要使用 npm」.今天我就来讲讲这个话题. 本文目标读者是「不太了解 npm 的新人」,大神您别看了,不然又说我啰嗦了 ...
- SpringBoot中使用spring-data-jpa 数据库操作(下)
- mysql百万数据分页查询速度
百万数据测试 ,; 受影响的行: 时间: .080ms ,; 受影响的行: 时间: .291ms ,; 受影响的行: 时间: .557ms ,; 受影响的行: 时间: .821ms ,; 受影响的行: ...
- linux编译安装gcc5.3.0
1.下载GCC5.3.0安装包 #su #cd /opt #wget http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz 2.解压 #.tar. ...
- C# 动态调用 WebService (转)
在 Visual Studio 中客户端程序可以添加服务引用来调用 WebService,这样 Visual Studio 会生成与之相关的代理类,通过这个代理类可以很方便的访问所需要的服务. 如果服 ...
- Git命令add和commit的区别
要想弄明白git add和git commit的区别,首先我们需要知道三个概念:工作区(Working Directory).版本库(Repository).暂存区(Stage or index). ...