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

news2024/10/5 18:26:13

一、前言

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

ADD jdk-8u45-linux-x64.gz /usr/local/
ADD apache-tomcat-9.0.87.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV 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/bin

EXPOSE 8080

CMD /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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1592342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树--构建二叉排序树

一、二叉排序树介绍 二叉排序树&#xff1a;对于二叉排序树的任何一个非叶子节点&#xff0c;要求左子节点的值比当前节点的值小&#xff0c;右子节点的值比当前节点的值大。 特别说明&#xff1a;如果有相同的值&#xff0c;可以将该节点放在左子节点或右子节点 二、构建有…

几分钟!你的PDF文件就可以具有仿真翻页的效果!

你是否曾经在阅读PDF文件时感到困扰&#xff0c;因为它的页面是静态的&#xff0c;无法模拟真实的翻页效果&#xff1f;现在&#xff0c;我教你一个很实用的方法&#xff1a;几分钟&#xff01;你的PDF文件就可以具有仿真翻页的效果&#xff01; 工具&#xff1a;FLBOOK在线制作…

深入理解JavaScript - JavaScript中call、apply、bind方法

一、call() / apply() JavaScript中的函数是对象&#xff0c;与其他JavaScript对象一样,JavaScript函数也有方法。其中有两个自带的方法 – call和apply&#xff0c;可以利用这两个方法来间接调用某个函数。 通过一个简单的例子体会一下call和apply的用法&#xff1a; funct…

windows下使用的的数字取证工作工具套装:forensictools

推荐一套windows下使用的的数字取证工作工具套装&#xff1a;forensictools 部分工具包括&#xff1a; ▫️exiftool&#xff0c;一个命令行应用程序和 Perl 库&#xff0c;用于读写元信息。 ▫️YARA&#xff0c;一款开源工具&#xff0c;用于对恶意软件样本进行识别和分类。…

LeetCode最长有效括号问题解

给定一个仅包含字符的字符串(’ 和 ‘)’&#xff0c;返回最长有效的长度(出色地-形成) 括号子弦。 示例1&#xff1a; 输入&#xff1a;s “(()” 输出&#xff1a;2 说明&#xff1a;最长的有效括号子字符串是 “()” 。 示例2&#xff1a; 输入&#xff1a;s “)()())…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

记一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

【C++程序员的自我修炼】拷贝构造函数

心存希冀 追光而遇目有繁星 沐光而行 目录 拷贝构造函数概念 拷贝构造的特征 无穷递归的解释 浅拷贝 总结&#xff1a; 深拷贝 拷贝构造函数典型调用场景 总结 契子✨ 在生活中总有很多琐事&#xff0c;不做不行做了又怕麻烦&#xff0c;有时候想要是有个和自己一模一样的人就…

功能测试_订购单检查_判定表

画判定表的步骤&#xff1a; 列出条件 列出动作

[大模型]Yi-6B-chat WebDemo 部署

Yi-6B-chat WebDemo 部署 Yi 介绍 由60亿个参数组成的高级语言模型 Yi LLM。为了促进研究&#xff0c;Yi 已经为研究社区开放了Yi LLM 6B/34B Base 和 Yi LLM 6B/34B Chat。 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–…

【Linux】磁盘与文件系统管理

目录 一、 磁盘结构 1. 数据结构 2. 物理结构 3. 硬盘的接口类型 二、 如何使用Linux中的磁盘 三、 文件系统 四、 磁盘分区 1. MBR分区 2. 分区的优缺点 3. 磁盘及分区的管理工具 五、格式化与挂载 1. 格式化 2. 挂载 六、实例演示 1. 演示分区格式化挂载 2. …

Springboot+Vue项目-基于Java+MySQL的旅游网站系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

OpenCV轻松入门(六)——简单图片处理【马赛克、毛玻璃、浮雕效果】

马赛克效果 马赛克指现行广为使用的一种图像&#xff08;视频&#xff09;处理手段&#xff0c;此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果&#xff0c;因为这种模糊看上去有一个个的小格子组成&#xff0c;便形象的称这种画面为马赛克。其目的通常是使之无法辨…

麒麟v10安装mysql-8.0.35

因为要修复漏洞的原因&#xff0c;这两天将麒麟v10操作系统的服务器上的MySQL版本由5.7.27升级到8.0.35&#xff08;mysql安装包下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions)&#xff09;&#xff0c;mysql的安装过程主要参考了这个博主…

Qlik在数据隐私计划中利用人工智能和分析

在技术快速变革的时代&#xff0c;政府正在努力追赶技术发展和我们日常生活中产生的个人身份信息&#xff08;“PII”&#xff09;数量不断增加的步伐。规范 PII 使用的隐私法不断加强&#xff08;Gartner估计&#xff0c;虽然到 2020 年&#xff0c;全面的隐私法将覆盖全球 10…

MQ:延迟队列

6.1场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&#xff1a; 7*30 * 60 *…

【央国企专场】——国家电网

国家电网目录 一、电网介绍1、核心业务2、电网组成 二、公司待遇三、公司招聘1、招聘平台2、考试安排2.3 考试内容 一、电网介绍 1、核心业务 国家电网公司&#xff08;State Grid Corporation of China&#xff0c;简称SGCC&#xff09;是中国最大的国有企业之一&#xff0c…

【漏洞预警】Linux kernel权限提升漏洞(CVE-2024-1086)

一、漏洞概述 漏洞名称 Linux kernel权限提升漏洞 CVE ID CVE-2024-1086 漏洞类型 Use-After-Free 发现时间 2024-03-28 漏洞评分 7.8 漏洞等级 高危 攻击向量 本地 所需权限 低 利用难度 低 用户交互 无 PoC/EXP 已公开 在野利用 未知 Netfilte…

突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

学习数通HCIE选择誉天有什么优势?

誉天数通课程亮点 课程内容详实&#xff0c;千万级实训环境 涵盖数通技术全场景热门技术&#xff0c;涉及传统园区网&#xff0c;虚拟化园区网&#xff0c;广域互联技术&#xff0c;数据中心网络&#xff0c;网络自动化运维 专业机房环境&#xff0c;全真机教学演示&#xf…