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.mzph.cn/web/48155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用kali对操作系统和网络服务类型进行探测

1&#xff0e;在Kali终端中输入命令“nmap –sS –n -O 192.168.2.2”&#xff0c;探测目标主机的操作系统类型 2&#xff0e; 在Kali终端中输入命令“nmap –sV -n 192.168.2.2”&#xff0c;探测目标主机开启的网络服务类型 3.在Kali终端中输入命令“nmap –A -n 192.168.2.2…

vue3前端开发-小兔鲜项目-产品详情基础数据渲染

vue3前端开发-小兔鲜项目-产品详情基础数据渲染&#xff01;这一次内容比较多&#xff0c;我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步&#xff0c;还是老规矩&#xff0c;先准备好接口函数。方便我们的页面组件拿到对…

掌握互联网路由选择协议:从基础入门到实战

文章目录 路由选择协议的基本概念路由选择算法的分类分层次的路由选择协议路由信息协议&#xff08;RIP&#xff09;内部网关协议&#xff1a;OSPF外部网关协议&#xff1a;BGP互联网中的实际应用总结 互联网的路由选择协议是网络通信的核心&#xff0c;它决定了数据包如何在网…

Sentinel初步了解

概念 Sentinel面向分布式、多语言异构化服务框架的流量治理组件。 相关文档https://github.com/alibaba/Sentinel/wiki/ 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务&#xff0c;这就是所谓的“扇出…

Manticore Search(es轻量级替代)

概念&#xff1a; Manticore Search 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx&#xff0c;显着改进了它的功能&#xff0c;修复了数百个错误&#xff0c;几乎完全重写了代码并保…

MySQL第四次作业

1.修改student表中年龄字段属性&#xff0c;数据类型由int改变为smallint 2.为course表中cno课程学号设置索引&#xff0c;并查看索引 &#xff08;3&#xff09;为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xff0c;索引名为SC_INDEX &#xff08;4&#xff0…

mysql对数据库的增删改

目录 DML语句&#xff1a; 增加数据&#xff08;insert语句&#xff09; 增加数据&#xff08;insert into select&#xff09; 修改数据&#xff08;update语句&#xff09; 【where 子句条件】 删除数据&#xff08;delete语句&#xff09; 删除数据&#xff08;trunca…

NO.1 Hadoop概述

1.1 Hadoop是什么 1.2 Hadoop优势 1.3 Hadoop组成 1.3.1 HDFS架构概述 1.3.2 YARN架构概述 1.3.3 MapReduce架构概述 1.3.4 HDFS、YARN、MapReduce三者关系 1.4 大数据技术生态体系 1.5 推荐系统框架图

数据结构C++——优先队列

文章目录 一、定义二、ADT三、优先队列的描述3.1 线性表3.2 堆3.2.1 最大堆的ADT3.2.2 最大堆的插入3.2.3 最大堆的删除3.2.4 最大堆的初始化3.3 左高树 LT3.3.1 高度优先左高树HBLT3.3.2 重量优先左高树WBLT3.3.3 最大HBLT的插入3.3.4 最大HBLT的删除3.3.5 合并两棵最大HBLT3.…

QT总结——图标显示坑

最近写代码遇到一个神仙大坑&#xff0c;我都怀疑我软件是不是坏了&#xff0c;这里记录一下。 写qt工程的时候我们一般会设置图标&#xff0c;这个图标是窗体的图标同时也是任务栏的图标&#xff0c;但是我发现生成的exe没有图标&#xff0c;这个时候就想着给他加一个图标&…

AI学习记录 - 激活函数的作用

试验&#xff0c;通过在线性公式加入激活函数&#xff0c;可以拟合复杂的情况&#xff08;使用react实现&#xff0c;原创&#xff09; 结论:1、线性函数的叠加&#xff0c;无论叠加多少次&#xff0c;都是线性的 如下图 示例代码 线性代码&#xff0c;使用ykxb的方式&…

【BUG】已解决:ValueError: All arrays must be of the same length

ValueError: All arrays must be of the same length 目录 ValueError: All arrays must be of the same length 【常见模块错误】 【解决方案】 问题原因 解决方法 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&…

Python爬虫实战案例(爬取图片)

爬取图片的信息 爬取图片与爬取文本内容相似&#xff0c;只是需要加上图片的url&#xff0c;并且在查找图片位置的时候需要带上图片的属性。 这里选取了一个4K高清的壁纸网站&#xff08;彼岸壁纸https://pic.netbian.com&#xff09;进行爬取。 具体步骤如下&#xff1a; …

Ubuntu-文件管理器中鼠标右键添加文本文件

文件管理器中鼠标右键添加文本文件 一、概述二、步骤 一、概述 Ubuntu在文管右键发现没有创建文本文件的菜单&#xff0c; 期望如下所示&#xff0c;这样的操作非常简单 二、步骤 找到模板文件夹 在模板文件夹&#xff0c;创建自己想要的文件就好啦 这个也是支持放文件夹去…

【C++】学习笔记——哈希_1

文章目录 十八、哈希1. unordered系列关联式容器2. 底层结构哈希函数哈希冲突 未完待续 十八、哈希 1. unordered系列关联式容器 在C11中&#xff0c;STL又提供了4个unordered系列的关联式容器&#xff0c;这四个容器与红黑树结构的关联式容器使用方式基本类似&#xff0c;只…

Linux云计算 |【第二阶段】AUTOMATION-DAY1

主要内容&#xff1a; 版本控制&#xff08;集中式、分布式&#xff09;、Git基础&#xff08;服务端、客户端部署&#xff0c;基础命令操作、文档版本管理&#xff09;、Git进阶&#xff08;数据恢复、分支、冲突管理&#xff09; 一、版本控制概念 版本控制是一种记录文件变…

iterm2工具的使用|MAC电脑终端实现分屏|iterm2开启滚动操作

iterm2 工具概括 iTerm2 是一款非常强大的终端工具。 iTerm2 最初是为 macOS 开发的,但也有 Windows 、Linux 发行版&#xff08;Ubuntu、centos…&#xff09;可用。 应用场景 Mac操作系统中想实现终端分屏 iterm2 工具特点 多标签和分屏: 可以在同一个窗口中打开多个标签…

leetcode日记(48)排列序列

这道题想到了规律就不算难&#xff0c;列了好几个示例想出的规律&#xff0c;试着排序几个就会了 class Solution { public:string getPermutation(int n, int k) {string result;int m1;int i1;for(i;i<n;i) m*i;i--;int pm/i;string s;for(int j0;j<n;j) s.append(to_…

基于VUE的软件项目开发管理系统/项目管理系统/软件开发过程管理系统的设计与实现

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括软件项目开发管理系统的网络应用&#xff0c;在外国软件项目开发管理系统已经是很普遍的方式&#xff0c;不过国内的软件项目开发管理可能还处于起步阶段。软件项目开发…

【计算机网络】三次握手、四次挥手

问&#xff1a;三次握手 四次挥手 TCP 连接过程是 3 次握手&#xff0c;终止过程是 4 次挥手 3次握手 第一步&#xff1a;客户端向服务器发送一个带有 SYN&#xff08;同步&#xff09;标志的包&#xff0c;指示客户端要建立连接。 第二步&#xff1a;服务器收到客户端的请求…