当前位置: 首页 > article >正文

从CentOS到龙蜥:企业级Linux迁移实践记录(容器与应用)

引言:

在企业级Linux环境中,容器技术已经成为应用部署和管理的核心工具。随着技术的不断演进,企业用户对容器化工具的需求也在逐步升级。在本系列的前几篇文章中,我们探讨了龙蜥操作系统(OpenAnolis)的安装和常用软件的配置。这一次,我们将把目光投向容器化技术,特别是在龙蜥系统中使用Podman替代Docker的实践。

容器化技术的广泛应用,得益于其高效的资源利用和便捷的部署流程。而作为容器化技术的先行者,Docker多年来一直是市场的主流选择。然而,随着技术和需求的演变,Docker在设计架构及安全上的局限性逐渐显露。Podman作为一个无守护进程的容器管理工具,因其更好的安全性和与OCI标准的兼容性,被越来越多的企业视为Docker的理想替代方案。

相比Docker,podman主要优势在于其无守护进程架构和更高的安全性。Podman不需要后台运行的守护进程,直接通过命令行工具管理容器,这减少了系统资源消耗并提高了稳定性。它支持rootless模式,允许普通用户安全地运行容器,大大降低了权限相关的安全风险。此外,Podman完全兼容OCI标准,支持Kubernetes的Pod概念,使其在云原生环境中更具优势。这些特性使Podman成为一个更安全、更灵活的容器管理解决方案,特别适合对安全性和合规性要求较高的企业环境。

一、podman安装

由于Red Hat 是podman主要开发者,所以podman直接集成在基础软件包中,通过dnf直接安装。(龙蜥系统完美兼容)

sudo dnf install podman -y

podman version
Client:       Podman Engine
Version:      4.9.4-rhel
API Version:  4.9.4-rhel
Go Version:   go1.21.13 (Red Hat 1.21.13-3.0.1.module+an8.9.0+11260+a43a3bbe)
Built:        Wed Nov 27 14:11:18 2024
OS/Arch:      linux/amd64
# podman-compose 安装
pip install podman-compose
# 使用方法与docker-compose一样

二、导入镜像

1. 镜像来源

## 如果有外网访问权限,可以直接pull
podman pull myslq
  ▸ registry.access.redhat.com/mysql:latest   # 需要账户
    registry.redhat.io/mysql:latest           # 需要科学上网
    docker.io/library/mysql:latest            # 需要科学上网
## 如果是从docker进行迁移
### 将容器转换成镜像
docker commit <容器ID或名称> <新镜像名称>:<标签>
### 将镜像打包
docker save -o <输出文件名.tar> <镜像名称>:<标签>

2. 导入podman

这里使用myslq的容器镜像,先将打包好的镜像上传到用户目录

# 上传镜像
 ll
总用量 507428
-rw-r--r-- 1 app app 519603712 111 21:32 mysql5.7_x86-64.tar
# 导入镜像
podman load -i mysql5.7_x86-64.tar
Getting image source signatures
Copying blob cff044e18624 done   |
Copying blob 4555572a6bb2 done   |
Copying blob 8b2952eb02aa done   |
Copying blob 7ff7abf4911b done   |
Copying blob d76a5f910f6b done   |
Copying blob 8527ccd6bd85 done   |
Copying blob 0d9e9a9ce9e4 done   |
Copying blob 532b66f4569d done   |
Copying blob 337ec6bae222 done   |
Copying blob 73cb62467b8f done   |
Copying blob 441e16cac4fe done   |
Copying config 5107333e08 done   |
Writing manifest to image destination
Loaded image: sha256:5107333e08a87b836d48ff7528b1e84b9c86781cc9f1748bbc1b8c42a870d933
# 查看镜像
podman images
REPOSITORY  TAG         IMAGE ID      CREATED        SIZE
<none>      <none>      5107333e08a8  13 months ago  520 MB
# 刚导入的镜像没有标签,我们需要给加上标签和版本
podman tag -h
Add an additional name to a local image

Description:
  Adds one or more additional names to locally-stored image.

Usage:
  podman tag IMAGE TARGET_NAME [TARGET_NAME...]

Examples:
  podman tag 0e3bbc2 fedora:latest
  podman tag imageID:latest myNewImage:newTag
  podman tag httpd myregistryhost:5000/fedora/httpd:v2

[app@localhost ~]$ podman tag 5107333e08a8 mysql:v5.7
[app@localhost ~]$ podman images
REPOSITORY       TAG         IMAGE ID      CREATED        SIZE
localhost/mysql  v5.7        5107333e08a8  13 months ago  520 MB

三、创建应用容器

按照应用的不同类型,容器分为有状态容器和无状态容器,它们的主要区别在于如何管理状态(即数据)。

  • 有状态容器是指那些需要持久化存储数据的容器。如:数据库服务器(如MySQL、PostgreSQL等),消息队列(如RabbitMQ、Kafka等),文件存储服务(如NFS、Ceph等)。
  • 无状态容器是指那些不需要持久化存储数据的容器。如:Web服务器(如Nginx、Apache等),应用服务器(如Tomcat、Node.js等),微服务架构中的许多服务。
