Dockerfile--构建centos+tomcat镜像,容器内tomcat自启

Dockerfile命令学完了,需要来写一个比较全的Dockerfile来验证一下学习的内容。


前言

首先我们需要说清楚要做的事情,通过Dockerfile文件构建镜像,并且启动镜像生成容器时保证内置tomcat是自启的。


那么我们就开始吧~

一、准备工作

为了更清楚的更明白的展示整个过程,会把相关的信息清除干净。

1. 删除环境下所有镜像

查看镜像

docker images

删除镜像

# 删除指定镜像 ID可以用空格分开,一次删除多个
docker rmi -f 镜像ID
# 如果通过镜像名删除,则需要带上tag
docker rmi -f 镜像名:tag

最后验证是否删除干净,如果有运行中容器,先暂停容器

2. 删除所有容器

查看运行中容器

docker ps

停止运行中容器

docker stop 容器ID

删除容器

# 删除指定容器
docker rm -f 容器ID 容器ID ...
# 删除所有容器
docker rm -f $(docker ps -qa)

3. 下载tomcat压缩包

新建干净的目录/opt/softs/docker,上传tomcat压缩包。
下载tomcat压缩包,如果不会,建议百度。
解压一下,主要是为了查看解压后名字

tar -zxvf apache-tomcat-8.5.65.tar.gz

4. 下载linux环境下jdk压缩包

在刚才新建的目录/opt/softs/docker下,上传jdk包,jdk自行百度下载。
提醒下,wget下载的压缩包默认是没有授权的,不能正常使用。
解压:

tar -zxvf jdk-8u281-linux-x64.tar.gz

得到解压后的文件假的名字:jdk1.8.0_281

二、Dockerfile

1. 编写Dockerfile文件

代码如下:

# 下载镜像centos8
FROM centos:8
# 标注作者信息
MAINTAINER wang 1194966094@qq.com

# 将压缩包上传到容器内指定目录,ADD命令会自动解压
ADD apache-tomcat-8.5.65.tar.gz /usr/local/tomcat/

ADD jdk-8u281-linux-x64.tar.gz /usr/local/java
# 配置环境变量 注意,此处用到了刚才jdk解压后的文件夹名称
ENV JAVA_HOME /usr/local/java/jdk1.8.0_281
ENV PATH $JAVA_HOME/bin:$PATH

# 目录挂载
VOLUME /usr/local/tomcat/apache-tomcat-8.5.65/conf /usr/local/tomcat/apache-tomcat-8.5.65/logs /usr/local/tomcat/apache-tomcat-8
.5.65/bin

# 暴露端口 8080 是tomcat默认端口
EXPOSE 8080

# 为什么要使用catalina.sh呢?因为docker要至少有一个前置服务,不然docker会默认没有服务,会自动关闭
CMD /usr/local/tomcat/apache-tomcat-8.5.65/bin/catalina.sh run

2.构建镜像

保存Dockerfile文件
执行构建镜像命令:

docker build -t centos-tomcat:1.0 .

此时会看到一层一层的镜像构成,我们知道其实docker的镜像是按照层级来分的,所以在编写Dockerfile的时候,我们也要注意,命令行进行不要分太多层级。
给个示意图吧:
在这里插入图片描述

其实从上图中,我们也可以看到docker分层的概念,不知道是不是类似于套娃,等有时间可以研究一下。

3. 启动镜像

我们首先来查看生成的镜像
在这里插入图片描述
启动镜像

# -P是指宿主机随机端口与容器中端口 8080 进行映射
docker run -d -P --name tomcat01 centos-tomcat:1.0

查看容器进程
在这里插入图片描述
如果要查看容器的详情

docker inspect 容器ID

信息比较多,就先不展示了,可以自己试下。
好吧,我们重点讲下MountsNetworkSettings

Mounts

"Mounts": [
            {
                "Type": "volume",
                "Name": "d320041ccbe4a3c5f04a06230eebaff9e071c52703eea8b64d51927e533c23d6",
                "Source": "/var/lib/docker/volumes/d320041ccbe4a3c5f04a06230eebaff9e071c52703eea8b64d51927e533c23d6/_data",
                "Destination": "/usr/local/tomcat/apache-tomcat-8.5.65/bin",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "27765bfca23ac6f6285a2905544053e1e3e847779afc9d982003b073a26acd93",
                "Source": "/var/lib/docker/volumes/27765bfca23ac6f6285a2905544053e1e3e847779afc9d982003b073a26acd93/_data",
                "Destination": "/usr/local/tomcat/apache-tomcat-8.5.65/conf",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "54fcca8a0a62bbb0154cc4fcdf8cbfe486660fb75f32aeb7426e087f0347e429",
                "Source": "/var/lib/docker/volumes/54fcca8a0a62bbb0154cc4fcdf8cbfe486660fb75f32aeb7426e087f0347e429/_data",
                "Destination": "/usr/local/tomcat/apache-tomcat-8.5.65/logs",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

Source指的是宿主机目录
Destination指的是容器内目录
可以进入Source目录看下,是否挂载成功。同时,也可以修改配置看下,容器内文件是否修改,然后重启是否生效。不再一一尝试。

NetworkSettings

"NetworkSettings": {
            "Bridge": "",
            "SandboxID": "f3da6df9e5acd806f308f43189f752c8e104963dd92cba23b6a31c403977520b",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8080/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "49154"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "49154"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/f3da6df9e5ac",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "95d370f3059c9a26d5c244e8decab9a430da816678eeced88afad6d3acd4b9a6",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "29566123a9aec320125306dad6add56b6a0c502d2256df7a98a3880a19539f5e",
                    "EndpointID": "95d370f3059c9a26d5c244e8decab9a430da816678eeced88afad6d3acd4b9a6",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }

以上:
Ports节点,可以看到容器与宿主机的端口映射信息
Networks节点,可以查看网络配置情况,bridge代表网桥,Gateway即网关地址,一般默认情况是docker给宿主机分配的IP地址,即docker0的地址。IPAddress是容器与宿主机通过网桥建立连接后分配的地址。如果我们要访问容器内部服务可以通过IPAddress+Ports。不过,因为我们做了端口映射,所以,在目前阶段我们可以直接访问宿主机地址来验证容器内部服务是否自启成功。

详细的网络配置和应用,后续再说。我们先看验证下tomcat服务是否自启成功:
# 在宿主机测试 49154表示NetworkSettings.Ports.HostPort
curl http://localhost:49154

也可以在浏览器地址栏输入:http://宿主机地址:端口,可以看到tomcat首页。


总结

  1. 一个完成的Dockerfile文件创建成功了。
  2. 容器内部tomcat自启创建成功了。
  3. 通过外部的端口映射容器内端口,访问测试成功了。
  4. Dockerfile的创建还是需要多多练习,并且根据自己的业务需要进行编写。
  5. 加油加油加油,努力努力努力。(有点传销的感觉了~)
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值