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/

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

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

相关文章

(三)ffmpeg 解码流程以及函数介绍

一、视频解码流程 二、函数介绍 1.avformat_network_init 函数作用&#xff1a; 执行网络库的全局初始化。这是可选的&#xff0c;不再推荐。 此函数仅用于解决旧GnuTLS或OpenSSL库的线程安全问题。如果libavformat链接到这些库的较新版本&#xff0c;或者不使用它们&#…

SecureCRT通过USB-Servial ch340串口无法连接单片机

通过USB To TTL连线 STM32F103-PRO&#xff0c;烧制程序到单片机上&#xff0c;通过SecureCRT通过USB-Servial ch340串口无法链接RS232升USB转TTL连接正确 开发板连接正确 问题&#xff1a;SecureCRT串口连接没有反应 问题分析&#xff1a;1、检查ch340串口驱动 查看设备管…

TQZC706开发板教程:在ZC706上运行ADRV9371(vivado2018.3)

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件&#xff0c;我都会放在网盘里面&#xff0c;地址在本文的末尾&#xff0c;需要自行提取 在github上搜索hdl选择第一个-->选择版本-->我所使用的vivado是2018.3版本&#xff0c;所以这里我下载的…

软考 - 系统架构设计师 - 面向对象架构设计案例

问题1&#xff1a; 解决该题&#xff0c;用例和参与者要一起进行分析&#xff0c;首先看到用例 U1 和 U2 是 U3 的扩展&#xff0c;分析用例列表中的用例&#xff0c;可以分析出 U1 和 U2 是Underpaid transaction 和 Record lllegal use&#xff0c;顺序可以颠倒&#xff0c;…

分享 GoLand 2024.1 激活的方案,支持JetBrains全家桶

大家好&#xff0c;欢迎来到金榜探云手&#xff01; GoLand 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 GoLand等。这些工具被广…

【QT学习】6.控件进阶,C与C++的强制类型转换,自定义控件,qt制作一个简易播放器

1.C与C的强制类型转换 2.自定义控件 要求&#xff1a;制作一个登录页面 1.使用控件拖拽一个页面出来 使用水平布局&#xff0c;垂直布局&#xff0c;网格布局 2.建立自定义控件 1.为项目添加自定义的类 自己写一个控件 2. &#xff08;1&#xff09;创建一个Group Box容器 &a…

springboot整合shiro之——拦截路径

简介Shiro: 1.基本功能 身份认证、授权、加密、会话管理 Web支持、缓存、多线程、测试、允许一个用户假装为另一个用户的身份进行访问、记住我 2. 执行过程 分为五步&#xff1a; Subject 用户主体&#xff1a;请求的发起者&#xff0c;即访问应用的用户 Security Manager 安…

1.Hexo安装和环境搭建引导

Hexo是一个依赖于一个名为nodejs的程序 因此安装它的方式在Mac和Windows上实际上是一样的 为了在电脑上安装Hexo 需要做两件事 nodejs&#xff0c;基本上是hexo依赖运行的JavaScript框架 Node.js — Run JavaScript Everywheregit&#xff0c;是一个程序&#xff0c;用来管理电…

Traefik和HAProxy全方位对比

在面对各种现代应用部署需求时&#xff0c;选择合适的反向代理和负载均衡器至关重要。Traefik&#x1f6a6;和HAProxy&#x1f6e1;️都是领先的解决方案&#xff0c;但它们各有特点&#xff0c;适用于不同的场景。本文将从多个维度全面对比Traefik&#x1f6a6;和HAProxy&…

【C++】类和对象②(类的默认成员函数:构造函数 | 析构函数)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性及用法 析构函数 概念 析构函数的特性及用法 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的构造函…

设计模式——外观(门面)模式10

外观模式&#xff1a;能为系统框架或其他复杂业务流程封装提供一个简单的接口。 例如抽奖过程中 设计模式&#xff0c;一定要敲代码理解 调用1&#xff08;抽奖系统&#xff09; /*** author ggbond* date 2024年04月08日 10:34*/ public class Lottery {public String getId…

OpenHarmony南向开发案例:【智能门锁】

一. 简介 本demo是基于Openharmony 3.1 Beta本版开发&#xff0c;不仅可以接收数字管家应用下发的指令来控制门锁开启&#xff0c;而且还可以通过数字管家设置不同的开锁密码以及一次性密码&#xff0c;实现给临时用户一个临时密码&#xff0c;保证门户安全。当然除了开锁的功…

遍历列举俄罗斯方块的所有形状

以前玩俄罗斯方块的时候&#xff0c;就想过一个问题&#xff0c;为什么俄罗斯方块就这7种形状&#xff0c;还有没有别的形状&#xff1f;自己也在纸上画过&#xff0c;比划来比划去&#xff0c;确实就这几种形状。 继续思考一下&#xff0c;那假如是3个块组合的形状&#xff0…

网页input框自动填充问题

autocomplete 大部分查询解决办法是设置&#xff0c;autocompleteoff&#xff0c;关于autocomplete的含义&#xff0c;官网参考如下: HTML attribute: autocomplete - HTML: HyperText Markup Language | MDN 在 autocomplete 的文档中说明了 value 为 off 时&#xff0c;浏览…

双子座 Gemini1.5和谷歌的本质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【STL】list

目录 1. list的使用 1.1 list的构造 1.2 list iterator的使用 1.3 list capacity 1.4 list element access 1.5 list modifiers 1.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对比 1. list的使用 1.1 list的构造 1.2 list iterator的使用 1. begin与end为…

KVM + GFS 分布式存储

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;Glusterfs 简介 2&#xff09;Glusterfs 特点 1.3、案例环境 1&#xff09;案例环境 2&#xff09;案例需求 3&#xff09;案例实现思路 二、案例实施 2.1、安装部署 KVM 虚拟化平台 1&…

Mac的终端配置

Mac的终端配置 参考教程包管理工具 - Homebrew出现的问题用虚拟环境解决方案&#xff1a;直接将解释器的路径放过去错误方法&#xff1a;用find查找到虚拟环境安装的路径&#xff0c;其链接的是brew安装的python路径 编辑器没有报错&#xff0c;但是运行过程中仍然找不到pandas…

JavaEE初阶Day 7:多线程(5)

目录 Day 7&#xff1a;多线程&#xff08;5&#xff09;1. 死锁2. 死锁场景3. 场景二&#xff1a;两个线程&#xff0c;两把锁4. 场景三&#xff1a;N个线程&#xff0c;M把锁5. 避免死锁问题6. 内存可见性问题 Day 7&#xff1a;多线程&#xff08;5&#xff09; 回顾synchr…

Windows下使用SDKMAN对JDK(Java)进行多版本管理

Windows下使用SDKMAN对JDK&#xff08;Java&#xff09;进行多版本管理 1.背景2.基于msys2工具2.1. msys2简介2.2. 安装与配置2.2. Windows环境变量配置参考2.3 结果确认 3. 基于WSL 1.背景 前端有nvm,python有miniconda,miniforge等&#xff0c;java呢&#xff1f;java在Linu…