一、前言
记录时间 [2024-4-13]
系列文章简摘:
Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
Docker 学习笔记(七):介绍 Dockerfile 相关知识,使用 Dockerfile 构建自己的 centos 镜像
更多 Docker 相关文章请参考上面专栏哦,入门篇 1~5 已完结,6 开始是精髓篇:容器数据卷、Dockerfile、Docker 网络。
本文主要介绍如何使用 Dockerfile 制作 Tomcat 镜像,以及如何在 DockerHub / 阿里云上发布自己的镜像,并对 Docker 基本使用进行了总结。
二、制作 Tomcat 镜像
实战:编写 Dockerfile,制作 Tomcat 镜像。
1. 准备材料
制作 Tomcat 镜像使用的材料有:
- tomcat 压缩包
- jdk 压缩包
文章中使用的 tomcat 压缩包为 apache-tomcat-9.0.87.tar.gz
,jdk 压缩包 jdk-8u45-linux-x64.gz
,通过上面的官网链接,大家可以自行挑选适合的版本。
材料准备完毕后,通过 FinalShell 上传到 Linux 服务器中。
如图,新建 /home/yuanyuan/build/tomcat/
目录,点击右上角的图标,把 tomcat 和 jdk 的压缩包上传。
检查下是否上传成功
# pwd 确认当前目录
[root@localhost tomcat]# pwd
/home/yuanyuan/build/tomcat# ls 输出该目录下的内容
# tomcat 和 jdk 压缩包放在这个位置
[root@localhost tomcat]# ls
apache-tomcat-9.0.87.tar.gz jdk-8u45-linux-x64.gz
如果想了解 tomcat 和 jdk 压缩包的话,可以在 Linux 上尝试解压,查看压缩包里的内容。
解压方式:tar
x
:表示解压z
:表示解压.gz
格式v
:表示在解压缩时显示过程f
:表示后面跟文件名
# 命令 tar -zxvf 压缩包全称
tar -zxvf apache-tomcat-9.0.87.tar.gz
tar -zxvf jdk-8u45-linux-x64.gz
2. 制作基础镜像
制作 Tomcat 镜像需要用到基础镜像 centos,但官方的 centos 镜像停止维护了,所以需要配置一下。我们需要制作带 yum 的 centos 镜像,因为我们要用到 vim 命令,而 vim 需要通过 yum 安装。具体操作可以参考这篇文章步骤 5.4。
先运行下官方基础镜像 centos:
docker run -it centos
去查看 yum 的配置文件:
cd /etc/yum.repos.d/
把镜像替换成能用的:
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
生成缓存并完成更新:
# 生成更新缓存
yum makecache# 更新 yum
yum update -y
把这个容器 commit 提交为本地镜像,yuanyuan/centos
是笔者给新镜像的仓库命名。
不加版本号,默认是最新版。
docker commit -a="yuanyuan" -m="yum update -y to centos" 容器id yuanyuan/centos
3. 编写 Dockerfile 文件
先新建一个 readme.txt
文件,用于介绍这个镜像。
touch readme.txt
然后新建 Dockerfile 文件,注意 Dockerfile 是官方命名,是默认的,不要写错。
使用 Dockerfile 名字的优点:镜像构建(build)时会自动寻找该文件,不需要 -f
指定文件。
vim Dockerfile
编写 Dockerfile 内容:
FROM
:基础镜像用上面制作的那个;MAINTAINER
:用户名 + 邮箱;COPY
:把 readme.txt 复制到/usr/local/
目录下;ADD
:后面跟文件压缩包 + 解压路径,它会自动解压缩;RUN
:运行指令,安装vim
命令;ENV
:配置环境变量,对比 Windows,就是把 java/tomcat 使用目录添加到 PATH;WORKDIR
:容器的工作目录为/usr/local/
;EXPOSE
:暴露 8080 端口;CMD
:容器运行的默认指令,用&&
拼接两条指令,启动 tomcat 服务并打印日志。
编写完 Dockerfile 内容后,保存文件 :wq
FROM yuanyuan/centos
MAINTAINER yuanyuan<1234567@qq.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u45-linux-x64.gz /usr/local/
ADD apache-tomcat-9.0.87.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_45
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.87
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.87
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.87/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.87/logs/catalina.out
4. 构建镜像
确认工作目录:/home/yuanyuan/build/tomcat
docker build -t diytomcat .
5. 测试默认运行
默认方式运行,就是刚才 CDM 中写的命令:1. 启动 tomcat 服务;2. 打印日志。
CMD /usr/local/apache-tomcat-9.0.87/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.87/logs/catalina.out
测试一下吧
[root@localhost tomcat]# docker run diytomcat
Tomcat started.
13-Apr-2024 02:59:15.614 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/9.0.87
13-Apr-2024 02:59:15.617 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Mar 11 2024 10:12:34 UTC
13-Apr-2024 02:59:15.617 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.87.0
6. 测试复杂运行
运行镜像
我们来尝试复杂模式的运行:
-d
:后台运行;-p 宿主机端口:容器端口
:把容器的 8080 端口映射到宿主机的 9090 端口;--name 容器名字
:给容器命名;-v 宿主机目录:容器目录
:数据卷挂载,把容器中的 tomcat 的 webapps/test 和 logs 挂载到宿主机;
docker run -d -p 9090:8080 --name yuanyuan-tomcat -v /home/yuanyuan/build/tomcat/test:/usr/local/apache-tomcat-9.0.87/webapps/test -v /home/yuanyuan/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.87/logs diytomcat
完成数据卷挂载后,我们可以在宿主机对应的目录中发布 web 项目,它会自动同步到容器中。
此外,容器还可以把 tomcat 的运行日志同步到宿主机。
容器启动后,查看下 tomcat 目录,发现 test 和 tomcatlogs 目录,文件挂载成功。
ls /home/yuanyuan/build/tomcat
进入容器
docker exec -it 容器id /bin/bash
进入容器后,直接进入了它的工作目录
可以查看下里面的内容,发现 tomcat 和 jdk 文件都添加进去了。
[root@localhost tomcat]# docker exec -it 1a07737f9b2a /bin/bash
[root@1a07737f9b2a local]#
[root@1a07737f9b2a local]# ls
apache-tomcat-9.0.87 bin etc games include jdk1.8.0_45 lib lib64 libexec readme.txt sbin share src
[root@1a07737f9b2a local]# cd apache-tomcat-9.0.87
[root@1a07737f9b2a apache-tomcat-9.0.87]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
结果测试
先在本地测试一下,访问成功!
[root@localhost tomcat]# curl localhost:9090
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Apache Tomcat/9.0.87</title><link href="favicon.ico" rel="icon" type="image/x-icon" /><link href="tomcat.css" rel="stylesheet" type="text/css" /></head>
再去外网测试一下,访问成功,返回了 tomcat 页面。
注意:测试 tomcat 访问,外网测试要把防火墙打开。
http://ip地址:9090
7. 发布项目
用 jps 写一个网页,从浏览器访问。
由于配置了数据卷挂载,我们直接在本地编写项目就可以完成发布。
进入 /home/yuanyuan/build/tomcat/test
目录
在 test 目录中,新建 WEB-INF 目录,在 WEB-INF 目录中新建文件 web.xml
编写 web.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"></web-app>
然后,在 test 目录中,新建文件 index.jsp
编写 index.jsp 文件:
- 在页面上输出:
Hello World!
和-----Hello, yuanyuan-----
- tomcat 日志返回:
-----my test web logs-----
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" %>
<html><head><meta charset="UTF-8"><title>Hello, yuanyuan</title></head><body>Hello World!<br /><%out.println("-----Hello, yuanyuan-----");System.out.println("-----my test web logs-----");%></body>
</html>
在浏览器测试
我们的项目发布在 test 目录下:
http://ip地址:9090/test/
测试结果如下,项目发布成功!
Hello World!
-----Hello, yuanyuan-----
再看一下 tomcatlogs 中的日志
日志文件 catalina.out,在 /home/yuanyuan/build/tomcat/tomcatlogs
目录下:
[root@localhost tomcatlogs]# cat catalina.out
13-Apr-2024 03:10:37.892 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/9.0.87
# 访问网站就会输出日志
-----my test web logs-----
[root@localhost tomcatlogs]#
三、发布自己的镜像
1. 发布镜像到 DockerHub
注册 / 登录账号
点击官网地址,注册账号并登录。正常注册,设置邮箱,用户名和密码。注册完成后登录,然后通过邮箱验证。
就是网站加载有点慢。
修改 DockerHub 用户名
一种可能存在的情况。
注册的时候写错账号名(Username)了,怎么办?没错,这个问题笔者遇到了,搜索了一圈发现它好像没办法修改。
解决办法是:先注销,再重新注册。
当然也可以不用管,反正就是个账号名字,出于对用户名的执着,笔者还是决定修改。
注销过程也挺简单的,登录 DockerHub,先通过邮箱验证。在个人信息页面,选择 Deactivate Account 即可。
设置仓库属性
设置下仓库属性,可以选择公有(Public)/ 私有 (Private),发布的公有镜像可以被其他用户搜索到。
由于笔者尚在初学阶段,这里选择 Private 发布。
Linux 登录 DockerHub
在 Docker 中搜索登录方法:
[root@localhost ~]# docker login --help
Options:-p, --password string Password--password-stdin Take the password from stdin-u, --username string Username
使用 DockerHub 注册的用户名和密码登录
docker login -u Username -p Password
Linux 提交镜像
给待发布镜像打标签
注意 tag 前面一定要加上 DockerHub 注册的 Username,因为用户名是你的命名空间。
# docker tag your-repository/subname:tagname docker-hub-user-name/your-repository:tagname
docker tag 镜像id Username/diytomcat:1.0
然后 docker push
完成发布:发布时尽量带上版本号。
# docker push docker-hub-user-name/your-repository:tagname
docker push Username/diytomcat:1.0
可以发现,提交的时候,也是一层一层进行的。
提交成功后,可以在 DockerHub 查看。
[root@localhost ~]# docker push Username/diytomcat:1.0
The push refers to repository [docker.io/Username/diytomcat]
5f70bf18a086: Pushed
f860e6d97863: Pushed
cdaf31be8ae0: Pushed
4142f92cb195: Pushed
9a5703f78e25: Pushed
f2633ab4d549: Pushed
74ddd0ec08fa: Pushed
1.0: digest: sha256:d3575b41f94df5b7c19c5c0d6f106f6ddfec2d2ae03096e8510d5a8555555555 size: 1792
退出登录
docker logout
2. 发布镜像到阿里云
容器镜像服务
登录阿里云,找到容器镜像服务。然后在实例列表中,选择创建个人实例。
创建命名空间
个人实例创建完成后,创建命名空间,每个人最多可以创建 3 个命名空间。
创建镜像仓库
命名空间创建完成后,创建镜像仓库,自己取名字,下一步,选择本地仓库。
查看仓库的基本信息,操作指南中就是详细的使用方法。
发布镜像
这些在操作指南中很详细的,都有。
在 Linux 中登录阿里云 Docker Registry:
docker login --username=aliyun-username registry.xxx.aliyuncs.com
给待发布的镜像打标签:
docker tag ImageId 仓库公网地址:镜像版本号
发布镜像:
docker push 仓库公网地址:镜像版本号
补充移除标签方法
我们可以给同一个镜像打很多标签,这些标签的镜像 ID 都来自同一个镜像,所以 ID 是一样的,这时候我们就不能通过 ID 来删除它们了。
解决办法是:使用仓库名 + 版本号进行删除。
docker rmi repository:tag
四、总结
本文主要介绍如何使用 Dockerfile 制作 Tomcat 镜像,以及如何在 DockerHub / 阿里云上发布自己的镜像,并对 Docker 基本使用进行了总结。
如图,对 Docker 基本使用进行了总结。
一些参考资料
狂神说系列 Docker 教程:https://www.bilibili.com/video/BV1og4y1q7M4/
Docker 官方文档:https://docs.docker.com/engine/install/centos/
Docker 远程仓库:https://hub.docker.com/
FinalShell 下载:http://www.hostbuf.com/t/988.html
阿里云官网:https://www.aliyun.com/
Apache 官网:https://tomcat.apache.org/
Oracle 官网:https://www.oracle.com/