Docker部署Tomcat
阿新 • • 發佈:2018-12-26
一、docker安裝tomcat
注:
- tomcat 映象中已經依賴了jre,做到了開箱即用
1、搜尋tomcat映象
docker search tomcat
root@VM-0-15-debian:~# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 1905 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 51 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 49 [OK]
davidcaste/alpine-tomcat Apache Tomcat 7 /8 using Oracle Java 7/8 with… 26 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 17 [OK]
consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 16 [OK]
cloudesire/tomcat Tomcat server, 6 /7/8 15 [OK]
tutum/tomcat Base docker image to run a Tomcat applicatio… 10
meirwa/spring-boot-tomcat-mysql-app a sample spring-boot app using tomcat and My… 9 [OK]
jeanblanchard/tomcat Minimal Docker image with Apache Tomcat 8
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 7 [OK]
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 3 [OK]
amd64/tomcat Apache Tomcat is an open source implementati… 2
maluuba/tomcat7-java8 Tomcat7 with java8. 2
fabric8/tomcat-8 Fabric8 Tomcat 8 Image 2 [OK]
camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK]
99taxis/tomcat7 Tomcat7 1 [OK]
primetoninc/tomcat Apache tomcat 8.5, 8.0, 7.0 1 [OK]
swisstopo/service-print-tomcat backend tomcat for service-print "the true, … 0
jelastic/tomcat 0
oobsri/tomcat8 Testing CI Jobs with different names. 0
s390x/tomcat Apache Tomcat is an open source implementati… 0
picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 0 [OK]
trollin/tomcat 0
awscory/tomcat tomcat
我們選擇下載來自官方的映象 starts 最高的那個
docker pull tomcat
二、檢視安裝的映象
docker images
可以看到我們本機已經下載好了tomcat
root@VM-0-15-debian:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest df50c9d355cf 5 days ago 463MB
三、啟動tomcat
相關引數:
- -i:表示以“互動模式”執行容器
- -t:表示容器啟動後會進入其命令列
- -d:表示以“守護模式”執行/root/run.sh指令碼,此時 tomcat 控制檯不會出現在輸出終端上,也不會關閉ssh連線容器就終止執行
- -p:表示宿主機與容器的埠對映,此時將容器內部的 8080 埠對映為宿主機的 8080 埠,這樣就向外界暴露了 8080 埠,可通過 docker 網橋來訪問容器內部的 8080 埠了
- -v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>
- –name:表示容器名稱,自定義名稱
# 無守護程序方式啟動,此時會將tomcat控制檯輸出到終端, ctrl+c 就能終止容器執行
docker run -p 8080:8080 tomcat
# 守護程序方式啟動
docker run -d -p 8080:8080 tomcat
# 守護程序方式啟動,且自定義容器名稱
docker run -d --name mytomcat -p 8080:8080 tomcat
# 掛載方式啟動
# 將本機war包 /usr/local/auth.war 掛載到容器的 /usr/local/tomcat/webapps/auth.war
docker run -d -v /usr/local/auto.war:/usr/local/tomcat/webapps/auth.war -p 8080:8080 tomcat
供參考:一種我喜歡的啟動方式
當然聰明人肯定不會自己每次都在啟動的時候加這些配置,能在基礎映象裡面搞最好咯!
1).將系統時區掛載容器內,保證日誌列印時間一致
2).將日誌掛載到宿主機,方便檢視日誌
docker run --name tomcat-auth -p 8080:8080 -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -v /usr/local/tomcat-auth/logs:/usr/local/tomcat/logs -d tomcat
附:
上述方法用在平時測試還是可以的,生產環境還是建議使用官網推薦的方式,編寫Dockerfile:將war包和映象打包成新的映象
在當前目錄下新建Dockerfile檔案
# 建立 Dockerfile
touch Dockerfile
# 編輯 Dockerfile
vi Dockerfile
內容如下:
# 你的tomcat的映象
FROM tomcat:latest
# 作者
MAINTAINER [email protected]
# 拷貝war包放置到tomcat的webapps目錄下
COPY auth.war /usr/local/tomcat/webapps
生成新映象
# 根據當前目錄下(.)的Dockerfile檔案生成名為:tomcat-auth,且版本號為:v1.0.0的映象
docker build -t tomcat-auth:v1.0.0 .
[email protected]0-15-debian:/usr/local# docker build -t tomcat-auth:v1.0.0 .
Sending build context to Docker daemon 65.83MB
Step 1/3 : FROM tomcat:latest
---> df50c9d355cf
Step 2/3 : MAINTAINER [email protected]
---> Running in a16c8f61b4dc
Removing intermediate container a16c8f61b4dc
---> 95eb8a583a64
Step 3/3 : COPY auth.war /usr/local/tomcat/webapps
---> b48f931ab49a
Successfully built b48f931ab49a
Successfully tagged tomcat-auth:v1.0.0
[email protected]0-15-debian:/usr/local#
接著我們就可以啟動新映象了
docker run -d -p 8080:8080 tomcat-auth:v1.0.0
- 注意:
auth.war
和Dockerfile
在同一目錄下
常用命令
- 查詢映象
root@VM-0-15-debian:/usr/local# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-auth v1.0.0 b48f931ab49a 10 minutes ago 493MB
tomcat latest df50c9d355cf 6 days ago 463MB
root@VM-0-15-debian:/usr/local#
- 查詢容器
root@VM-0-15-debian:/usr/local# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b744be08cf96 tomcat "catalina.sh run" 7 minutes ago Exited (143) 2 minutes ago eager_mahavira
03a000bcee7b tomcat-auth:v1.0.0 "catalina.sh run" 15 minutes ago Exited (143) 8 minutes ago competent_dubinsky
- 進入容器
# 進入正在執行的容器內部(b744be08cf96 為正在執行的 容器ID)
docker exec -it b744be08cf96 /bin/bash
# 進入正在執行的容器內部(tomcat-auth 為正在執行的 容器名稱 NAMES)
docker exec -it tomcat-auth /bin/bash
# 檢視正在執行的容器
root@VM-0-15-debian:/usr/local# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b744be08cf96 tomcat-auth:v1.0.0 "catalina.sh run" 7 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp tomcat-auth
# 進入tomcat容器內
root@VM-0-15-debian:/usr/local# docker exec -it tomcat-auth /bin/bash
root@b744be08cf96:/usr/local/tomcat#
- 刪除容器
# 根據 容器ID 刪除容器
docker rm 03a000bcee7b
# 根據 容器名稱 刪除容器
docker rm tomcat-auth
root@VM-0-15-debian:/usr/local# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b744be08cf96 tomcat "catalina.sh run" 7 minutes ago Exited (143) 2 minutes ago eager_mahavira
03a000bcee7b tomcat-auth:v1.0.0 "catalina.sh run" 15 minutes ago Exited (143) 8 minutes ago tomcat-auth
root@VM-0-15-debian:/usr/local# docker stop tomcat-auth
tomcat-auth
root@VM-0-15-debian:/usr/local# docker rm tomcat-auth
tomcat-auth
root@VM-0-15-debian:/usr/local#
- 注意點:
-
- 刪除前需要保證容器是停止的
- 刪除映象
# 根據 映象ID 刪除映象
docker rmi df50c9d355cf
[email protected]0-15-debian:/usr/local# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-auth v1.0.0 b48f931ab49a 26 minutes ago 493MB
tomcat latest df50c9d355cf 6 days ago 463MB
tomcat 8.0-jre8 361d9e51a0d1 6 days ago 463MB
[email protected]0-15-debian:/usr/local# docker rmi 361d9e51a0d1
Untagged: tomcat:8.0-jre8
Untagged: [email protected]:0d4c72622f7b0a38591c1d6e84ebfd8a95503601a753490e914e46f8fec5256b
Deleted: sha256:361d9e51a0d117e6203161c5451fe880020eaa29eee7699c7010bd9202f92d52
Deleted: sha256:e48eb44036a317366fe5bceab444ea9395a81557970d3a82a1d103e73e4efb61
Deleted: sha256:a1ac7751afab6a1927a8248c5425c7ce694b4ab0edf8875c383416c1b2497b32
[email protected]0-15-debian:/usr/local#
- 注意點:
-
- 刪除前需要保證容器是停止的
- 需要注意刪除映象和容器的命令不一樣,docker rmi ID,其中 容器(rm) 和 映象(rmi)
- 順序需要先刪除容器
- 宿主機拷貝
# 使用 cp 命令完成和宿主機的檔案拷貝
# 將宿主機 /usr/local/auth.war 拷貝到容器的 /usr/local/tomcat/webapps下
docker cp /usr/local/auth.war b744be08cf96:/usr/local/tomcat/webapps
# 將容器 /usr/local/tomcat/webapps 拷貝到宿主機的 /usr/local/下
docker cp b744be08cf96:/usr/local/tomcat/webapps /usr/local/tomcat/
- 匯出映象
# 根據 映象ID/名稱 匯入
docker save tomcat-auth > /home/tomcat-auth.tar
root@VM-0-15-debian:/usr/local# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-auth v1.0.0 b48f931ab49a 30 minutes ago 493MB
tomcat latest df50c9d355cf 6 days ago 463MB
root@VM-0-15-debian:/usr/local# docker save tomcat-auth > /home/tomcat-auth.tar
root@VM-0-15-debian:/usr/local#
- 匯入映象
# 將tomcat-auth 匯入
docker load < /home/tomcat-auth.tar
root@VM-0-15-debian:/home# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest df50c9d355cf 6 days ago 463MB
root@VM-0-15-debian:/home# docker load < /home/tomcat-auth.tar
b832d75f420e: Loading layer [==================================================>] 30.35MB/30.35MB
Loaded image: tomcat-auth:v1.0.0
root@VM-0-15-debian:/home#
注意
1、Tomcat應用日誌時間和容器時間不一致解決辦法
原因:
1).docker容器和系統時間不一致是因為docker容器的原生時區為0時區,而國內系統為東八區
2).容器中執行的java應用打出的日誌時間和通過date -R方式獲取的容器標準時間有八個小時時間差
解決:
方法一
啟動的時候增加環境變數及時區配置
- 環境變數 Asia/Shanghai就是我所需要的時區
- 宿主機器上的時區預設覆蓋容器內的時區配置檔案
docker run --name tomcat -p 8800:8080 -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime -d tomcat
方法二
1).docker啟動容器時,為了保證容器時區和系統時區相同,需要掛載系統時間到容器內
# ro表示只讀
-v /etc/localtime:/etc/localtime:ro
2).在tomcat/bin/catalina.sh檔案中修改tomcat JAVA_OPTS,新增如下內容
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
啟動容器
docker run --name tomcat -p 8800:8080 -v /etc/localtime:/etc/localtime -d tomcat