Docker 搭建 JavaWeb 运行环境镜像(JDK7-Tomcat7)

Posted by cl9000 on May 28, 2021

每天做一件自己害怕的事。——<埃莉诺·罗斯福>

Docker 手动方式 搭建 JavaWeb 运行环境镜像(JDK7-Tomcat7)

前提条件

安装Docker。
下面示例以在 Mac 上的 Docker 演示,以 CentOS 为例

手动构建 Docker 镜像方式

下载镜像

下载官方 CentOS 镜像 官方 CentOS 镜像 hub.docker
找到 Tag,安装指定版本,复制安装镜像命令,例如 $ docker pull centos:7
执行完毕,使用以下命令查看本地所有的镜像:
$ docker images
结果如下:

1
2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos centos7 8652b9f0cb4c 6 months ago 204MB

如果输出以上,即代表下载成功,我们就可以使用该镜像了。下面我们启动容器

软件下载地址

(推荐官网,下面也是官网下载转存可直接使用)

【apache-tomcat-7.0.109.tar.gz】链接: https://pan.baidu.com/s/1zbQFvCjdCj6af8E3PQEhFg 密码:uw1d
【jdk7u79linuxx64.tar.gz】链接:https://pan.baidu.com/s/1QjXLbtx-eWKYPylkd7aSbQ 密码:xp49

并在本机创建 ~/Desktop/docker/software/ 目录,将下载JDK + Tomcat 压缩包文件放入目录,以便后面挂载

启动容器

容器是在镜像的基础上来运行的,容器启动了,我们就可以登录到容器中,安装自己所需的软件或应用程序。
使用以下命令即可启动容器:

1
2
3
4
5
6
7
8
docker run -i -t -v ~/Desktop/docker/software/:/mnt/software/ 8652b9f0cb4c(纯净centos容器ID) /bin/bash

命令分解
docker run <相关参数> <镜像 ID> <初始命令>
相关参数包括:
-i:表示以“交互模式”运行容器
-t:表示容器启动后会进入其命令行
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

假设我们的所有安装程序都放在了宿主机的/docker/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。

需要说明的是,不一定要使用 镜像 ID,也可以使用 仓库名:标签名,例如:centos:centos7

初始命令表示一旦容器启动,需要运行的命令,此时使用 /bin/bash,表示什么也不做,只需进入命令行即可。
进入命令行查看:$ ls -ll

安装软件 JDK + Tomcat

为了搭建 Java Web 运行环境,我们需要安装 JDKTomcat

软件下载地址(推荐官网,下面也是官网下载转存可直接使用,参考上面软件现在地址,并存至本机指定目录)

下面的(exit命令前)过程均在 容器内部 进行。我们不妨选择 /opt/ 目录作为安装目录,首先需要通过 $ cd /opt/ 命令进入该目录。

JDK

使用命令 解压 JDK 程序包 并重命名 JDK 目录:

1
tar -zxf /mnt/software/jdk7u79linuxx64.tar.gz -C . && mv jdk1.7.0_79/ jdk/

Tomcat

使用命令 解压 Tomcat 程序包 并重命名 Tomcat 目录:

1
tar -zxf /mnt/software/apache-tomcat-7.0.109.tar.gz -C . && mv apache-tomcat-7.0.109/ tomcat/

设置环境变量

编辑 .bashrc 文件

1
vi ~/.bashrc

然后,在文件末尾添加如下配置:

1
2
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME

使用 source 命令,让环境变量立马生效:

1
source ~/.bashrc

编写运行脚本

我们需要编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat,具体过程如下:

创建运行脚本命令: <这里容易出错了!!!在 ~目录下执行>

1
vi /root/run.sh

脚本内容如下:

1
2
3
#!/bin/bash
source ~/.bashrc
sh /opt/tomcat/bin/catalina.sh run

注意: 这里必须先加载环境变量,然后使用 Tomcat 的运行脚本来启动 Tomcat 服务。
为运行脚本添加执行权限:

1
2
3
ls -ll
chmod u+x /root/run.sh
ls -ll

退出容器 exit

当以上步骤全部完成后,可使用 exit 命令,退出容器。

随后,可使用如下命令查看正在运行的容器:

1
docker ps

此时,您应该看不到任何正在运行的程序,因为刚才已经使用 exit 命令退出的容器,此时容器处于停止状态,可使用如下命令查看所有容器:

1
docker ps -a

输出如下内容:

1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
2abcd201f871 8652b9f0cb4c "/bin/bash" 9 minutes ago Exited (127) 13 seconds ago adoring_ellis

记住以上 CONTAINER ID(容器 ID),随后我们将通过该容器,创建一个可运行 Java Web 的镜像。

创建 Java Web 镜像

使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:

1
docker commit 8652b9f0cb4c cl9000/javaweb:v1

该容器的 ID 是 57c312bbaad1,所创建的镜像名是 cl9000/javaweb:v1,随后可使用镜像来启动 Java Web 容器。

启动 Java Web 容器

首先使用 $ docker images命令,查看当前所有的镜像:

1
2
3
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cl9000/javaweb v1 1c8483e68cf9 9 seconds ago 525MB
centos centos7 8652b9f0cb4c 6 months ago 204MB

可见,此时已经看到了最新创建的镜像 cl9000/javaweb:v1,其镜像 ID 是 1c8483e68cf9
我们可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,我们现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:

1
2
3
4
5
6
docker run -d -p 58080:8080 --name javaweb cl9000/javaweb:v1 /root/run.sh
稍作解释:

-d:表示以“守护模式”执行 /root/run.sh 脚本,此时 Tomcat 控制台不会出现在输出终端上。
-p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
--name:表示新容器名称,用一个有意义的名称命名即可。

