- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
一入编程深似海,从此节操是路人.
最近使用podman,就想着写一篇总结性的笔记,以备后续参考。就如同写代码,不写注释,过了一段时间可能会想这是我写的吗?不会吧,还要理一下逻辑才能读懂,不利于后期维护.
感觉整体体验下来,镜像获取、容器创建、容器监控、容器移除,和docker差不多,感觉可以作为替代品.
什么是podman ?
Podman is a utility provided as part of the libpod library. It can be used to create and maintain containers. The following tutorial will teach you how to set up Podman and perform some basic commands. 。
大意是 podman 使用libpod库提供的一部分,打造应用程序。你可以使用podman创建容器、维护容器.
每个人使用环境可能不一样,在介绍podman安装与使用时,我想先介绍自己的环境 .
个人使用环境 。
操作系统:Linux发行版Centos9-stream.
容器环境:podman 4.2.0.
测试运行服务:Maven 构建 Java web 应用程序打包成 jar.
Linux-Centos9-stream使用podman(docker)制作本地镜像,Maven构建 jar 运行并测试.
本文核心 :主要介绍podman(docker)打包本地 jar 文件,制作镜像运行测试.
准备 。
如果没有jar包环境,可以去spring官网和阿里云springboot脚手架官网在线构建demo。 spring initializr: https://start.spring.io/ 阿里云云原生应用脚手架: https://start.aliyun.com/ 。
cd demo
mvn install
scp -r target\demo-1.0.jar root@192.168.245.132:/opt/dkr/
关于podman,支持Windows、MacOS与Linux发行版,可以前往github获取更多版本安装包(exe、zip、pkg、tar.gz、source),便于在网络隔离情况下部署。如果网络环境允许,可以使用操作系统支持的安装工具进行安装,比如RHEL系列使用yum或者dnf管理工具,Debian与Ubuntu使用apt工具.
podman开源仓库: https://github.com/containers/podman 。
如果获取资源缓慢,这是正常现象,你可能需要加速一下,或者使用BT工具.
如果使用Linux发行版在线安装,可以更换国内镜像源,比如阿里云、腾讯云、华为云.
1、安装podman(docker) 。
yum install -y podman
在RHEL9中可以使用yum或者dnf命令安装服务.
查看podman版本 :podman -v 。
[root@Centos9-Stream demo]# podman -v
podman version 4.2.0
2、启动podman 。
systemctl start podman
RHEL7以及以上推荐使用systemctl命令去管理服务,使用service命令也是兼容的,用法有些区别.
设置开机自启 :systemctl enable podman 。
[root@Centos9-Stream ~]# systemctl enable podman
Created symlink /etc/systemd/system/default.target.wants/podman.service → /usr/lib/systemd/system/podman.service.
[root@Centos9-Stream ~]# systemctl status podman
○ podman.service - Podman API Service
Loaded: loaded (/usr/lib/systemd/system/podman.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sun 2023-02-26 16:56:43 CST; 2min 33s ago
...
2月 26 16:56:38 Centos9-Stream podman[3173]: time="2023-02-26T16:56:38+08:00" level=info msg="/usr/bin/podman filtering at log level info"
...
2月 26 16:56:43 Centos9-Stream systemd[1]: podman.service: Deactivated successfully.
使用命令 systemctl enable podman 设置podman服务开机自启,查看pdoman状态:systemctl status podman,发现由 disabled 转变成了enabled。如果不想开机自启,可以使用禁用命令:systemctl disable podman.
Dockerfile文件作用:个人理解,相当于路标,通过相关命令去指引我们如何前进,构建镜像.
1、打包本地jar:新建Dockerfile文件 。
将上传的 jar 文件复制到与Dockerfile同一目录,比如我演示目录在 /opt/dkr:
cp springboot-crud-0.0.1-SNAPSHOT.jar /opt/dkr/
创建Dockerfile文件:
touch Dockerfile
编辑Dockerfile文件:
vim Dockerfile
填充如下内容:
FROM openjdk:17
MAINTAINER Fisher "dywangk@gmail.com"
ADD springboot-crud-0.0.1-SNAPSHOT.jar crud-app.jar
FROM:从哪里获取到 JDK 作为运行 jar 包支撑环境,此处我获取的是 openjdk17 与 springboot 指定 jdk 版本对应上。 MAINTAINER:指定维护人。可选项,可加可不加。 ADD:添加 jar 文件。可以使用COPY替代。 RUN:顾名思义,运行。运行命令以及服务,本次测试没加上,在 podman build 时运行.
2、打包本地jar作为镜像 。
通过 podman build 命令构建本地镜像服务.
podman build -f Dockerfile -t springboot:crud-app.jar
查看images, 注意对应上IMAGE ID 。
[root@Centos9-Stream ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 4f7431dafa0a 2 hours ago 519 MB
docker.io/library/openjdk 17 5e28ba2b4cdb 9 months ago 475 MB
通过podman images命令查看images发现REPOSITORY和TAG是none,接下来会继续介绍指定TAG。 注意 :podman images 是列出本地存储镜像列表,相当于 podman image list;podman image 是用于管理镜像.
例如删除镜像
podman image rm 4f7431dafa0a
podman image rm -f 4f7431dafa0a
3、指定tag 。
使用 podman tag 命令去添加标签名,tag 后面追加 IMAGE ID 以及本地打包好的镜像.
podman tag 4f7431dafa0a srpingboot:crud-app.jar
再次查看images,发现REPOSITORY和TAG有内容了.
[root@Centos9-Stream ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/srpingboot crud-app.jar 4f7431dafa0a 2 hours ago 519 MB
docker.io/library/openjdk 17 5e28ba2b4cdb 9 months ago 475 MB
4、运行jar服务 。
使用 podman run 命令启动容器中的本地镜像服务。-p 参数,指定端口8082和传输协议TCP;--name 参数,用于指定容器名称;-it -d 参数,用于将服务置于后台;java -jar 参数, 与平时本地环境直接启动 java -jar服务是同样地命令.
podman run -p 8082:8081/tcp --name crud -it -d localhost/srpingboot:crud-app java -jar crud-app.jar
你可以再启动一个服务,端口映射到8088,注意,--name 取名不能重复,示例如下:
podman run -p 8088:8081/tcp --name crud7 -it -d localhost/srpingboot:crud-app java -jar crud-app.jar
查看运行中的服务,使用命令:podman ps 。
[root@Centos9-Stream dkr]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
920899cf9aad localhost/srpingboot:crud-app.jar java -jar crud-ap... 2 hours ago Up 2 hours ago 0.0.0.0:8082->8081/tcp crud
将8081端口映射到8082上,访问时使用端口是8082.
列出容器端口映射:podman port crud 。
[root@Centos9-Stream dkr]# podman port crud
8081/tcp -> 0.0.0.0:8082
例如:访问接口,如果你没有在controller层编写任何代码,访问显示的是404。当然这些并不重要,只需要印证podman(docker)打包本地jar包正常运行就足够了。 http://192.168.245.132:8082/thymeleaf/findCity 。
5、查看日志 查看日志命令 podman logs,后面追加IMAGE ID:920899cf9aad,IMAGE ID理解为唯一值便于检索.
podman logs 920899cf9aad
反馈结果 。
2023-02-13T12:56:21.113Z INFO 1 --- [ main] com.example.Application : Started Application in 7.021 seconds (process running for 8.49)
...
2023-02-13T12:56:59.312Z INFO 1 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms
Hibernate: select c.Name, c.CountryCode from world.city c;
可以看到使用 JPA show-sql 打印出了自己指定的SQL语句:
select c.Name, c.CountryCode from world.city c;
6、停止容器 。
采用 podman stop 命令手动停止一个或多个容器:
podman stop crud
7、启动容器 。
当容器意外宕掉或者手动停止了,此时可以使用 podman start 启动一个或多个容器:
podman start crud
8、监控容器 。
查看(监控)容器健康状态,主要分析CPU、内存负载:podman stats,使用ctrl + c 退出。如下图所示:
podman stats
当然,可以配合重定向输出到日志文件:podman stats > podman-stats.log,初次已覆盖形式;再次使用重定向输出命令:podman stats >> podman-stats.log,采用追加形式。查看日志文件内容,可以使用tail、cat、vim命令.
当然,你还可以使用 podman top 查看容器负载,示例查看最新容器状态:
podman top -l
善用podman自带帮助文档,有一定基础后这是最有效的方式,需要有一定阅读英文文档积累.
列出podman全部文档提示,示例:
podman help
man podman
只查看 podman ps 帮助文档,示例:
podman help ps
podman ps --help
闲扯 。
开始使用,感觉命令太多,哎呀记不住,怎么办?没有捷径可走,多敲几遍,自然而然记住了。主要做札记,使用笔记本记录,记录过程也是思考的过程。分类整理,容器管理,容器内镜像管理。其次靠工作经验以及平时积累总结出常用以及实用命令,熟悉后,使用podman自带的帮助文档 提高工作效率 .
只停留在看和札记上,显得很抽象,需要配合搭建环境去感受。运用越多,实际工作中越有底气.
回顾一下,制作本地镜像使用到了哪些命令。你会发现,自己实践一遍,需要掌握哪些命令,用到的还不少。仅仅通过构建本地镜像到运行,涉及到知识面有限,我并没有介绍到容器初始化(init)、连接(attach)、内容自动更新(auto-update)、提交(commit)、比对(diff)等等命令.
回顾命令 。
查看容器列表,正在运行中的容器:podman ps 。
podman ps
启动一个或者更多容器:podman start,示例启动crud7 。
podman start crud7
停止一个或者更多容器:podman stop,示例停止crud7 。
podman stop crud7
查看(监控)容器健康状态,示例:
podman stats
从远程地址拉取镜像:podman pull 。
查看 podman 版本命令:podman -v 。
从容器定义配置文件Dockerfile, 构建自定义镜像命令:podman build 。
给镜像加上tag(标签名):podman tag 。
新的容器中运行一条命令,比如我在文中运行到 jar 服务:podman run 。
管理镜像:podman image 。
查看本地(已拉取)镜像列表:podman images 。
移除一个或多个容器:podman rm ,根据容器ID移除。例如:
podman rm 03dd5a923f51
从本地存储移除一个或多个镜像:podman rmi 。
查看容器中运行服务后的日志:podman logs 。
配合Linux中grep、tail命令进行检索 :
podman logs cd57c4af7fb8 | grep 8081
podman logs cd57c4af7fb8 | tail -f
此处,我已知使用到了端口8081,直接匹配比较精确,也可以模糊一点,只输入80。使用 tail -f 命令,查看最近的10条信息.
列出容器端口映射:podman port ,示例,查找名称为crud的容器:
podman port crud
搜索远程地址镜像:podman search ,例如搜索 openjdk17:
podman search openjdk17
使用 podman 帮助文档:podman help 。
使用帮助命令时候,同样可以配合 grep 命令匹配已知的命令:
podman help | grep images
podman help images
podman提供了快速启动,以 httpd 服务为示例:镜像获取、容器创建、容器监控、容器移除.
快速入门,参考podman文档 :
https://podman.io/getting-started/ 。
此处演示使用 podman 获取 httpd(web中间件Apache服务).
搜索命令:podman search ,示例如下:
[root@Centos9-Stream kart]# podman search httpd --filter=is-official
NAME DESCRIPTION
docker.io/library/httpd The Apache HTTP Server Project
获取 httpd 服务 :
podman pull docker.io/library/httpd
列出所有镜像列表 :
podman images
运行容器 :
podman run -dt -p 8080:80/tcp docker.io/library/httpd
获取的是最新版,此处,你可能需要修改才能运行:
podman run -dt -p 8080:80/tcp docker.io/library/httpd:latest
查询正在运行的容器:
podman ps
测试容器,访问 httpd :
http://localhost:8080/
或者使用 curl命令:
curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>
看到页面显示: It works! ,代表测试运行httpd服务成功.
监控容器 ,示例:
podman top amazing_matsumoto
查看日志,指定容器NAME,示例:
podman logs amazing_matsumoto
停止容器 ,根据容器(CONTAINER)ID或者NAME都行。注意,如果没有指定NAME,会生成随机字符串.
示例根据NAME停止容器:
podman stop amazing_matsumoto
查出所有容器(包含退出的、创建的),示例:
podman ps -a
移除容器,示例:
podman rm amazing_matsumoto
通过管道符配合 grep 命令搜索,发现确实移除掉了,示例:
podman ps -a | grep amazing_matsumoto
基本命令文档:可以下载文档,包含:PDF、HTML、Epub三种格式.
https://docs.podman.io/en/latest/Commands.html 。
podman开源仓库: https://github.com/containers/podman 。
最后,希望对你的工作有所帮助,以上总结仅供参考! 。
静下心来,才发现原来不会的还有很多.
一分耕耘,一分收获.
多总结,你会发现,自己的知识宝库越来越丰富.
——END—— 。
最后此篇关于podman入门实战的文章就讲到这里了,如果你想了解更多关于podman入门实战的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
实战-行业攻防应急响应 简介: 服务器场景操作系统 Ubuntu 服务器账号密码:root/security123 分析流量包在/home/security/security.pcap 相
背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP C
一 同一类的方法都用 synchronized 修饰 1 代码 package concurrent; import java.util.concurrent.TimeUnit; public c
一 简单例子 1 代码 package concurrent.threadlocal; /** * ThreadLocal测试 * * @author cakin */ public class T
1. 问题背景 问题发生在快递分拣的流程中,我尽可能将业务背景简化,让大家只关注并发问题本身。 分拣业务针对每个快递包裹都会生成一个任务,我们称它为 task。task 中有两个字段需要
实战环境 elastic search 8.5.0 + kibna 8.5.0 + springboot 3.0.2 + spring data elasticsearch 5.0.2 +
Win10下yolov8 tensorrt模型加速部署【实战】 TensorRT-Alpha 基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10、
yolov8 tensorrt模型加速部署【实战】 TensorRT-Alpha 基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10、linux,
目录如下: 为什么需要自定义授权类型? 前面介绍OAuth2.0的基础知识点时介绍过支持的4种授权类型,分别如下: 授权码模式 简化模式 客户端模式 密码模式
今天这篇文章介绍一下如何在修改密码、修改权限、注销等场景下使JWT失效。 文章的目录如下: 解决方案 JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息,服务器端
前言 大家好,我是捡田螺的小男孩。(求个星标置顶) 我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分四个方案,讨论如何优化MySQL百万数
前言 大家好,我是捡田螺的小男孩。 平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己
我们先讲一些arm汇编的基础知识。(我们以armv7为例,最新iphone5s上的64位暂不讨论) 基础知识部分: 首先你介绍一下寄存器: r0-r3:用于函数参数及返回值的传递 r4-r6
一 同一类的静态方法都用 synchronized 修饰 1 代码 package concurrent; import java.util.concurrent.TimeUnit; public
DRF快速写五个接口,比你用手也快··· 实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestfram
一 添加依赖 org.apache.thrift libthrift 0.11.0 二 编写 IDL 通过 IDL(.thrift 文件)定义数据结构、异常和接口等数据,供各种编程语言使用 nam
我正在阅读 Redis in action e-book关于semaphores的章节.这是使用redis实现信号量的python代码 def acquire_semaphore(conn, semn
自定义控件在WPF开发中是很常见的,有时候某些控件需要契合业务或者美化统一样式,这时候就需要对控件做出一些改造。 目录 按钮设置圆角
师父布置的任务,让我写一个服务练练手,搞清楚socket的原理和过程后跑了一个小demo,很有成就感,代码内容也比较清晰易懂,很有教育启发意义。 代码 ?
? 1 2
我是一名优秀的程序员,十分优秀!