前面已经讲过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站点端口转发的更多相关文章

  1. Docker每次启动容器,IP及hosts指定

    原文链接:https://blog.csdn.net/u012834750/article/details/80508464 前言 每次在使用Docker启动Hadoop集群的时候,都需要重新绑定下网 ...

  2. docker中启动容器提示端口被占用

    docker中启动容器提示端口被占用,但是 docker ps -a 查不到信息 1.查询端口被占用的id netstat -ntpl |grep 3306 2.杀掉该id kill -9 如果kil ...

  3. Spring Boot 嵌入式Web容器

    目录 前言 1.起源 2.容器启动流程解析 2.1.获取应用类型 2.2.容器启动流程 3.加载 Web 容器工厂 4.总结 前言         最近在学习Spring Boot相关的课程,过程中以 ...

  4. docker 无法启动容器,run容器后状态为restarting

    问题:如题,无法进入容器,docker logs 容器id  发现 哦 ,原来缺少个文件,这些就容易了

  5. 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 ...

  6. 启动类加注解@MapperScan spring boot mybatis 启动错误

    Description: Field userDao in com.gcy.springsecuritydemo.service.user.UserService required a bean of ...

  7. MySQL安装+Navicat_Premium(安装+破解)+Navicat_Premium中MySQL的localhost不能正常连接+不能连接Docker启动容器中的MySQL

    MySQL安装 安装MySQL 我这里安装的是 MySQL 8.0 Command Line Client 下载+安装 详情见 https://www.cnblogs.com/taopanfeng/p ...

  8. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...

  9. (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...

随机推荐

  1. HDU 1023 Catalan数+高精度

    链接:HDU 1023 /**************************************** * author : Grant Yuan * time : 2014/10/19 15:5 ...

  2. Git经常使用命令总结

    Git是一款开源的分布式版本号控制系统,由Linux之父Torvalds用C语言开发. "the stupid content tracker",Git自诩为stupid,却是一个 ...

  3. YTU 2899: D-险恶逃生 I

    2899: D-险恶逃生 I 时间限制: 1 Sec  内存限制: 128 MB 提交: 130  解决: 55 题目描述 Koha被邪恶的巫师困在一个m*n的矩阵当中,他被放在了矩阵的最左上角坐标( ...

  4. POJ 2260:Error Correction

    Error Correction Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6014   Accepted: 3886 ...

  5. Java中的经典算法之冒泡排序

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

  6. 函数bsxfun,两个数组间元素逐个计算的二值操作

    转自http://www.cnblogs.com/rong86/p/3559616.html 函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间 ...

  7. java笔记线程两种方式模拟电影院卖票

    public class SellTicketDemo { public static void main(String[] args) { // 创建三个线程对象 SellTicket st1 = ...

  8. http-2.4

    http-2.4 1)新特性 (1)MPM 支持运行为DSO 机制:以模块形式按需加载 (2)event MPM 生产环境可用 (3)异步读写机制 (4)支持每模块及每目录的单独日志级别定义 (5)每 ...

  9. bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】

    有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...

  10. centos 重装docker

    docker应该是root用户来使用,因为他连接了底层!!!以下操作默认是root用户来操作的 停止所有正在运行的容器: docker stop $(docker ps -a -q) 删除所有的容器c ...