通过实例讲解Docker:在Docker中搭建Tomcat应用

概述

在CentOS7上安装好Docker,只是一个开始,后面的路还很长。

安装完就要开始用起来,现在我们就通过几个实例来简单讲一下Docker的应用,让大家有个直观的认识。 要在容器中运行程序或应用,有两种方法: 一种是直接使用别人制作好的镜像,直接下载过来使用就可以; 一种是使用Dockerfile文件自己制作镜像。(但也是在一个基础镜像上制作)

一、在容器中运行Tomcat

先查询Docker官网上有提供哪些Tomcat版本

# docker search tomcat
NAME                          DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
tomcat                        Apache Tomcat is an open source implementati¡­   2523                [OK]                
tomee                         Apache TomEE is an all-Apache Java EE certif¡­   67                  [OK]                
dordoka/tomcat                Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base¡­   53               [OK]
bitnami/tomcat                Bitnami Tomcat Docker Image                     29                                      [OK]
kubeguide/tomcat-app          Tomcat image for Chapter 1                      27                                      
consol/tomcat-7.0             Tomcat 7.0.57, 8080, "admin/admin"              16                                      [OK]
cloudesire/tomcat             Tomcat server, 6/7/8                            15                                      [OK]
aallam/tomcat-mysql           Debian, Oracle JDK, Tomcat & MySQL              11                                      [OK]

可以根据描述来查看自己需要哪个tomcat版本。 想看这个镜像的详细信息的话,比如有哪些版本,可以使用API来获取,也可以直接打开docker.com去搜索查看。 通过网站查看详细信息的话,官方的镜像可以通过访问“https://hub.docker.com/_/镜像名"来查看,非官方的镜像可以通过访问“https://hub.docker.com/r/镜像名”来查看。

我们这里使用官方的tomcat镜像,也就是stars数最多(2523)的那个。 通过docker pull把镜像拉取到本地,如果镜像名不带上版本号,默认是获取最新版latest的。

# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
092586df9206: Pull complete 
ef599477fae0: Pull complete 
4530c6472b5d: Pull complete 
d34d61487075: Pull complete 
272f46008219: Pull complete 
12ff6ccfe7a6: Pull complete 
f26b99e1adb1: Pull complete 
21bec9c8ea28: Pull complete 
b8a32f28e27c: Pull complete 
94fdd0ba0430: Pull complete 
Digest: sha256:bb4ceffaf5aa2eba6c3ee0db46d863c8b23b263cb547dec0942e757598fd0c24
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest

已经把tomcat最新版latest下载到本地了,可以使用docker images命令查看。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              8973f493aa0a        4 days ago          508MB
hello-world         latest              fce289e99eb9        8 months ago        1.84kB

可以看到,我们已经把tomcat镜像下载到本地了,大小508MB。现在我们就可以使用docker run来运行这个tomcat镜像了。 前面我们也可以直接执行docker run命令运行镜像,docker找不到镜像时,就会去先下载镜像再运行。

# docker run -p 8080:8080 -d tomcat
84b4b9700d3a433ec5c8501b5fd83c1d0e713e37e4ee6080c82c26d941223628

-p:本地端口:容器中tomcat的端口(本地端口可以随便指定一个,不一定要跟容器中的端口对应,比如也可以写8040:8080) -d:后台运行容器

运行后,我们可以打开http://ip地址:8080来访问这个tomcat应用(如果本地指定的是8040,那么地址就是http://ip地址:8040)

我们可以使用docker ps命令来查看正在运行的容器。

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
84b4b9700d3a        tomcat              "catalina.sh run"   46 minutes ago      Up 46 minutes       0.0.0.0:8080->8080/tcp   xenodochial_golick

CONTAINER ID:容器的ID号,我们起停容器、删除容器都可以使用这个ID IMAGE:使用的镜像名 COMMAND:容器内应用执行的命令 CREATED:容器制作的时长 STATUS:容器的状态,一般有UP、EXIT。还有运行时长。 PORTS:本地端口对应容器内部端口 NAMES:容器的名称,我们前面执行docker run时没有指定容器名称,默认会随机分配一个名称。

docker ps也可以加上-a参数,查看所有的容器(正在运行的,还有退出的) # docker ps -a

容器正常运行后,我们就可以使用docker exec命令进入到这个容器内部进行操作。

# docker exec -it 容器ID或者容器名称  bash
# docker exec -it 84b4b9700d3a bash
root@84b4b9700d3a:/usr/local/tomcat# hostname
84b4b9700d3a

容器主机名默认是容器的ID号。 因为容器的基础架构就是一个精简的Linux系统,所以容器内可以执行大部分的Linux命令。

root@84b4b9700d3a:/# cat /etc/issue
Debian GNU/Linux 9 \\n \\l

root@84b4b9700d3a:/# ls /
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var

前面我们使用docker run运行镜像时,参数比较简单,比如没有设置容器的名称,也没有做其它的设置。 但一般生产中,我们会需要更复杂的设置,使我们管理和使用起来更方便。 比如我们可以设置一个好记的容器名称,可以把本地的目录挂载到容器内。

# docker run --name tomcat -p 8080:8080 -v /opt/tomcat/test:/usr/local/tomcat/webapps/test -d tomcat 命令说明: -p 8080:8080:本地主机端口:容器内tomcat的端口 -v /opt/tomcat/test:/usr/local/tomcat/webapps/test:将本地主机目录/opt/tomcat/test挂载到容器的/usr/local/tomcat/webapps/test上。这样你只要把代码存放进本地主机的目录/opt/tomcat/test中就可以了。

除了目录挂载进容器中,我们还可以使用docker cp命令把本地主机上的目录或文件复制进容器内。 # docker cp /tmp/test.html 84b4b9700d3a:/usr/local/tomcat/ 把本地主机上的/tmp/test.html复制进一个容器ID为84b4b9700d3a的/usr/local/tomcat/内。

复制完,我们可以进容器内看看是否成功。

# docker exec -it 84b4b9700d3a bash
root@84b4b9700d3a:/usr/local/tomcat# ls -la test.html
-rw-r--r-- 1 root root 0 Sep 24 07:59 test.html