在 CentOS 7 中安装 Docker 和创建 Tomcat 容器并部署Web应用

一般部署Web应用都需要安装数据库,比如 MySQL 和 Redis,MySQL 和 Redis 属于多个Web应用公用的系统,所以就不需要安装到 Docker 里了,直接在操作系统里安装就好。所以,本文只讲解如何在 Docker 里创建 Tomcat 容器并部署Web应用,那么有人会问,在 Docker 里运行的应用如何访问安装在操作系统里的数据库呢?实践证明:在 Docker 容器里运行的Web应用可以直接访问安装在操作系统里的数据库(比如 MySQL 和 Redis),不需要任何特殊配置。

一、安装 Docker

1. 检查操作系统内核版本

检查操作系统内核版本,据说必须是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. 设置开机自启动 Docker

# systemctl enable docker

二、安装 Tomcat 并部署WAR工程

1. 看 Docker 支持哪些版本的 Tomcat

打开 https://hub.docker.com/r/library/tomcat/ 查看 Docker 都支持哪些版本的Tocmat。

2. 在 Docker 里安装 Tomcat

在 Docker 里安装 Tomcat,拉取 Tomcat 镜像,不指定版本就是默认安装最新版,这里安装 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!实践证明,如果用镜像名而不用镜像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” 表示让容器使用宿主机的时间时区。

-v 标签为容器添加 volume,后面的 :ro 指定该 volume 为只读。

注意:如果容器中指定的挂载目录存在相同的文件时,会被宿主机覆盖掉。

如果想把 Tomcat 的 webapps 目录也挂载到宿主机目录(比如挂载到 /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

这时查看宿主机目录(/data/webapps)是空的,进入容器查看 webapps 目录也是空的,放一个 WAR 包应用到宿主机目录(/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

查看宿主机时间:

# date

Wed Apr 10 10:16:45 CST 2019

进入容器查看时间:

# docker  exec -it  tomcat8080   /bin/bash

root@054f35167ec5:/usr/local/tomcat# date

Wed Apr 10 10:16:50 CST 2019

与宿主机的时间一致。

但是 Tomcat 使用的时区还需要单独设置一下,否则部署在 Tomcat 里的工程取到的时间可能不是 Docker 容器的时间。设置很简单,只需在 bin 目录下的 catalina.sh 文件里加上时区即可,如下。

进入容器:

# docker  exec -it  tomcat8080   /bin/bash

进入 bin 目录:

root@054f35167ec5:/usr/local/tomcat# cd bin/

root@054f35167ec5:/usr/local/tomcat/bin# ls

catalina.sh      ......

先备份一下文件 catalina.sh 文件。

因为在容器内不能修改文件,那就把容器文件拷贝到宿主机修改,修改后再拷贝到容器覆盖原文件。

退出容器,把 Tomcat 容器 bin 目录下的 catalina.sh 拷贝到宿主机:

# docker cp tomcat8080:/usr/local/tomcat/bin/catalina.sh ./

在宿主机里编辑 catalina.sh 文件:

打开文件,找到 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS",在双引号后面加上 “-Duser.timezone=Asia/Shanghai”(当然要与前面内容用空格隔开),修改后是这样的 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Duser.timezone=Asia/Shanghai" 。


保存文件,然后再拷贝到容器内:

# docker cp ./catalina.sh tomcat8080:/usr/local/tomcat/bin/

这样就覆盖了容器的原文件,然后重启 Tomcat 或重启容器。

5. 查看运行的 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 参数只能查看到运行中的容器,加上 -a 参数可以查看所有的容器。举例,如果上面的 Tomcat 容器是退出(Exited)状态,那么就需要加 -a 参数才能看到,如下:

# 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

再看容器已经启动了:

# 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 就可访问默认的 Tomcat 界面了。


7. 部署Web应用(WAR工程)

先学习下基本的操作命令。

获取容器的长ID(tomcat8080 是容器名):

# docker inspect -f '{{.Id}}' tomcat8080

9653b878cac63b0c22500834c81b3f0d892d7e201c298d58d7cc9fdd5387492e

进入容器(965是容器ID的前三位数,当然也可以多写几位,只要 Docker 能唯一识别容器即可):

# docker  exec -it  965   /bin/bash

执行后直接进入容器,命令提示符由系统的转为容器的了,root@ 后面的“9653b878cac6”是容器ID(短ID),冒号后面的“/usr/local/tomcat”是容器目录,这个目录是 Docker 内的目录不是系统目录。如下:

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 目录下的所有内容:

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

直接回到了系统,命令提示符由容器的转为系统的了:

[root@localhost /]# 

下面开始部署Web应用,很简单就是拷贝WAR包文件到容器中。

将要部署的WAR包拷贝到 Tomcat 容器的 webapps 目录下(命令格式是“docker cp 本地文件 容器ID:容器路径”,其中容器ID可以只写长ID的前面几位):

# docker cp testdocker.war 965:/usr/local/tomcat/webapps/

进入容器看到了拷贝的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包已经解压了,应用跑起来了。

8. 用浏览器访问部署的Web应用

打开浏览器输入 IP:8080/testdocker 就打开了部署的Web应用界面。



注意:如果挂载webapps,直接将war包放在挂载的webapps即可
Ok,完毕!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336