Linux云计算 |【第一阶段】SERVICES-DAY6

主要内容:

Linux容器基础、Linux容器管理、podman命令行、管理容器进阶

实操前骤:安装 RHEL8.2 虚拟机

1.选择软件包:rhel-8.2-x86-dvd.iso;

2.内存2048M;

3.时区选择亚洲-上海,带GUI的服务器;

4.其它安装步骤参照:RHEL7安装;


完成系统初始化:

1.设置主机名:svr8.tedu.cn(永久修改)

[root@localhost ~]# hostname svr8.tedu.cn
[root@localhost ~]# echo svr8.tedu.cn > /etc/hostname
[root@localhost ~]# cat /etc/hostname
svr8.tedu.cn

2.设置SELinux禁用模式disabled(永久修改)

[root@svr8 ~]# vim /etc/selinux/config
SELINUX=disabled

3.关闭防火墙

[root@svr8 ~]# systemctl stop firewalld.service
[root@svr8 ~]# systemctl disable firewalld.service

4.构建Yum仓库(将光盘放入光驱设备中)

构建Yum仓库(挂载光驱设备)

[root@svr8 ~]# mkdir /dvd
[root@svr8 ~]# ls /dev/cdrom
/dev/cdrom
[root@svr8 ~]# mount /dev/cdrom /dvd     //手动挂载
mount: /dvd: WARNING: device write-protected, mounted read-only.  //RHEL8正常报错
[root@svr8 ~]# ls /dvd
AppStream  EULA              images      RPM-GPG-KEY-redhat-beta
BaseOS     extra_files.json  isolinux    RPM-GPG-KEY-redhat-release
EFI        GPL               media.repo  TRANS.TBL

注意:RHEL8的仓库数据文件和软件包分开两个目录(仓库)存放,修改仓库配置文件时,需要指定2个仓库的位置;

[root@svr8 ~]# ls /dvd/AppStream/
Packages  repodata
[root@svr8 ~]# ls /dvd/BaseOS/
Packages  repodata
[root@svr8 ~]# ls /etc/yum.repos.d/
redhat.repo     //redhat.repo不会读取
[root@svr8 ~]# vim /etc/yum.repos.d/dvd.repo    //修改仓库配置文件
[AppStream]
name=AppStream
baseurl=file:///dvd/AppStream    //指定:/dvd/AppStream/
enable=1
gpgcheck=0[BaseOS]
name=BaseOS
baseurl=file:///dvd/BaseOS    //指定:/dvd/BaseOS/
enable=1
gpgcheck=0[root@svr8 ~]# yum clean all     //清空YUM缓存
[root@svr8 ~]# yum -v repolist    //列出仓库清单(显示详细信息)
Repo-id            : AppStream
Repo-name          : AppStream
Repo-revision      : 1585986722
Repo-updated       : 2020年04月04日 星期六 15时52分03秒
Repo-pkgs          : 5,359
Repo-available-pkgs: 4,924
Repo-size          : 6.2 G
Repo-baseurl       : file:///dvd/AppStream
Repo-expire        : 172,800 秒 (最近 2021年03月23日 星期二 12时25分01秒)
Repo-filename      : /etc/yum.repos.d/dvd.repoRepo-id            : BaseOS
Repo-name          : BaseOS
Repo-revision      : 1585986753
Repo-updated       : 2020年04月04日 星期六 15时52分33秒
Repo-pkgs          : 1,681
Repo-available-pkgs: 1,679
Repo-size          : 1.0 G
Repo-baseurl       : file:///dvd/BaseOS
Repo-expire        : 172,800 秒 (最近 2021年03月23日 星期二 12时25分01秒)
Repo-filename      : /etc/yum.repos.d/dvd.repo
Total packages: 7,040
[root@svr8 ~]# yum -y install gcc     //测试安装gcc
已安装:cpp-8.3.1-5.el8.x86_64                gcc-8.3.1-5.el8.x86_64                 glibc-devel-2.28-101.el8.x86_64       glibc-headers-2.28-101.el8.x86_64      isl-0.16.1-6.el8.x86_64               kernel-headers-4.18.0-193.el8.x86_64   libxcrypt-devel-4.1.1-4.el8.x86_64   
完毕!

补充:使用 yum -v repolist 命令才能显示详细信息

5.修改网卡命名(eth0)

[root@svr8 ~]# vim /etc/default/grub    //修改网卡命名
...
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet net.ifnames=0 biosdevname=0"
[root@svr8 ~]# grub2-mkconfig -o /boot/grub2/gurb.cfg     //通知内核
Generating grub configuration file ...
done
[root@svr8 ~]# reboot   //重启生效

6.修改网卡的网络配置参数

