1. 程式人生 > >Docker 快速驗證:不轉發讓 Tomcat 繫結 80 埠

Docker 快速驗證:不轉發讓 Tomcat 繫結 80 埠

前言

之前寫過 tomcat 單機多例項,最後解決80埠訪問用的是 iptables 轉發;

第三輪投產前,客戶做了遷移和擴容。重啟後,不但轉發策略失效,重新執行轉發命令後仍舊不能訪問80。後來我還發現是徹底關閉了防火牆。後來經研究,通過開啟防火牆,配置自定義防火牆函式儲存 iptables 策略,解決了iptables轉發重啟失效的問題;方案也提交了客戶。方案稍後整理髮布。

第三輪投產時,通過和一線溝通,得知客戶這邊的策略是生產一律關閉防火牆。so strange!但是,還得想辦法不是?總不能說這個系統必須得開防火牆吧?通過研究實驗和請教大神,最終搞定。整理如下。

# 進入docker容器啟動tomcat
[email protected]
:/usr/local/tomcat/bin# ./startup.sh # get tomcat對應java程序: [email protected]:/usr/local/tomcat/bin# ps -ef | grep java # 新增kch使用者 [email protected]:/usr/local# # groupadd kch && useradd -d /kch -g kch -m kch && passwd kch # 更改tomcat屬主為kch [email protected]:/usr/local# chown -R kch.kch tomcat # 賦予 tomcat對應java程序 u+s 許可權 (程序只能是exe,不能是指令碼):普通使用者訪問時,臨時使程序具有root許可權可以繫結80埠
[email protected]
:/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
[email protected]
:/usr/local/tomcat# cd bin [email protected]:/usr/local/tomcat/bin# ./startup.sh [email protected]:/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 [email protected]:/usr/local/tomcat/bin# curl localhost:8080 <!DOCTYPE html> ... [email protected]:/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

找到

<Connector port="8080"

修改為

 

<Connector port="80"

新建 prms 使用者

對應容器已新建 prms 使用者

[email protected]:/usr/local# # groupadd kch && useradd -d /kch -g kch -m kch
[email protected]:/usr/local# # passwd kch

更改 tomcat 屬主

[email protected]:/usr/local# ls -la
drwxr-sr-x 14 root staff 4096 Dec 18 15:12 tomcat
[email protected]:/usr/local# chown -R kch.kch tomcat
[email protected]:/usr/local# ls -la
drwxr-sr-x 20 kch  kch   4096 Dec 18 15:22 tomcat
[email protected]:/usr/local#

啟動

發現可以正常啟動,但是不能訪問80埠;

 

$ ./startup.sh
...
Tomcat started.
$ curl localhost
curl: (7) Failed to connect to localhost port 80: Connection refused
$ ./shutdown.sh

修訂 java 的屬主

[email protected]:/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
[email protected]:/usr/local# chmod u+s /docker-java-home/jre/bin/java
[email protected]:/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首頁;

 

[email protected]:/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

<!DOCTYPE html>
...
$

 

收尾

提交映象

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
[email protected]:/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

<!DOCTYPE html>
....

參考連結

Is there a way for non-root processes to bind to “privileged” ports on Linux?

Bye

這幾篇筆記寫完。對linux的認識更加深刻了。不過對於80埠的繫結,被真實商業環境折磨許久,研究分析實現了種種可能。後續或許會追加筆記為“茴香豆系列” 

​本文由作者:蠻大人  授權釋出
連結:https://opsdev.fun/2017/12/18/O1-8-07-Docker%E5%BF%AB%E9%80%9F%E9%AA%8C%E8%AF%81%E4%B8%8D%E8%BD%AC%E5%8F%91%E8%AE%A9Tomcat%E7%BB%91%E5%AE%9A80%E7%AB%AF%E5%8F%A3/
著作權歸作者所有。
轉載請聯絡作者獲得授權。

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 是一門簡潔、高效、強大且靈活的程式語言。

參與方式:掃碼新增小助手,備註:公開課,拉入直播分享群與老師互動