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

发布于:2024-04-17 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、前言

记录时间 [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 压缩包为 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/