关于 Docker 网桥的内容,需要补充说明一下。
实际上 Docker 在宿主机与容器之间,搭建了一座网络通信的桥梁,我们可通过宿主机 IP 地址与端口号来映射容器内部的 IP 地址与端口号

当运行以上命令后,会立即输出一长串 容器 ID,我们可通过 $ docker ps 命令来查看当前正在运行的容器,输出如下:

1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
51b562e7833b cl9000/javaweb:v1 "/root/run.sh" 13 seconds ago Up 12 seconds 0.0.0.0:58080->8080/tcp javaweb

验证

在浏览器中,输入以下地址,即可访问 Tomcat 首页:

1
http://localhost:58080/

注意: 这里使用的是宿主机的 IP 地址,与对外暴露的端口号 58080,它映射容器内部的端口号 8080。

使用 Dockerfile 构建镜像 方式

我们在Mac本机桌面新建 /docker/Docker/目录,编写一个 Dockerfile 文件,随后使用 $ docker build 命令也可完成以上所有的手工构建操作。
将下载的 jdk+tomcat压缩包, 也复制至于 Dockerfile 同级目录

Dockerfile 文件脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#################################################################################
# 指定基础镜像,并且必须是第一条指令
FROM centos:centos7

# 指明该镜像的作者和其电子邮件
MAINTAINER cl9000 "cl9000@126.com"

# 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
#WORKDIR /opt/docker

# 安装 wget
#RUN yum install -y wget

# 一个复制命令,把jdk安装文件复制到镜像中,语法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相对路径
# 安装 JDK
# 第一种写法 jdk和Dockerfile同级目录就使用下路径,否者使用相对路径
ADD jdk7u79linuxx64.tar.gz /opt/docker/
RUN mv /opt/docker/jdk1.7.0_79/ /opt/docker/jdk1.7/
#第二种写法
#RUN tar xzf jdk7u79linuxx64.tar.gz -C /opt/docker/jdk1.7/
# && rm -rf jdk7u79linuxx64.tar.gz

# 安装 tomcat
ADD apache-tomcat-7.0.109.tar.gz /opt/docker/
RUN mv /opt/docker/apache-tomcat-7.0.109/ /opt/docker/tomcat7/

# 配置环境变量
ENV JAVA_HOME=/opt/docker/jdk1.7
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH

# 开启内部服务端口
#EXPOSE 8080

# 启动tomcat服务器
CMD ["./opt/docker/tomcat7/bin/catalina.sh","run"]
#&& tail -f /opt/docker/tomcat7/logs/catalina.out

# 容器启动时需要执行的命令
#CMD ["java","-version"]

#################################################################################

使用 Dockerfile 构建 - 相关命令

构建

1
docker build -t cl9000/javaweb2:v1 .

. 表示 Dockerfile 在当前文件夹下,也可使用绝对路径(/path/Dockerfile)来表示

运行容器

1
docker run -it  -p 58081:8080 --name=javaweb-test cl9000/javaweb2:v1

浏览器验证

1
http://localhost:58081/   正常访问 Tomcat 即可

手动构建镜像 - 相关命令汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#################################################################################
docker ps
docker ps -a
docker images
docker run -i -t -v ~/Desktop/docker/software/:/mnt/software/ 8652b9f0cb4c(纯净centos容器ID) /bin/bash
ls -ll
cd opt/
tar -zxf /mnt/software/jdk7u79linuxx64.tar.gz -C .
mv jdk1.7.0_79/ jdk/
tar -zxf /mnt/software/apache-tomcat-7.0.109.tar.gz -C .
mv apache-tomcat-7.0.109/ tomcat/
vi ~/.bashrc
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME
source ~/.bashrc
vi /root/run.sh <这里容易出错了!!!在 ~目录下执行>
#!/bin/bash
source ~/.bashrc
sh /opt/tomcat/bin/catalina.sh run
chmod u+x /root/run.sh
exit
docker ps
docker ps -a
docker commit 8652b9f0cb4c cl9000/javaweb:v1
docker images
docker run -d -p 58080:8080 --name javaweb cl9000/javaweb:v1 /root/run.sh
docker ps
#################################################################################

相关资源

【apache-tomcat-7.0.109.tar.gz】链接: https://pan.baidu.com/s/1zbQFvCjdCj6af8E3PQEhFg 密码:uw1d
【jdk7u79linuxx64.tar.gz】链接:https://pan.baidu.com/s/1QjXLbtx-eWKYPylkd7aSbQ 密码:xp49

相关命令行图

手动构建图

docker_jdk7_tomcat7_1
docker_jdk7_tomcat7_2

Dockerfile构建图

docker_Dockerfile_1

参考

Docker资源

Docker官方英文资源:

docker 官网:http://www.docker.com
Docker windows入门:https://docs.docker.com/windows/
Docker Linux 入门:https://docs.docker.com/linux/
Docker mac 入门:https://docs.docker.com/mac/
Docker 用户指引:https://docs.docker.com/engine/userguide/
Docker 官方博客:http://blog.docker.com/
Docker Hub: https://hub.docker.com/
Docker开源: https://www.docker.com/open-source

Docker中文资源:

Docker中文网站:http://www.docker.org.cn
Docker入门教程: http://www.docker.org.cn/book/docker.html
Docker安装手册:http://www.docker.org.cn/book/install.html
一小时Docker教程 :https://blog.csphere.cn/archives/22
Docker纸质书:http://www.docker.org.cn/dockershuji.html
DockerPPT:http://www.docker.org.cn/dockerppt.html

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!