[root@svr8 ~]# nmcli connection show
NAME    UUID                                  TYPE      DEVICE
virbr0  2b5e8f89-b8e3-413b-a6a5-0a34e8216ff3  bridge    virbr0
enp1s0  a9ff14e2-c962-4832-b8e1-d66ca2803f36  ethernet  --     
[root@svr8 ~]# nmcli connection delete enp1s0     //删除默认错误网卡enp1s0
成功删除连接 "enp1s0" (a9ff14e2-c962-4832-b8e1-d66ca2803f36)。
[root@svr8 ~]# nmcli connection show
NAME    UUID                                  TYPE    DEVICE
virbr0  2b5e8f89-b8e3-413b-a6a5-0a34e8216ff3  bridge  virbr0[root@svr8 ~]# nmcli connection add type ethernet ifname eth0 con-name eth0      //添加网卡
连接 "eth0" (3caa11bd-bd71-4b45-915b-6854dc408733) 已成功添加。
[root@svr8 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.208/24 connection.autoconnect yes    //配置网络参数
[root@svr8 ~]# nmcli connection up eth0      //激活网卡
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)[root@svr8 ~]# ifconfig | head -2     //查看网卡信息
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.4.208  netmask 255.255.255.0  broadcast 192.168.4.255

7.建立虚拟网络(Private)并测试SSH远程

[root@localhost 桌面]# ssh 192.168.4.208      //远程连接
[root@svr8 ~]#     //登录成功

8.上传/linux-soft/1/podman/目录的3个镜像到RHEL8主机/root目录

真机:

[root@localhost 桌面]# scp -r /linux-soft/1/podman/ root@192.168.4.208:/root
root@192.168.4.208's password:
httpd.tar.gz                                  100%  141MB 189.1MB/s   00:00    
myos.tar.gz                                   100%  141MB 112.5MB/s   00:01    
nginx.tar.gz                                  100%  141MB 101.5MB/s   00:01

RHEL8:

[root@svr8 ~]# ls /root/podman/
httpd.tar.gz  myos.tar.gz  nginx.tar.gz

 注意:使用 scp -r 拷贝整个目录


一、容器基础概述

容器是一种轻量级的虚拟化技术,它允许你在操作系统级别上创建独立的、可移植的运行环境。容器共享主机操作系统的内核,但拥有自己的文件系统、进程空间和网络接口。这使得容器比传统的虚拟机更加轻量和高效。而通常Linux中的容器是用来部署应用,将软件打包成标准化单元,用于开发、交付和部署,容器技术已经成为应用程序封装和交付的核心技术;

容器的优点:

  1. 资源效率:容器共享主机操作系统的内核,因此它们占用的资源比虚拟机少得多。
  2. 启动速度快:容器的启动时间通常以秒计,而虚拟机的启动时间可能需要几分钟。
  3. 一致性:容器提供了一致的运行环境,确保应用在开发、测试和生产环境中的行为一致。
  4. 可移植性:容器使用的共享公共库和程序,容器可以轻松地在不同的环境中迁移,无论是物理机、虚拟机还是云平台。
  5. 隔离性:虽然共享内核,但容器提供了良好的进程和资源隔离,确保应用之间的相互影响最小化。

容器的缺点:

  1. 安全性:由于容器共享主机操作系统的内核,如果内核存在漏洞,所有容器都可能受到影响。容器的隔离性没有虚拟化强,共用Linux内核,安全性不可靠;
  2. 操作系统限制:容器通常只能在相同或兼容的操作系统上运行,例如,Linux容器不能直接在Windows主机上运行。
  3. 复杂性:对于复杂的应用,管理和编排多个容器可能变得复杂。

1、Podman和容器的关系

Podman(Pod Manager)是一个开源的容器管理工具,由Red Hat开发。它是一个无守护进程的容器引擎,允许用户以非root用户身份运行容器。Podman的设计目标是提供与Docker兼容的命令行接口,同时避免Docker守护进程带来的安全和管理问题。

Podman可以直接管理容器、镜像、卷和网络,支持OCI(Open Container Initiative)标准,可以运行和管理符合OCI标准的容器。

2、Podman和Docker的关系

Podman和Docker都是容器管理工具,但它们在设计和实现上有一些关键的区别:

  1. 守护进程:Docker依赖于一个后台守护进程(Docker daemon)来管理容器,而Podman不需要守护进程,直接通过系统调用与容器交互。
  2. 用户权限:Podman允许非root用户运行和管理容器,而Docker通常需要root权限。
  3. 兼容性:Podman提供了与Docker兼容的命令行接口,这意味着用户可以相对容易地从Docker迁移到Podman。
  4. 安全性:由于没有守护进程,Podman在安全性方面可能更有优势,因为它减少了潜在的攻击面

二、镜像、仓库与容器 概念