# 创建一个本地持久化目录
mkdir -p /app/data
# 启动容器
podman run -d \
  --name mysql-container \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /app/data:/var/lib/mysql \
  -p 3306:3306 \
  localhost/mysql:v5.7
# 这里需要注意,一定要写前面的localhost和后面的版本号,否则podman会从互联网直接拉去
podman ps
CONTAINER ID  IMAGE                 COMMAND     CREATED         STATUS         PORTS                   NAMES
af5d837e1255  localhost/mysql:v5.7  mysqld      16 minutes ago  Up 16 minutes  0.0.0.0:3306->3306/tcp  mysql-container

# 添加防火墙入站规则
sudo firewall-cmd --permanent --add-port=3306/tcp
# 重新加载防火墙
sudo firewall-cmd --reload
# 查看入站列表
sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 3306/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

在这里插入图片描述

四、持久化验证

# 创建一个user表,并添加记录
select * from user;
1	admin	*6D45FD76D5E9C6A404E39C25106A7F032659ACB8
2	app	*5BCB3E6AC345B435C7C2E6B7949A04CE6F6563D3
3	user1	*89FA6EAF8B6264AC8D6E84759027252505A3EAEE
# 停止在运行容器
podman stop af5d837e1255
podman ps -a
CONTAINER ID  IMAGE                 COMMAND     CREATED         STATUS                     PORTS                   NAMES
af5d837e1255  localhost/mysql:v5.7  mysqld      17 minutes ago  Exited (0) 13 seconds ago  0.0.0.0:3306->3306/tcp  mysql-container

# 删除容器
 podman rm af5d837e1255
af5d837e1255
[app@localhost ~]$ podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
 
# 重新创建一个新的mysql容器
 podman run -d \
   --name mysql-container \
   -e MYSQL_ROOT_PASSWORD=123456 \
   -v /app/data:/var/lib/mysql \
   -p 3306:3306 \
   localhost/mysql:v5.7
podman ps
CONTAINER ID  IMAGE                 COMMAND     CREATED        STATUS        PORTS                   NAMES
0a78acf1287b  localhost/mysql:v5.7  mysqld      6 seconds ago  Up 7 seconds  0.0.0.0:3306->3306/tcp  mysql-container
# 检查数据,依然存在
SELECT * FROM `user`

1	admin	*6D45FD76D5E9C6A404E39C25106A7F032659ACB8
2	app	*5BCB3E6AC345B435C7C2E6B7949A04CE6F6563D3
3	user1	*89FA6EAF8B6264AC8D6E84759027252505A3EAEE

五、自证清白

# 一切是那么的顺利,没有一点卡壳,我甚至怀疑用的是RHEL,所以反手敲了一个uname -a
uname -a
Linux localhost.localdomain 5.10.134-16.2.an8.x86_64 #1 SMP Mon Mar 4 16:14:16 CST 2024 x86_64 x86_64 x86_64 GNU/Linux

六、附录-podman帮助手册

attach - 连接到一个正在运行的容器。
作用:允许用户实时查看容器内部输出或与容器交互。
auto-update - 根据容器的自动更新策略自动更新容器。
作用:自动保持容器更新,减少手动干预。
build - 使用Containerfiles中的指令构建一个镜像。
作用:从Dockerfile或类似文件构建自定义镜像。
commit - 基于变更的容器创建新镜像。
作用:将容器的当前状态保存为新的镜像。
compose - 通过外部提供者(如docker-compose或podman-compose)运行组合工作负载。
作用:管理多容器应用的不同服务。
container - 管理容器。
作用:执行与容器相关的各种管理操作。
cp - 在容器和本地文件系统之间复制文件/文件夹。
作用:方便地在容器和主机之间传输文件。
create - 创建但不启动一个容器。
作用:预配置容器,以便后续启动。
diff - 显示对象文件系统的变更。
作用:查看容器文件系统的变化。
events - 显示Podman系统事件。
作用:监控和记录Podman系统的实时事件。
exec - 在运行中的容器中运行一个进程。
作用:在容器内执行命令。
export - 将容器的文件系统内容导出为tar归档。
作用:备份或迁移容器文件系统。
farm - 将构建任务分配给远程机器。
作用:分布式构建镜像。
generate - 基于容器、_Pods_或卷生成结构化数据。
作用:自动生成配置文件或数据。
healthcheck - 管理容器的健康检查。
作用:确保容器运行状态符合预期。
help - 关于任何命令的帮助。
作用:提供命令使用说明。
history - 显示指定镜像的历史。
作用:查看镜像的构建历史。
image - 管理镜像。
作用:执行与镜像相关的管理操作。
images - 列出本地存储中的镜像。
作用:查看已下载的镜像列表。
import - 导入tar包以创建文件系统镜像。
作用:从归档文件创建镜像。
info - 显示Podman系统信息。
作用:提供系统级别的信息。
init - 初始化一个或多个容器。
作用:准备容器以供使用。
inspect - 显示由ID表示的对象配置。
作用:查看容器、镜像等对象的详细信息。
kill - 使用特定信号杀死一个或多个运行中的容器。
作用:强制停止容器。
kube - 从结构化文件播放容器、_Pods_或卷。
作用:基于Kubernetes配置文件部署资源。
load - 从tar归档加载镜像。
作用:导入镜像。
login - 登录到容器注册表。
作用:认证以访问私有镜像仓库。
logout - 从容器注册表注销。
作用:结束与镜像仓库的会话。
logs - 获取一个或多个容器的日志。
作用:查看容器运行时的输出日志。
machine - 管理虚拟机。
作用:创建、管理虚拟机,用于运行容器。
manifest - 操作清单列表和镜像索引。
作用:管理多架构镜像。
mount - 挂载工作容器的根文件系统。
作用:直接访问容器文件系统。
network - 管理网络。
作用:创建、删除、管理容器网络。
pause - 暂停一个或多个容器中的所有进程。
作用:临时停止容器运行。
pod - 管理_Pods_。
作用:_Pods_是一组共享命名空间和资源的容器。
port - 列出容器的端口映射或特定映射。
作用:查看容器的网络端口配置。
ps - 列出容器。
作用:查看当前运行的容器列表。
pull - 从注册表拉取镜像。
作用:从远程镜像仓库下载镜像到本地。
push - 将镜像推送到指定目的地。
作用:将本地镜像上传到远程镜像仓库。
rename - 重命名现有容器。
作用:更改容器的名称。
restart - 重启一个或多个容器。
作用:停止并重新启动容器。
rm - 删除一个或多个容器。
作用:移除不再需要的容器。
rmi - 从本地存储中删除一个或多个镜像。
作用:移除不再需要的镜像。
run - 在新容器中运行命令。
作用:创建并启动容器,执行指定命令。
save - 将镜像保存到归档。
作用:导出镜像为tar包,便于备份或传输。
search - 在注册表中搜索镜像。
作用:查找可用的镜像。
secret - 管理秘密。
作用:存储和管理敏感数据,如密码或密钥。
start - 启动一个或多个容器。
作用:开始运行已创建的容器。
stats - 显示容器资源使用统计信息的实时流。
作用:监控容器的CPU、内存等资源使用情况。
stop - 停止一个或多个容器。
作用:终止容器的运行。
system - 管理Podman。
作用:执行系统级别的Podman管理操作。
tag - 向本地镜像添加额外名称。
作用:为镜像创建标签,便于识别和管理。
top - 显示容器的运行进程。
作用:查看容器内正在运行的进程。
unmount - 卸载工作容器的根文件系统。
作用:取消挂载容器文件系统。
unpause - 取消暂停一个或多个容器中的进程。
作用:恢复暂停的容器运行。
unshare - 在修改后的用户命名空间中运行命令。
作用:以不同的用户权限运行容器。
untag - 从本地镜像移除名称。
作用:删除镜像的标签。
update - 更新现有容器。
作用:修改容器的配置,如资源限制。
version - 显示Podman版本信息。
作用:查看当前安装的Podman版本。
volume - 管理卷。
作用:创建、删除和管理持久化存储卷。
wait - 在一个或多个容器上阻塞。
作用:等待容器停止运行,通常用于脚本中。

http://www.kler.cn/a/512241.html

相关文章:

  • uniapp——App 监听下载文件状态,打开文件(三)
  • 数据结构——AVL树的实现
  • 风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(上)
  • HTML学习笔记(4)
  • 大语言模型的语境中“越狱”和思维链
  • [STM32 HAL库]串口空闲中断+DMA接收不定长数据
  • 25届合肥工业大学自动化考研复试攻略
  • 大型语言模型(LLM)在算法设计中的系统性综述
  • MySQL 数据库的备份和恢复(Linux)
  • Spring Boot安全加固:基于Spring Security的权限管理
  • vue2 - Day05 - VueX
  • WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测
  • qml OpacityMask详解
  • 简单prometheus+grafana+pushgateway采集GPU利用率和交换机流量
  • uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)
  • ORACLE 12C开启EM EXPRESS过程
  • 架构优化指南:五大场景下如何发现隐藏的耦合?
  • 自动化爬虫运行过程中,有没有办法提高爬虫的抓取效率?
  • 介绍 HTTP 请求如何实现跨域
  • Oracle之RMAN备份异机恢复(单机到单机)
  • doris 2.1 Queries Acceleration-Hints 学习笔记
  • 头歌实训作业 算法设计与分析-贪心算法(第1关:部分背包问题)
  • 群晖Cloud Sync如何实现一键同步备份让数据更安全高效
  • 使用HTML5 Canvas 实现呼吸粒子球动画效果的原理
  • 软考,沟通管理
  • (开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台