资讯专栏INFORMATION COLUMN

Docker 快速验证:不转发让 Tomcat 绑定 80 端口

AnthonyHan / 1569人阅读

摘要:重启后,不但转发策略失效,重新执行转发命令后仍旧不能访问。方案稍后整理发布。第三轮投产时,通过和一线沟通,得知客户这边的策略是生产一律关闭防火墙。不过对于端口的绑定,被真实商业环境折磨许久,研究分析实现了种种可能。

前言

之前写过 tomcat 单机多实例,最后解决 80 端口访问用的是 iptables 转发;

第三轮投产前,客户做了迁移和扩容。重启后,不但转发策略失效,重新执行转发命令后仍旧不能访问 80。后来我还发现是彻底关闭了防火墙。后来经研究,通过打开防火墙,配置自定义防火墙函数保存iptables策略,解决了 iptables 转发重启失效的问题;方案也提交了客户。方案稍后整理发布。

第三轮投产时,通过和一线沟通,得知客户这边的策略是生产一律关闭防火墙。so strange!但是,还得想办法不是?总不能说这个系统必须得开防火墙吧?通过研究实验和请教大神,最终搞定。整理如下。

# 进入docker容器启动tomcat
root@40f7130d7832:/usr/local/tomcat/bin# ./startup.sh 
# get tomcat对应java进程:
root@40f7130d7832:/usr/local/tomcat/bin# ps -ef | grep java
# 添加kch用户
root@40f7130d7832:/usr/local# # groupadd kch && useradd -d /kch -g kch -m kch && passwd kch
# 更改tomcat属主为kch
root@40f7130d7832:/usr/local# chown -R kch.kch tomcat
# 赋予 tomcat对应java进程 u+s 权限 (进程只能是exe,不能是脚本):普通用户访问时,临时使进程具有root权限可以绑定80端口
root@40f7130d7832:/usr/local# chmod u+s /docker-java-home/jre/bin/java
实验如下

本能就用官方 tomcat7 镜像。没有的自行 pull 一个

docker pull tomcat:7.0

默认是 8080 端口的,启动命令

docker run --name w1 -it -p 8080:8080  tomcat:7.0 /bin/bash

这里我们需要绑定 80 端口,所以启动命令见下文,且需要修订 server.xml,把 tomcat 的端口由 8080 改为 80;

启动 Tomcat 镜像
ChinaDreams:workspace kangcunhua$ docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
....
tomcat                              7.0                 3402a4bb8ae6        4 months ago        357MB
....
ChinaDreams:workspace kangcunhua$ docker run --name www -it -p 80:80  tomcat:7.0 /bin/bash
root@40f7130d7832:/usr/local/tomcat# cd bin
root@40f7130d7832:/usr/local/tomcat/bin# ./startup.sh
root@40f7130d7832:/usr/local/tomcat/bin# ps -ef | grep java
root        12     1 37 15:12 pts/0    00:00:05 /docker-java-home/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root        56     1  0 15:12 pts/0    00:00:00 grep java
root@40f7130d7832:/usr/local/tomcat/bin# curl localhost:8080

...
root@40f7130d7832:/usr/local/tomcat/bin#

get 到 tomcat 的进程(exe):/docker-java-home/jre/bin/java。注:这里查询记下来的,必须是进程(exe),不能是脚本。后续有用;

修改 server.xml
ChinaDreams:workspace kangcunhua$ docker cp www:/usr/local/tomcat/conf/server.xml .
ChinaDreams:workspace kangcunhua$ vi server.xml 
ChinaDreams:workspace kangcunhua$ docker cp server.xml www:/usr/local/tomcat/conf/

将默认的 8080 改成 80
找到


修改为


新建 prms 用户

对应容器已新建 prms 用户

root@40f7130d7832:/usr/local# # groupadd kch && useradd -d /kch -g kch -m kch
root@40f7130d7832:/usr/local# # passwd kch
更改 tomcat 属主
root@40f7130d7832:/usr/local# ls -la
drwxr-sr-x 14 root staff 4096 Dec 18 15:12 tomcat
root@40f7130d7832:/usr/local# chown -R kch.kch tomcat
root@40f7130d7832:/usr/local# ls -la
drwxr-sr-x 20 kch  kch   4096 Dec 18 15:22 tomcat
root@40f7130d7832:/usr/local#

启动
发现可以正常启动,但是不能访问80端口;

$ ./startup.sh
...
Tomcat started.
$ curl localhost
curl: (7) Failed to connect to localhost port 80: Connection refused
$ ./shutdown.sh
修订 java 的属主
root@40f7130d7832:/usr/local# ls -la /docker-java-home/jre/bin/java
-rwxr-xr-x 1 root root 6408 May 19  2017 /docker-java-home/jre/bin/java
root@40f7130d7832:/usr/local# chmod u+s /docker-java-home/jre/bin/java
root@40f7130d7832:/usr/local# ls -la /docker-java-home/jre/bin/java
-rwsr-xr-x 1 root root 6408 May 19  2017 /docker-java-home/jre/bin/java
启动 tomcat

正常启动,且可以访问 80 端口