镜像、仓库与容器是容器化技术的三个核心概念,它们共同构成了容器生态系统的基础。下面将详细介绍每个概念的含义及其相互关系。

1、镜像(Image)

镜像是一个轻量级、独立的、可执行的软件包,包含运行应用程序所需的一切:代码、运行时环境、系统工具、系统库和设置。镜像是一静态的概念,可以被看作是一个容器的“模板”。镜像通常是只读的,确保了环境的一致性和可重复性。

镜像可以通过 Dockerfile 来定义,Dockerfile 是一个文本文件,包含了一系列的指令,用于自动化地构建镜像。

2、仓库(Repository)

仓库是用于存储和分发镜像的地方。仓库可以被看作是一个集中式的存储库,用户可以从中拉取(下载)镜像到本地,也可以将本地的镜像推送到仓库中。仓库可以是公开的,如 Docker Hub,也可以是私有的,用于企业内部或特定团队使用。

仓库中的每个镜像都有一个唯一的标签(tag),用于区分不同版本的镜像。例如,一个镜像可以有 latest1.02.0 等标签。

3、容器(Container)

容器是镜像的一个运行实例。容器是一个动态的概念,它包含了应用程序及其所有的依赖,可以在任何支持容器的环境中运行。容器提供了进程隔离、网络隔离和存储隔离,确保了应用程序在一个独立的环境中运行,不会受到其他容器或主机系统的影响。

容器可以从镜像创建,并且可以被启动、停止、删除和迁移。每个容器都有自己的文件系统、网络配置和进程空间。

三者之间的关系

  • 镜像与容器:镜像是容器的静态模板,容器是镜像的动态实例。镜像在运行时会生成一个或多个容器。
  • 镜像与仓库:镜像存储在仓库中,用户可以从仓库中拉取镜像到本地,也可以将本地的镜像推送到仓库中。
  • 容器与仓库:容器本身不直接与仓库交互,但容器所基于的镜像可以从仓库中获取。

镜像是启动容器的核心,镜像由镜像仓库提供;(本次实验从真机上传3个镜像包)

在podman中容器是基于镜像启动的,当镜像损坏则容器也损坏;镜像采用分层设计,使用COW写时复制技术(copy on write)(类似链接模板原理:模板虚拟机 —> 克隆后的虚拟机;创建链接,在模板读,在克隆写)

官方镜像仓库:docker.io、quay.io

三、Podman安装

Podman(Pod Manager)是一个开源的容器管理工具,由Red Hat开发。它是一个无守护进程的容器引擎,允许用户以非root用户身份运行容器。Podman的设计目标是提供与Docker兼容的命令行接口,同时避免Docker守护进程带来的安全和管理问题。Podman可以直接管理容器、镜像、卷和网络,支持OCI(Open Container Initiative)标准,可以运行和管理符合OCI标准的容器。

Podman 是一个开源的容器管理工具,其可在大多数 Linux 平台上使用,它是一种无守护程序的容器引擎,用于在 Linux 系统上开发,管理和运行任何符合 Open Container Initiative(OCI) 标准的容器和容器镜像,提供了一个与 Docker 兼容的命令行前端,该前端可以简单地为 Docker CLI 别名,即 “alias docker = podman”。Podman 控制下的容器既可以由 root 用户运行,也可以由非特权用户运行,这个是 Podman 与 Docker 最大的差别之一。

  • 安装条件:需要64位操作系统,且至少RHEL8以上的版本,关闭firewalld防火墙与关闭SELinux(非必须)
  • 所需软件:系统软件位于 rhel-8.2-x86_64-dvd 源中;利用系统光盘构建Yum仓库;

安装podman工具

[root@svr8 ~]# yum module list    //列出所有模块清单
[root@svr8 ~]# yum -y module install container-tools    下载并安装container-tools包组

补充:Module:模块安装(一组包安装),将实现该功能的软件包打包并解决每个依赖关系

四、Podman镜像管理

1、获取镜像命令

① 查找镜像(需要能访问互联网)

格式:podman search 关键字

podman search httpd

② 下载镜像(需要能访问互联网)

格式:podman pull 镜像名称:标签

podman pull localhost/myos:latest

③ 导入镜像

格式:podman load -i 备份文件.tar.gz         //[-i]代表images镜像

例如:podman load -i /root/httpd.tar.gz

[root@svr8 ~]# podman images
REPOSITORY   TAG   IMAGE ID   CREATED   SIZE

解释:REPOSITORY(镜像名称)、TAG(标签)、IMAGE ID(镜像id)、CREATED(创建时间)、SIZE(大小)

