Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云

本文主要是介绍Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

记录时间 [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/

这篇关于Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902038

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学