以下为你详细介绍使用 Docker 构建包含 Tomcat 的镜像,给镜像打标签,以及将其推送到 Docker Hub 远程仓库和本地私有仓库的完整步骤和示例。
1. 准备工作
确保 Docker 已经安装并正常运行。
若要推送到 Docker Hub,需提前注册 Docker Hub 账号;若要使用本地私有仓库,要先完成本地仓库的搭建。
创建一个项目目录,例如
tomcat-app
,后续构建相关文件都会放在此目录下。
2. 编写 Dockerfile
在 tomcat-app
目录下创建 Dockerfile
,以下是一个基本的构建 Tomcat 镜像的 Dockerfile
示例:
收起
Dockerfile
# 使用官方 Tomcat 基础镜像
FROM tomcat:9.0
# 删除 Tomcat 自带的示例应用
RUN rm -rf /usr/local/tomcat/webapps/*
# 将本地的 WAR 包复制到 Tomcat 的 webapps 目录下
COPY your-app.war /usr/local/tomcat/webapps/
# 暴露 Tomcat 默认端口
EXPOSE 8080
# 启动 Tomcat
CMD ["catalina.sh", "run"]
说明:
your-app.war
是你自己的 Java Web 应用的 WAR 包,你需要将其放在tomcat-app
目录下,或者根据实际情况修改COPY
指令的源路径。
3. 构建 Docker 镜像
在 tomcat-app
目录下打开终端,执行以下命令构建 Docker 镜像:
收起
bash
docker build -t tomcat-app:1.0 .
参数解释:
-t
:用于给镜像添加标签,tomcat-app
是镜像名称,1.0
是版本号。.
:表示使用当前目录下的Dockerfile
进行构建。
构建完成后,使用以下命令查看已构建的镜像:
收起
bash
docker images
4. 推送到 Docker Hub 远程仓库
4.1 给镜像标记
给镜像添加符合 Docker Hub 规范的标签,格式为 dockerhub_username/repository_name:tag
。假设你的 Docker Hub 用户名是 yourusername
,执行以下命令:
收起
bash
docker tag tomcat-app:1.0 yourusername/tomcat-app:1.0
4.2 登录 Docker Hub
收起
bash
docker login
按照提示输入 Docker Hub 用户名和密码,登录成功后会显示登录信息。
4.3 推送镜像到 Docker Hub 仓库
收起
bash
docker push yourusername/tomcat-app:1.0
推送完成后,登录 Docker Hub 网站,在你的仓库列表中就能看到推送的镜像。
5. 推送到本地私有仓库
5.1 搭建本地私有仓库
使用 Docker 官方的 registry
镜像搭建本地私有仓库:
收起
bash
docker run -d -p 5000:5000 --restart=always --name registry registry:2
该命令会启动一个监听 5000 端口的本地私有仓库容器。
5.2 给镜像标记
为镜像添加适合本地私有仓库的标签,格式为 localhost:5000/repository_name:tag
:
收起
bash
docker tag tomcat-app:1.0 localhost:5000/tomcat-app:1.0
5.3 推送镜像到本地私有仓库
收起
bash
docker push localhost:5000/tomcat-app:1.0
推送完成后,可通过以下命令查看本地私有仓库中的镜像列表:
收起
bash
curl http://localhost:5000/v2/_catalog
6. 拉取并运行镜像(可选)
6.1 从 Docker Hub 拉取并运行
收起
bash
docker pull yourusername/tomcat-app:1.0
docker run -d -p 8080:8080 yourusername/tomcat-app:1.0
6.2 从本地私有仓库拉取并运行
收起
bash
docker pull localhost:5000/tomcat-app:1.0
docker run -d -p 8080:8080 localhost:5000/tomcat-app:1.0
通过上述步骤,你就完成了包含 Tomcat 的 Docker 镜像的构建、标记,以及向 Docker Hub 远程仓库和本地私有仓库的推送操作。之后你可以根据需求在浏览器中访问 http://localhost:8080/your-app
来验证应用是否正常运行。
另外本地镜像仓库的也需要创建账号吗,使用本地仓库上服务器的 账号就是可以的吗,也要登记吗,,添加进去
本地镜像仓库账号相关情况及操作
本地私有仓库默认情况
使用 Docker 官方的 registry
镜像搭建的本地私有仓库,默认是没有启用认证机制的,也就是不需要账号和密码就可以进行镜像的推送和拉取操作。像之前搭建本地私有仓库的命令:
收起
bash
docker run -d -p 5000:5000 --restart=always --name registry registry:2
这样启动的仓库,任何可以访问该仓库地址(localhost:5000
)的客户端都能进行操作,缺乏安全性。
为本地私有仓库添加认证
如果想要为本地私有仓库添加认证,也就是创建账号和密码,让只有授权的用户才能进行镜像的推送和拉取,可以按以下步骤操作。
1. 安装 htpasswd
工具
htpasswd
用于生成认证所需的密码文件,在不同系统上安装方式不同,以 Ubuntu 为例:
收起
bash
sudo apt-get install apache2-utils
2. 创建认证文件
在本地创建一个用于存储账号和密码的文件,例如 htpasswd
,并添加一个用户 youruser
及其密码:
收起
bash
htpasswd -Bbn youruser yourpassword > htpasswd
-B
表示使用 bcrypt 算法对密码进行加密。-b
表示在命令行中直接指定密码。-n
表示将结果输出到标准输出,这里重定向到htpasswd
文件。
3. 创建认证容器卷
为了让认证文件能被仓库容器访问,创建一个 Docker 卷来存储认证文件:
收起
bash
docker volume create auth
4. 将认证文件复制到卷中
收起
bash
docker run --rm \
-v auth:/auth \
-v "$(pwd)":/tmp \
alpine cp /tmp/htpasswd /auth/htpasswd
5. 重新启动带有认证的本地私有仓库
收起
bash
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
参数解释:
-v auth:/auth
:将之前创建的认证卷挂载到容器的/auth
目录。-e "REGISTRY_AUTH=htpasswd"
:指定使用 htpasswd 进行认证。-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
:设置认证的领域。-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
:指定认证文件的路径。
6. 登录本地私有仓库
使用刚刚创建的账号和密码登录本地私有仓库:
收起
bash
docker login localhost:5000
按照提示输入用户名 youruser
和密码 yourpassword
,登录成功后就可以进行镜像的推送和拉取操作了。
关于使用服务器账号
本地私有仓库的认证是独立于服务器系统账号的,服务器的账号不能直接用于本地私有仓库的认证。本地私有仓库的认证是基于我们为其专门创建的 htpasswd
文件中的账号和密码。所以不能使用服务器账号来进行本地私有仓库的操作,必须使用在 htpasswd
文件中创建的账号和密码。
综上所述,本地私有仓库默认无需账号,但为了安全可以添加认证机制创建账号和密码,并且这个认证与服务器账号是相互独立的。