通过浏览器http://localhost也可以访问,看到tomcat首页;

root@40f7130d7832:/usr/local# su kch
$ ./startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
$ curl localhost


...
$
收尾 提交镜像
docker commit www tomcat-bind80:7.0
提交 dockerhub
ChinaDreams:workspace kangcunhua$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
tomcat-bind80                               7.0                 c6e1013adaf9        6 seconds ago       374MB
ChinaDreams:workspace kangcunhua$ docker tag c6e1013adaf9 aninputforce/tomcat7-bind80:latest
ChinaDreams:workspace kangcunhua$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
tomcat-bind80                               7.0                 c6e1013adaf9        2 minutes ago       374MB
aninputforce/tomcat7-bind80                 latest              c6e1013adaf9        2 minutes ago       374MB
ChinaDreams:workspace kangcunhua$ docker push aninputforce/tomcat7-bind80
使用镜像
ChinaDreams:workspace kangcunhua$ docker pull aninputforce/tomcat7-bind80
ChinaDreams:workspace kangcunhua$ docker run --name www -it -p 80:80 aninputforce/tomcat7-bind80 /bin/bash
root@ff63d8ac4776:/usr/local/tomcat# su kch
$ pwd
/usr/local/tomcat
$ cd bin
$ ./startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
$ curl localhost


....
参考链接

Is there a way for non-root processes to bind to “privileged” ports on Linux?请添加链接描述

Bye
这几篇笔记写完。对linux的认识更加深刻了。不过对于80端口的绑定,被真实商业环境折磨许久,研究分析实现了种种可能。后续或许会追加笔记为“茴香豆系列” :)

51Reboot  K8s专场分享

时间:2019年1月4号21:00-22:00​

分享讲师:GY 老师

​10年一线软件开发经验,先后经历了传统安全公司,以及多家互联网公司;在安全开发方面,曾开发过 Linux 防火墙、web 应用防火墙、Linux 安全内核加固,基于大流量的 Web 安全威胁分析等项目;在互联网公司工作时,曾基于 DPDK 高性能网络开发框架开发过基于全流量的网络流量分析平台和基于 Sflow 网络流量分析平台,基于 Golang 开发 SmartDNS 等;开发语言也是从C -> python -> golang 的转变过程?现从事基于 K8S 和 Docker在私有云平台建设方面的研发工作;具备丰富的Linux系统开发经验、网络开发经验以及项目管理经验;目前开发工作 90+% 都在用 Golang,Golang 是一门简洁、高效、强大且灵活的编程语言。

参与方式:添加小助手wechat:18310139238,备注:公开课,拉入直播分享群与老师互动

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27669.html

相关文章

  • Docker 快速验证转发 Tomcat 绑定 80 端口

    摘要:重启后,不但转发策略失效,重新执行转发命令后仍旧不能访问。方案稍后整理发布。第三轮投产时,通过和一线沟通,得知客户这边的策略是生产一律关闭防火墙。不过对于端口的绑定,被真实商业环境折磨许久,研究分析实现了种种可能。 前言 之前写过 tomcat 单机多实例,最后解决 80 端口访问用的是 iptables 转发; 第三轮投产前,客户做了迁移和扩容。重启后,不但转发策略失效,重新执行转发...

    DevTTL 评论0 收藏0
  • docker入门实战笔记

    摘要:创建用户组并添加用户。默认情况下是过滤掉所有的入站规则。初始命令表示一旦容器启动,需要运行的命令,此时使用,表示什么也不做,只需进入命令行即可。1.什么是docker  docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解.  Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;...

    Tecode 评论0 收藏0
  • 利用ELK搭建Docker容器化应用日志中心

    摘要:概述应用一旦容器化以后,需要考虑的就是如何采集位于容器中的应用程序的打印日志供运维分析。 showImg(https://segmentfault.com/img/remote/1460000014146680); 概述 应用一旦容器化以后,需要考虑的就是如何采集位于Docker容器中的应用程序的打印日志供运维分析。典型的比如 SpringBoot应用的日志 收集。本文即将阐述如何利...

    周国辉 评论0 收藏0
  • 利用ELK搭建Docker容器化应用日志中心

    摘要:概述应用一旦容器化以后,需要考虑的就是如何采集位于容器中的应用程序的打印日志供运维分析。 showImg(https://segmentfault.com/img/remote/1460000014146680); 概述 应用一旦容器化以后,需要考虑的就是如何采集位于Docker容器中的应用程序的打印日志供运维分析。典型的比如 SpringBoot应用的日志 收集。本文即将阐述如何利...

    channg 评论0 收藏0
  • Docker中配置Nginx与PHP

    摘要:后台运行容器后面的那个就是镜像的名称了启动配置的配置文件下面贴出我的配置这个我在主机的文件中配置的指向,其实就是访问的本机端口。 最近在学docker,顺便配置了一下docker中的nginx与php,发现网上的关于docker中配置nginx与php的资料很少,而且有的也很旧,没有太多的参考性,所以决定自己写一篇,分享一下其中的经验。 版本说明 docker: Version 17...

    王晗 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<