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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——基于单链表实现通讯管理系统

文章目录 一、前言SList.hSList.c 二、通讯录的实现通讯录项目Contact.h载入数据初始化通讯录添加通讯录数据通过姓名查找联系人删除通讯录数据展示通讯录数据查找通讯录数据修改通讯录数据保存通讯录销毁通讯录数据 三、所有源代码Contact.hContact.cSList.hSList.ctest.c 一、…

Sonar+postsql的安装配置,centos7.9系统

1.安装postsql15 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql15-server sudo service postgresql-15 initdb sudo chkconfig postgresql-15 on sudo servic…

[StartingPoint][Tier2]Included

LXD https://www.hackingarticles.in/lxd-privilege-escalation/ Task 1 What service is running on the target machine over UDP? &#xff08;目标机器上通过UDP运行的服务是什么&#xff1f;&#xff09; $ nmap -sU 10.129.232.86 -p 69 tftp Task 2 What class o…

每日一博 - 重新定义JAR中的类或方法

文章目录 概述方式一 &#xff1a; 项目覆写相同包结构的类方式二&#xff1a; 魔改Jar包中的类方案对比方案一&#xff1a;在项目中新增第三方包路径方案二&#xff1a;替换JAR包中的类文件 概述 在一些情况下&#xff0c;我们可能需要定制第三方库的行为&#xff0c;但却无法…

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 &#xff08;一 &#xff09;上传 &#xff08;二&#xff09;解压 二、修改配置文件 &#xff08;一&#xff09;配置workers文件 &#xff08;二&#xff09;配置hadoop-env.sh文件 &#xff08;三&#xff09;配置core-site.xml文件 &…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域&#xff0c;了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术&#xff0c;我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库&#xff0c;构建了两个常用的分类模型&#xff…

自定义创建真实项目vue2项目

1. 创建 vue create 项目名 2. 选择自定义 3. 勾选以下必备选项 4.选择使用vue2 5. 选择哈希模式&#xff08;n&#xff09;; css选择Less 6. ESLint校验 选择 7. 保存&#xff08;按照默认&#xff09; 8. 在哪里添加ESLint文件 9. 要不要把这个改成将来的预设&am…

底层开发必知的三个内存结构概念

大家好&#xff0c;今天给大家介绍底层开发必知的三个内存结构概念&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在底层开发中&#xff0c;以下是三个关键的内存结构概念&…

linux进阶篇:性能监控工具——vmstat命令详细讲解

Linux性能监控工具&#xff1a;vmstat命令详细讲解 vmstat是Virtual Meomory Statistics&#xff08;虚拟内存统计&#xff09;的缩写&#xff0c;可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计&#xff0c;不足之处是无法对某个进程进行深入分析…

【Godot4.2】CanvasItem绘图函数全解析 - 7.自定义节点TextBoard

概述 之前发布的几篇文章几乎阐述了CanvasItem绘图函数最基础的内容。 本篇结合draw_style_box()和TextParagraph类&#xff0c;自定义了一个可以自适应宽高显示多行文本&#xff0c;且带有一个样式盒作为背景的文字板节点TextBoard。 系列目录 0.概述1.绘制简单图形2.设定绘…

13 Php学习:面向对象

PHP 面向对象 面向对象&#xff08;Object-Oriented&#xff0c;简称 OO&#xff09;是一种编程思想和方法&#xff0c;它将程序中的数据和操作数据的方法封装在一起&#xff0c;形成"对象"&#xff0c;并通过对象之间的交互和消息传递来完成程序的功能。面向对象编…

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别分类效果基…

卷积神经网络(CNN)笔记——多图深入理解

梗直哥、梗直哥丶的个人空间-梗直哥丶个人主页-哔哩哔哩视频 过去十年,卷积神经网络(CNN)如同科技领域的明星,以其卓越的表现撑起了人工智能的半边天。这种创新的网络模型,不仅在计算机视觉、语音识别等传统领域大放异彩,更为人工智能的快速发展和广泛应用奠定了坚实的基础。…

【软件设计师知识点】一、计算机系统基础知识

文章目录 冯诺依曼计算机CPUCPU 的功能CPU 的组成 数据表示进制转换单位换算定点数浮点小数IEEE 754标准浮点数的运算 校验码奇偶校验码海明码循环冗余校验码&#xff08;CRC&#xff09; 指令系统指令格式寻址方式指令集指令流水线 存储系统存储器的层次化结构存储器的分类相联…

MYBATIS获取参数值

MYBATIS最核心的莫过于动态的获取各种的参数值, 为了将来更好的使用MYBATIS进行开发, 我们必须先打好 "获取参数值" 这一基础 一. MYBATIS获取参数值的两种情况: 1.${} 实质:字符串的拼接 注解:${}使用的字符串拼接的方式拼接SQL语句, 所以, 如果其中出现了字符串…

【Golang学习笔记】从零开始搭建一个Web框架(二)

文章目录 模块化路由前缀树路由 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起&#xff0c;如果要实现路由功能的拓展增强&#xff0c;那将会非常麻烦&…

Python项目移动文件夹后出现ModuleNotFoundError: No module named

文章目录 0 问题再现1 问题原因2 结局办法2.1 如果是使用编译器运行2.2 如果是在linux环境下&#xff0c;使用命令运行 0 问题再现 移动Python的项目文件夹后&#xff0c;代码出现模块引用未知的问题。 1 问题原因 移动Python项目后&#xff0c;source root&#xff08;项目…

创新者指南

创新者指南 怎么把一个模糊的想法变为成功的商业模式。在高度不确定的商业环境下&#xff0c;怎样验证创新想法是否有商业价值&#xff0c;还有怎么用较低的成本打造产品&#xff0c;并推向市场。作者为我们总结出3个有用的策略&#xff08;测试方法&#xff09;和几个关键步骤…

从零实现诗词GPT大模型:专栏内容规划

一、前情介绍 本系列文章将从头编写一个类GPT的深度学习模型&#xff0c;并在诗词数据集上进行训练&#xff0c;从而可以进行诗词创作。 本次实现的类GPT模型&#xff0c;可以在kaggle上使用免费GPU进行训练&#xff0c;并可以在自己的电脑上进行推理&#xff0c;整个学习过程…

前端vue: 使用ElementUI适配国际化

i18n介绍 i18n&#xff08;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数&#xff09;是“国际化”的简称。 前端国际化步骤 1、安装i18n插件 安装插件时候&#xff0c;注意必须指定版本号&#xff0c;不然安装会报错。 npm i vue-i1…