1. 程式人生 > >Docker部署Tomcat

Docker部署Tomcat

一、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 with26 [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.warDockerfile 在同一目錄下

常用命令

  • 查詢映象
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# 
注意點:
  1. 刪除前需要保證容器是停止的
  • 刪除映象
# 根據 映象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# 
注意點:
  1. 刪除前需要保證容器是停止的
  2. 需要注意刪除映象和容器的命令不一樣,docker rmi ID,其中 容器(rm) 和 映象(rmi)
  3. 順序需要先刪除容器
  • 宿主機拷貝
# 使用 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