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
信息比较多,就先不展示了,可以自己试下。
好吧,我们重点讲下Mounts
和NetworkSettings
。
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
。不过,因为我们做了端口映射,所以,在目前阶段我们可以直接访问宿主机地址来验证容器内部服务是否自启成功。
# 在宿主机测试 49154表示NetworkSettings.Ports.HostPort
curl http://localhost:49154
也可以在浏览器地址栏输入:http://宿主机地址:端口
,可以看到tomcat首页。
总结
- 一个完成的Dockerfile文件创建成功了。
- 容器内部tomcat自启创建成功了。
- 通过外部的端口映射容器内端口,访问测试成功了。
- Dockerfile的创建还是需要多多练习,并且根据自己的业务需要进行编写。
- 加油加油加油,努力努力努力。(有点传销的感觉了~)