[root@svr8 ~]# ls /root/podman/
httpd.tar.gz  myos.tar.gz  nginx.tar.gz[root@svr8 ~]# podman load -i /root/podman/httpd.tar.gz   //导入镜像
Getting image source signatures
Copying blob bcc97fbfc9e1 done
Copying blob 3e66766ae231 done
Copying config 2f2eb9bd13 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/myos:httpd[root@svr8 ~]# podman load -i /root/podman/myos.tar.gz   //导入镜像
Getting image source signatures
Copying blob 3e66766ae231 skipped: already exists
Copying blob bcc97fbfc9e1 skipped: already exists
Copying config 2f57195050 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/myos:latest[root@svr8 ~]# podman load -i /root/podman/nginx.tar.gz   //导入镜像
Getting image source signatures
Copying blob 3e66766ae231 skipped: already exists
Copying blob bcc97fbfc9e1 skipped: already exists
Copying config 8a90426645 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/myos:nginx[root@svr8 ~]# podman images      //查看镜像
REPOSITORY       TAG      IMAGE ID       CREATED        SIZE
localhost/myos   nginx    8a9042664597   3 months ago   392 MB
localhost/myos   httpd    2f2eb9bd1363   3 months ago   392 MB
localhost/myos   latest   2f57195050eb   8 months ago   392 MB

补充:三个镜像:带nginx的操作系统、带httpd的操作系统、最小化安装操作系统)

2、镜像管理命令

① 查看镜像

格式:podman images

② 删除镜像

格式:podman rmi 镜像名称:镜像标签 //或者镜像ID

镜像的名称标识:

  • 每一个镜像都对应唯一的镜像id(IMAGE ID)
  • 镜像名称(REPOSITORY) + 标签(TAG)= 唯一    //镜像名称:镜像标签
  • 每一个镜像都有标签,如果没写,默认标签 latest
  • 我们在调用镜像的时候,如果没有指定,默认标签 latest

例如:

[root@svr8 ~]# podman rmi localhost/myos:latest   //删除镜像(镜像名称+标签)
Untagged: localhost/myos:latest
Deleted: 2f57195050ebb3412bdf98d60d59aa5441e7b08931cb5fbac0e880d9840d1ba9
[root@svr8 ~]# podman images    //查看镜像
REPOSITORY       TAG     IMAGE ID       CREATED        SIZE
localhost/myos   nginx   8a9042664597   3 months ago   392 MB
localhost/myos   httpd   2f2eb9bd1363   3 months ago   392 MB[root@svr8 ~]# podman rmi 8a      //删除镜像(镜像ID,模糊匹配)
Untagged: localhost/myos:nginx
Deleted: 8a9042664597efcb6cd46768c2724e815975dc42fb7589ef15a1bb47e68306c8
[root@svr8 ~]# podman images     //查看镜像
REPOSITORY       TAG     IMAGE ID       CREATED        SIZE
localhost/myos   httpd   2f2eb9bd1363   3 months ago   392 MB
[root@svr8 ~]# podman load -i /root/podman/myos.tar.gz
[root@svr8 ~]# podman load -i /root/podman/nginx.tar.gz
localhost/myos   nginx   8a9042664597   3 months ago   392 MB
  • 补充:删除镜像可用镜像ID方式删除,输入完整ID则唯一匹配,也可模糊匹配;
  • 补充:删除的镜像再重新导入,镜像ID不会发生变化;

五、Podman容器管理

1、运行容器命令

Podman run 命令(run  =  创建 + 启动 + 进入)

格式:podman run [-选项] 镜像名称:镜像标签 启动解释器

podman run -it myos:latest /bin/bash   //启动容器并进入容器

命令:exit     //退出容器(初次运行容器退出则停止容器并转入内存)

备注:可以通过命令行提示符,判定自己是否进入容器

Podman run 命令的选项

  • [-i]    交互式
  • [-t]    终端
  • [-d]    后台运行
  • [--name]  定义容器名字

查看 run 的帮助选项

  • 格式:podman help run
  • 格式:man podman-run 

补充:控制镜像所产生的容器需要解释器进行翻译

2、容器管理命令

① 启动容器(产生新的容器)

格式:podman run [–选项] 镜像名称:镜像标签 启动解释器

② 查看容器

格式:podman ps [ -a 所有容器id ] [ -q 只显示容器 id ]

③ 删除容器

格式:podman rm 容器id

④ 容器管理命令启动、停止、重启

格式:podman start|stop|restart 容器id

⑤ 进入容器(进入已运行的容器)

格式:podman exec -it 容器id 启动解释器

例如:启动容器

[root@svr8 ~]# podman run --name nsd01 -it localhost/myos:httpd /bin/bash  //创建新的容器并启动和进入容器
[root@a950d511177f html]# ls     //查看目录内容
index.html  info.html  info.php
[root@a950d511177f /]# cat /etc/redhat-release    //查看红帽系统版本
CentOS Linux release 7.5.1804 (Core)
[root@a950d511177f /]# useradd AJ   //容器系统添加用户
[root@a950d511177f /]# id AJ
uid=1000(AJ) gid=1000(AJ) groups=1000(AJ)
[root@a950d511177f /]# exit
exit
[root@svr8 ~]# podman ps -a     //查看容器
CONTAINER ID  IMAGE                 COMMAND    CREATED        STATUS                         PORTS  NAMES
a950d511177f  localhost/myos:httpd  /bin/bash  2 minutes ago  Exited (0) About a minute ago         nsd01     //Exited表示容器已停止
[root@svr8 ~]# podman start nsd01    //开启虚拟机
nsd01
[root@svr8 ~]# podman exec -it nsd01 /bin/bash    //进入正在启动的容器
[root@a950d511177f html]#

注意:没有/etc/resolv.conf 可能会报错(提前检查是否有/etc/resolv.conf,运行必备)

  • 补充:依据镜像(模板虚拟机)产生的容器,以全新的操作系统运行,所以版本为:7.5.1804,且一个镜像可以产生多个容器,容器内也可以产生新容器;
  • 补充:首次run创建容器会进入容器,exit退出会将容器关机并放在内存中挂着,需要再次进入容器需要start开启,再exec进入容器;(每次删除容器需要stop关闭才能及进行删除操作;)

例如:删除容器

[root@svr8 ~]# podman run -it --name nsd04 localhost/myos:httpd /bin/bash
[root@a286bcc6feb1 html]# exit
exit
[root@svr8 ~]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED         STATUS                       PORTS  NAMES
a286bcc6feb1  localhost/myos:httpd  /bin/bash  21 seconds ago  Exited (127) 13 seconds ago         nsd04
a950d511177f  localhost/myos:httpd  /bin/bash  55 minutes ago  Up 52 minutes ago                   nsd01
[root@svr8 ~]# podman rm a2     //删除容器(镜像ID,模糊匹配)
a286bcc6feb1cc59db034aee66da02ddbccce340ec6300f2dcfd0ed4eb26906a
[root@svr8 ~]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED         STATUS             PORTS  NAMES
a950d511177f  localhost/myos:httpd  /bin/bash  56 minutes ago  Up 53 minutes ago         nsd01

2.1 案例:容器进阶-对外发布容器服务

默认容器可以访问外网,但外部网络的主机不可以访问容器内的资源,容器每次创建IP地址都会改变(DHCP),当创建容器后,真机会自动创建(cni-podman0)的网卡与容器通信,解决该问题的最佳方法是端口绑定;容器可以与宿主机的端口进行绑定,从而把宿主机变成对应的服务,不用关心容器的IP地址。

使用 [-p] 参数,可把容器端口和宿主机端口绑定

格式:-p [可选IP]:宿主机端口:容器端口 //将访问宿主机端口移交给容器端口

注意:同一宿主机端口只能绑定一个容器服务

例如:把宿主机变成 apache

podman run -itd -p 80:80 myos:httpd

注意:容器不支持systemctl,只能手动运行执行程序/usr/sbin/httpd

例如:

[root@svr8 ~]# podman run --name myweb -itd -p 80:80 localhost/myos:httpd /bin/bash
19953677ce85193edfbef6252cfa1548f5772d8a654e957cbdbe1e5a38df5062
[root@svr8 ~]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED            STATUS                PORTS               NAMES
19953677ce85  localhost/myos:httpd  /bin/bash  25 seconds ago     Up 24 seconds ago     0.0.0.0:80->80/tcp  myweb
a950d511177f  localhost/myos:httpd  /bin/bash  About an hour ago  Up About an hour ago                      nsd01[root@svr8 ~]# podman exec -it myweb /bin/bash
[root@19953677ce85 html]# pwd
/var/www/html
[root@19953677ce85 html]# cat index.html
this is apache
[root@19953677ce85 html]# echo HELLO WORLD > index.html
[root@19953677ce85 html]# cat index.html
HELLO WORLD
[root@19953677ce85 html]# /usr/sbin/httpd    //手动运行服务
[root@19953677ce85 html]# exit
exit[root@svr8 ~]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED             STATUS                 PORTS               NAMES
19953677ce85  localhost/myos:httpd  /bin/bash  About a minute ago  Up About a minute ago  0.0.0.0:80->80/tcp  myweb
a950d511177f  localhost/myos:httpd  /bin/bash  About an hour ago   Up About an hour ago                       nsd01
[root@svr8 ~]# curl http://192.168.4.208
HELLO WORLD

2.2 案例:容器进阶-容器共享卷

