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(永久修改)

bash 复制代码
[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(永久修改)

bash 复制代码
[root@svr8 ~]# vim /etc/selinux/config
SELINUX=disabled

3.关闭防火墙

bash 复制代码
[root@svr8 ~]# systemctl stop firewalld.service
[root@svr8 ~]# systemctl disable firewalld.service

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

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

bash 复制代码
[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个仓库的位置;

bash 复制代码
[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.repo
 
Repo-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)

bash 复制代码
[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.修改网卡的网络配置参数

bash 复制代码
[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 1500
        inet 192.168.4.208  netmask 255.255.255.0  broadcast 192.168.4.255

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

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

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

真机:

bash 复制代码
[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:

bash 复制代码
[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.ioquay.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工具

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

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

四、Podman镜像管理

1、获取镜像命令

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

格式:podman search 关键字

bash 复制代码
podman search httpd

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

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

bash 复制代码
podman pull localhost/myos:latest

③ 导入镜像

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

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

bash 复制代码
[root@svr8 ~]# podman images
REPOSITORY   TAG   IMAGE ID   CREATED   SIZE

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

bash 复制代码
[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

例如:

bash 复制代码
[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 [-选项] 镜像名称:镜像标签 启动解释器

bash 复制代码
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 启动解释器

例如:启动容器

bash 复制代码
[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关闭才能及进行删除操作;)

例如:删除容器

bash 复制代码
[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

bash 复制代码
podman run -itd -p 80:80 myos:httpd

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

例如:

bash 复制代码
[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 宿主机对象:容器内对象 镜像名称:标签

例如:

bash 复制代码
[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-容器名

例如:

bash 复制代码
[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命令行、管理容器进阶。除此之外推荐参考相关学习网址:


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

相关推荐
鼠鼠龙年发大财4 分钟前
【x**3专享】安装SSH、XFTP、XShell、ARM Linux
linux·arm开发·ssh
nfgo7 分钟前
快速体验Linux发行版:DistroSea详解与操作指南
linux·ubuntu·centos
汀、人工智能15 分钟前
修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)
docker·容器
吃面不喝汤6640 分钟前
如何配置和使用自己的私有 Docker Registry
运维·docker·容器
Rookie_explorers1 小时前
Linux下go环境安装、环境配置并执行第一个go程序
linux·运维·golang
学习向前冲1 小时前
AD域控服务器
运维·服务器
weixin_424215841 小时前
shell运算实战案例-KFC点餐系统
linux·centos
Leighteen1 小时前
Docker常用命令
docker·容器
hgdlip1 小时前
查看ip地址的方法有几种?探索多样方法
运维·服务器·ip地址
丶21361 小时前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker