一般部署Web應(yīng)用都需要安裝數(shù)據(jù)庫觅彰,比如 MySQL 和 Redis抢韭,MySQL 和 Redis 屬于多個Web應(yīng)用公用的系統(tǒng),所以就不需要安裝到 Docker 里了,直接在操作系統(tǒng)里安裝就好驹尼。所以,本文只講解如何在 Docker 里創(chuàng)建 Tomcat 容器并部署Web應(yīng)用庞呕,那么有人會問新翎,在 Docker 里運(yùn)行的應(yīng)用如何訪問安裝在操作系統(tǒng)里的數(shù)據(jù)庫呢?實(shí)踐證明:在 Docker 容器里運(yùn)行的Web應(yīng)用可以直接訪問安裝在操作系統(tǒng)里的數(shù)據(jù)庫(比如 MySQL 和 Redis)住练,不需要任何特殊配置地啰。
一、安裝 Docker
1. 檢查操作系統(tǒng)內(nèi)核版本
檢查操作系統(tǒng)內(nèi)核版本讲逛,據(jù)說必須是3.10及以上亏吝。
# uname -r
3.10.0-862.9.1.el7.x86_64
2. 安裝 Docker
使用 yum 命令安裝 Docker。
# yum install docker
3. 啟動 Docker
[root@localhost /]# systemctl start docker
4. 查看 Docker 版本
# docker -v
Docker version 1.13.1, build 8633870/1.13.1
5. 設(shè)置開機(jī)自啟動 Docker
# systemctl enable docker
二盏混、安裝 Tomcat 并部署WAR工程
1. 看 Docker 支持哪些版本的 Tomcat
打開 https://hub.docker.com/r/library/tomcat/ 查看 Docker 都支持哪些版本的Tocmat蔚鸥。
2. 在 Docker 里安裝 Tomcat
在 Docker 里安裝 Tomcat惜论,拉取 Tomcat 鏡像,不指定版本就是默認(rèn)安裝最新版株茶,這里安裝 8.5.35 版的来涨。
# docker pull tomcat:8.5.35
3. 查看本地鏡像
# docker images
REPOSITORY ? ? ? ? ?TAG ? ? ? ? ? ? ? ? IMAGE ID ? ? ? ? ? ?CREATED ? ? ? ? ? ? SIZE
docker.io/tomcat ? ?8.5.35 ? ? ? ? ? ? ?6759d91a032b ? ? ? ?6 days ago ? ? ? ? ?463 MB
4. 基于鏡像新建一個 Tomcat 容器并啟動
注意,命令后面的 6759d91a032b 是前面拉取的 Tomcat 鏡像ID启盛!實(shí)踐證明蹦掐,如果用鏡像名而不用鏡像ID,那么就會自動拉取最新版的鏡像使用僵闯,而不是剛才手動拉取的 8.5.35 版本的鏡像卧抗。
# docker run --name tomcat8080 -v /etc/localtime:/etc/localtime:ro -d -p 8080:8080? 6759d91a032b
其中 “-v /etc/localtime:/etc/localtime:ro” 表示讓容器使用宿主機(jī)的時間時區(qū)。
-v 標(biāo)簽為容器添加 volume鳖粟,后面的 :ro 指定該 volume 為只讀社裆。
注意:如果容器中指定的掛載目錄存在相同的文件時,會被宿主機(jī)覆蓋掉向图。
如果想把 Tomcat 的 webapps 目錄也掛載到宿主機(jī)目錄(比如掛載到 /data/webapps)泳秀,那么就是下面這樣,需要再寫個 -v 選項:
# docker run --name tomcat8080 -v /etc/localtime:/etc/localtime:ro -v /data/webapps:/usr/local/tomcat/webapps:rw -d -p 8080:8080 6759d91a032b
這時查看宿主機(jī)目錄(/data/webapps)是空的榄攀,進(jìn)入容器查看 webapps 目錄也是空的嗜傅,放一個 WAR 包應(yīng)用到宿主機(jī)目錄(/data/webapps)下,一會 WAR 包解壓生成一個同名的文件夾檩赢,說明掛載 webapps 目錄成功吕嘀。
查看容器:
# docker ps
CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NAMES
054f35167ec5 ? ? ? ?tomcat ? ? ? ? ? ? ?"catalina.sh run" ? 4 seconds ago ? ? ? Up 4 seconds ? ? ? ?8080/tcp, 0.0.0.0:8686->8686/tcp ? tomcat8080
查看宿主機(jī)時間:
# date
Wed Apr 10 10:16:45 CST 2019
進(jìn)入容器查看時間:
# docker ?exec -it ?tomcat8080 ? /bin/bash
root@054f35167ec5:/usr/local/tomcat# date
Wed Apr 10 10:16:50 CST 2019
與宿主機(jī)的時間一致。
但是 Tomcat 使用的時區(qū)還需要單獨(dú)設(shè)置一下贞瞒,否則部署在 Tomcat 里的工程取到的時間可能不是 Docker 容器的時間偶房。設(shè)置很簡單,只需在 bin 目錄下的 catalina.sh 文件里加上時區(qū)即可军浆,如下棕洋。
進(jìn)入容器:
# docker ?exec -it ?tomcat8080 ? /bin/bash
進(jìn)入 bin 目錄:
root@054f35167ec5:/usr/local/tomcat# cd bin/
root@054f35167ec5:/usr/local/tomcat/bin# ls
catalina.sh ? ? ?......
先備份一下文件 catalina.sh 文件。
因為在容器內(nèi)不能修改文件乒融,那就把容器文件拷貝到宿主機(jī)修改拍冠,修改后再拷貝到容器覆蓋原文件。
退出容器簇抵,把 Tomcat 容器 bin 目錄下的 catalina.sh 拷貝到宿主機(jī):
# docker cp tomcat8080:/usr/local/tomcat/bin/catalina.sh ./
在宿主機(jī)里編輯 catalina.sh 文件:
打開文件庆杜,找到 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS",在雙引號后面加上 “-Duser.timezone=Asia/Shanghai”(當(dāng)然要與前面內(nèi)容用空格隔開)碟摆,修改后是這樣的 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Duser.timezone=Asia/Shanghai" 晃财。
保存文件,然后再拷貝到容器內(nèi):
# docker cp ./catalina.sh tomcat8080:/usr/local/tomcat/bin/
這樣就覆蓋了容器的原文件,然后重啟 Tomcat 或重啟容器断盛。
5. 查看運(yùn)行的 Tomcat 容器
# docker ps
CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ?NAMES
9653b878cac6 ? ? ? ?tomcat ? ? ? ? ? ? ?"catalina.sh run" ? 13 days ago ? ? ? ? Up 13 days ? ? ? ? ?0.0.0.0:8080->8080/tcp ? tomcat8080
不加 -a 參數(shù)只能查看到運(yùn)行中的容器罗洗,加上 -a 參數(shù)可以查看所有的容器。舉例钢猛,如果上面的 Tomcat 容器是退出(Exited)狀態(tài)伙菜,那么就需要加 -a 參數(shù)才能看到,如下:
# docker ps -a
CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? NAMES
9653b878cac6 ? ? ? ?tomcat ? ? ? ? ? ? ?"catalina.sh run" ? 9 days ago ? ? ? ? ?Exited (143) 8 days ago ? ? ? ? ? ? ? ? ? ? ? tomcat8080
啟動一個已存在的容器用 “start ?容器ID” 命令命迈,其中 “容器ID” 可以只寫前面幾位贩绕,Docker 能識別出是哪個容器即可。如下:
# docker start 965
965
再看容器已經(jīng)啟動了:
# docker ps
CONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ?NAMES
9653b878cac6 ? ? ? ?tomcat ? ? ? ? ? ? ?"catalina.sh run" ? 9 days ago ? ? ? ? ?Up 39 seconds ? ? ? 0.0.0.0:8080->8080/tcp ? tomcat8080
6. 試試用瀏覽器打開 Tomcat 界面
這時在瀏覽器輸入 IP:8080 就可訪問默認(rèn)的 Tomcat 界面了壶愤。
7. 部署Web應(yīng)用(WAR工程)
先學(xué)習(xí)下基本的操作命令淑倾。
獲取容器的長ID(tomcat8080 是容器名):
# docker inspect -f '{{.Id}}' tomcat8080
9653b878cac63b0c22500834c81b3f0d892d7e201c298d58d7cc9fdd5387492e
進(jìn)入容器(965是容器ID的前三位數(shù),當(dāng)然也可以多寫幾位征椒,只要 Docker 能唯一識別容器即可):
# docker ?exec -it ?965 ? /bin/bash
執(zhí)行后直接進(jìn)入容器娇哆,命令提示符由系統(tǒng)的轉(zhuǎn)為容器的了,root@ 后面的“9653b878cac6”是容器ID(短ID)勃救,冒號后面的“/usr/local/tomcat”是容器目錄碍讨,這個目錄是 Docker 內(nèi)的目錄不是系統(tǒng)目錄。如下:
root@9653b878cac6:/usr/local/tomcat# pwd
/usr/local/tomcat
root@9653b878cac6:/usr/local/tomcat# ls
BUILDING.txt ?CONTRIBUTING.md ?LICENSE ?NOTICE ?README.md ?RELEASE-NOTES ?RUNNING.txt ?bin ?conf ?include ?lib ?logs ?native-jni-lib ?temp ?webapps ?work
順便刪除 Tomcat 的 webapps 目錄下的所有內(nèi)容:
root@9653b878cac6:/usr/local/tomcat# cd webapps/
root@9653b878cac6:/usr/local/tomcat/webapps# ls
ROOT ?docs ?examples ?host-manager ?manager
root@9653b878cac6:/usr/local/tomcat/webapps# rm -fr *
root@9653b878cac6:/usr/local/tomcat/webapps# ls
退出容器用 exit 命令:
root@9653b878cac6:/usr/local/tomcat/webapps# exit
exit
直接回到了系統(tǒng)蒙秒,命令提示符由容器的轉(zhuǎn)為系統(tǒng)的了:
[root@localhost /]#?
下面開始部署Web應(yīng)用勃黍,很簡單就是拷貝WAR包文件到容器中。
將要部署的WAR包拷貝到 Tomcat 容器的 webapps 目錄下(命令格式是“docker cp 本地文件 容器ID:容器路徑”税肪,其中容器ID可以只寫長ID的前面幾位):
# docker cp testdocker.war 965:/usr/local/tomcat/webapps/
進(jìn)入容器看到了拷貝的WAR包文件:
# docker ?exec -it ?965 ? /bin/bash
root@9653b878cac6:/usr/local/tomcat# ls
BUILDING.txt ?CONTRIBUTING.md ?LICENSE ?NOTICE ?README.md ?RELEASE-NOTES ?RUNNING.txt ?bin ?conf ?include ?lib ?logs ?native-jni-lib ?temp ?webapps ?work
root@9653b878cac6:/usr/local/tomcat# cd webapps/
root@9653b878cac6:/usr/local/tomcat/webapps# ls
testdocker ?testdocker.war
看到這個WAR包已經(jīng)解壓了溉躲,應(yīng)用跑起來了榜田。
8. 用瀏覽器訪問部署的Web應(yīng)用
打開瀏覽器輸入 IP:8080/testdocker 就打開了部署的Web應(yīng)用界面益兄。
注意:如果掛載webapps,直接將war包放在掛載的webapps即可
Ok,完畢箭券!