podman容器不适合保存任何数据,数据文件与配置文件频繁更改,修改多个容器中的数据非常困难,多容器之间有数据共享、同步需求,重要数据在容器内不方便管理容易丢失,解决该问题需使用主机卷映射功能;(需实现类似NFS共享目录,在真机下修改容器数据)

 podman可以映射宿主机文件或目录到容器中:

  • 目标对象不存在就自动创建
  • 目标对象存在就直接覆盖掉
  • 多个容器可以映射同一个目标对象来达到数据共享的目的

启动容器时,使用 [-v] 映射参数

格式:podman run -itd -v 宿主机对象:容器内对象 镜像名称:标签

例如:

[root@svr8 ~]# podman stop myweb    //停止容器
[root@svr8 ~]# podman rm myweb     //删除容器
[root@svr8 ~]# mkdir /webroot     //创建目录
[root@svr8 ~]# podman run --name myweb2 -p 80:80 -v /webroot:/var/www/html -itd localhost/myos:httpd /bin/bash
de87c525992becfa58fcb49ce91f03bee0057440d37cdb9d9584afcf919f0f1a
[root@svr8 ~]# podman exec -it myweb2 /bin/bash
[root@de87c525992b html]# /usr/sbin/httpd
[root@de87c525992b html]# exit
exit
[root@svr8 ~]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED             STATUS                 PORTS               NAMES
de87c525992b  localhost/myos:httpd  /bin/bash  About a minute ago  Up About a minute ago  0.0.0.0:80->80/tcp  myweb2
a950d511177f  localhost/myos:httpd  /bin/bash  2 hours ago         Up 2 hours ago                             nsd01
[root@svr8 ~]# echo 'HELLO WORLD WEB2' > /webroot/index.html
[root@svr8 ~]# curl http://192.168.4.208
HELLO WORLD WEB2
[root@svr8 ~]# echo 'HELLO WORLD WEB2!!' > /webroot/index.html
[root@svr8 ~]# curl http://192.168.4.208
HELLO WORLD WEB2!!

常见报错:端口已占用,所以要停止对应容器并删除,否则都报错;

Error: error creating container storage: the container name "myweb2" is already in use by "4a0b24b6e784aee1c51cbea401c619d6696bb18ccad89119b377b9cb5b2e85c7". You have to remove that container to be able to reuse that name.: that name is already in use

2.3 案例:容器进阶-管理系统服务

  • systemd一个更高效的系统&服务管理器,开机服务并行启动,各系统服务间的精确依赖
  • systemd服务目录:/usr/lib/systemd/system/ //存放读取、启停服务配置文件
  • 主要管理工具:systemctl
  • 主要通过Systemd管理容器的启动、关闭、自启等,而非使用podman启动等方式。

( 前提:/etc/selinux/config #永久修改)

① 生成服务启动配置文件(针对已有的容器)

格式:podman generate systemd --name 容器名 --files

选项:[--files] //生成文件类型,需要在服务目录生成启动Podman的服务文件

注意:必须是相对路径操作,最好容器有相应的容器名(/usr/lib/systemd/system/)

② 重新加载服务启动配置文件

格式:systemctl daemon-reload

③ Systemd对容器的操作命令:

  • 格式:systemctl stop container-容器名
  • 格式:systemctl start container-容器名
  • 格式:systemctl enable container-容器名
  • 格式:systemctl disable container-容器名

例如:

[root@svr8 ~]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED       STATUS            PORTS               NAMES
2d5890e21acc  localhost/myos:httpd  /bin/bash  24 hours ago  Up 3 seconds ago  0.0.0.0:80->80/tcp  myweb3
[root@svr8 ~]# cd /usr/lib/systemd/system    //必须切换到服务目录下运行
[root@svr8 system]# podman generate systemd --name myweb3 --files     //生成服务启动配置文件
[root@svr8 system]# systemctl daemon-reload  //重新加载所有服务启动配置文件
[root@svr8 system]# systemctl stop container-myweb3.service     //Systemctl停止服务
[root@svr8 system]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED       STATUS                      PORTS               NAMES
2d5890e21acc  localhost/myos:httpd  /bin/bash  24 hours ago  Exited (137) 5 seconds ago  0.0.0.0:80->80/tcp  myweb3[root@svr8 system]# systemctl start container-myweb3.service    //Systemctl启动服务
[root@svr8 system]# podman ps -a
CONTAINER ID  IMAGE                 COMMAND    CREATED       STATUS            PORTS               NAMES
2d5890e21acc  localhost/myos:httpd  /bin/bash  24 hours ago  Up 3 seconds ago  0.0.0.0:80->80/tcp  myweb3

扩展:关于容器与虚拟化

虚拟化的原理:

  • 虚拟化是一种技术,通过在物理硬件上创建一个虚拟的计算机系统,使得多个操作系统可以在同一台物理机上同时运行。虚拟化的核心是虚拟机监视器(VMM),也称为Hypervisor。Hypervisor直接运行在物理硬件上,或者运行在主机操作系统上,负责创建和管理多个虚拟机(VM)。
  • 每个虚拟机都有自己的操作系统(Guest OS),并且拥有独立的硬件资源,如CPU、内存、存储和网络。虚拟机通过Hypervisor与物理硬件进行交互,Hypervisor负责将虚拟机的请求翻译成物理硬件可以理解的指令。

容器的原理:

  • 容器是一种操作系统级别的虚拟化技术,它允许在同一台主机上运行多个隔离的用户空间实例。容器共享主机操作系统的内核,但拥有自己的文件系统、进程空间、网络接口和系统资源。
  • 容器通过Linux内核的几个特性实现隔离,如命名空间(Namespace)用于隔离进程树、网络接口、挂载点等,控制组(cgroups)用于限制和隔离资源使用(CPU、内存、磁盘I/O等)。

两者的联系:

容器和虚拟化都是为了实现资源的隔离和分配,使得多个应用或操作系统可以在同一台物理机上运行,而不会相互干扰。它们都可以提高硬件的利用率,简化应用的部署和管理。

两者的区别:

  1. 隔离级别

    • 虚拟化提供的是硬件级别的隔离,每个虚拟机都有自己的操作系统和内核,因此隔离性更强。
    • 容器提供的是操作系统级别的隔离,容器共享主机操作系统的内核,因此隔离性相对较弱。
  2. 资源占用

    • 虚拟机需要为每个Guest OS分配独立的资源,因此资源占用较多,启动和运行速度较慢。
    • 容器共享主机操作系统的内核,因此资源占用较少,启动和运行速度较快。
  3. 性能

    • 虚拟机由于需要模拟硬件,因此性能开销较大。
    • 容器由于直接使用主机操作系统的内核,因此性能开销较小。
  4. 操作系统支持

    • 虚拟机可以运行不同类型的操作系统,如Windows虚拟机可以在Linux主机上运行。
    • 容器通常只能在相同类型的操作系统上运行,如Linux容器只能在Linux主机上运行。
  5. 安全性

    • 虚拟机由于提供了完全的硬件隔离,因此安全性较高。
    • 容器由于共享内核,如果内核存在漏洞,可能会影响所有容器,因此安全性相对较低。

总结:虚拟化提供了更强的隔离性和更广泛的操作系统支持,但资源占用多,性能开销大;而容器提供了更轻量级的隔离,资源占用少,性能开销小,但隔离性和安全性相对较低。

小结:

本篇章节为 【第一阶段】SERVICES-DAY6 的学习笔记,这篇笔记可以初步了解到 Linux容器基础、Linux容器管理、podman命令行、管理容器进阶。除此之外推荐参考相关学习网址:

  • Podman
  • 什么是 Podman?
  • podman 和 docker 的比较和区别 | Laravel China 社区

Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

后端接口返回图片,前端的处理方法

接口返回如下图所示&#xff1a; 打印结果如下图所示&#xff1a; 出现问题的原因的axios默认返回的是json文本形式&#xff0c;二进制图片数据被强制转换成了 json 文本形式 处理方法&#xff1a; 首先&#xff0c;在axios中&#xff0c;将responseType默认返回数据类型json…

Python轻量级邮件发送库库之salmon使用详解

概要 电子邮件是现代通信的基础,在许多应用程序中,自动发送电子邮件是一个常见需求。salmon-mail 是一个基于 Python 的轻量级邮件发送库,它提供了简洁且强大的 API,用于处理电子邮件的发送和管理。本文将详细介绍 salmon-mail 库,包括其安装方法、主要特性、基本和高级功…

React 学习——行内样式、外部样式、动态样式

三种样式的写法 import "./index.css"; //同级目录下的样式文件 function App() {const styleCol {color: green,fontSize: 40px}// 动态样式const isBlock false;return (<div className"App">{/* 行内样式 */}<span style{{color:red,fontSiz…

科技引领水资源管理新篇章:深入剖析智慧水利解决方案,展现其在提升水资源利用效率、优化水环境管理方面的创新实践

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

破解网络奥秘:一图胜千言,TCP重传、滑动窗口、流量与拥塞控制全解析

引言 TCP 是一个非常复杂且伟大的协议&#xff0c;它通过许多机制来确保传输的可靠性。为了实现这一目标&#xff0c;TCP需要处理各种问题&#xff0c;比如数据损坏、丢包、重复数据以及分片顺序混乱等。如果这些问题得不到解决&#xff0c;可靠传输就无从谈起。 众所周知&am…

C++系列-list的模拟实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 构造函数生成 template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;ListNode(const T& data T()):_next(nullptr),_prev…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

Linux嵌入式学习——数据结构——概念和Seqlist

数据结构 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff0c;数据和数据之间是一对一的关系。数组就是线性表的一种。 树&#xff0c; 一对多 图&#xff0c;多对多 …

压测实操--kafka broker压测方案

作者&#xff1a;九月 环境信息&#xff1a; 操作系统centos7.9&#xff0c;kafka版本为hdp集群中的2.0版本。 kafka broker参数 num.replica.fetchers&#xff1a;副本抓取的相应参数&#xff0c;如果发生ISR频繁进出的情况或follower无法追上leader的情况则适当增加该值&…

Java---String类

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 在C语言中已经涉及到字符串了…

[前端]解决Iframe即使设置高度100%,但还是显示滚动条scrollbar的问题

前言 好烦,你看看这两个重复的滚动条. 一个是来自iframe,另一个来自父级的div(overflow: auto;) 我已经在css中设置了iframe的height: 100%;border: none;,但无论如何还是显示出了父级的scrollbar 解决 将iframe的display: block;即可. 或者vertical-align: bottom;

【启明智显分享】基于国产Model3芯片的7寸触摸屏助力智慧医疗,电子床头屏提升护理交互

未来医院必然是以信息化为基础&#xff0c;以物联网为特征&#xff0c;以医疗为核心的服务型医院。病房作为医院的重要服务场所&#xff0c;成为智慧医院建设的重要一环。 为提高医护人员与患者的互动交流&#xff0c;给医疗注入智慧元素&#xff0c;让患者享受智能服务&#…

java实现OCR图片识别,RapidOcr开源免费

先看一下识别效果&#xff08;自我感觉很牛逼&#xff09;&#xff0c;比Tess4J Tesseract省事&#xff0c;这个还需要训练&#xff0c;安装软件、下载语言包什么的 很费事&#xff0c;关键识别率不高 RapidOcr不管文字的横竖&#xff0c;还是斜的都能识别&#xff08;代码实现…

接口自动化测试框架实战-1-项目环境搭建

上一小节中我们讲解了一下本次接口自动化测试框架的大致架构设计和功能概览&#xff0c;本小节我们讲解一下整个项目开发环境的搭建方法。 1、python基础环境 安装python3版本&#xff1a;建议3.9.6版本及以上即可 新建项目的虚拟环境&#xff1a;virtualenv或者pycharm自带的…

张高兴的 MicroPython 入门指南:(三)使用串口通信

目录 什么是串口使用方法使用板载串口相互通信 硬件需求电路代码使用板载的 USB 串口参考 什么是串口 串口是串行接口的简称&#xff0c;这是一个非常大的概念&#xff0c;在嵌入式中串口通常指 UART(Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器)。…

深入浅出消息队列----【核心之消息的发送】

深入浅出消息队列----【核心之消息的发送】 普通消息同步消息异步消息 单向消息顺序消息延迟消息批量消息 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&#xff1a;编程导航-鱼皮【yes哥深入浅出消息队列专栏】 根据 RocketMQ 官方&am…

工程视角:数据结构驱动的应用开发--字典(dictionary),列表(list)与实体

这里写目录标题 业务业务场景流程分析 实现数据访问层&#xff08;DAL&#xff09;业务逻辑层&#xff08;BLL&#xff09;用户界面层&#xff08;UI&#xff09;工具类 设计思路为什么抽出工具类关于U层使用字典的好处工程视角 业务 业务场景 在一个金融应用系统中&#xff0c…

【JavaScript】虚拟 DOM

虚拟 DOM 是⼀层对真实DOM的抽象&#xff0c;以JavaScript 对象 (VNode 节点) 作为基础的树&#xff0c;⽤对象的属性来描述节点&#xff0c;最终可以通过⼀系列操作使这棵树映射到真实环境上。 虚拟DOM 表现为⼀个 Object对象。并且最少包含标签名 (tag)、属性 (attrs) 和⼦元…

多路复用IO、TCP并发模型

时分复用 CPU单核在同一时刻只能做一件事情&#xff0c;一种解决办法是对CPU进行时分复用(多个事件流将CPU切割成多个时间片&#xff0c;不同事件流的时间片交替进行)。在计算机系统中&#xff0c;我们用线程或者进程来表示一条执行流&#xff0c;通过不同的线程或进程在操作系…

HarmonyOS 本地真机运行

目录 官网地址 1.开发工具设置签名 2.手机开启开发者模式 3.使用USB连接方式 4.使用无线调试连接方式 5.常见的问题 官网地址 使用真机运行应用 使用本地真机运行应用/服务 1.开发工具设置签名 官网应用/服务签名 1.左上角文件--项目结构-勾选自动生成签名-Sign in登录 2…