主要内容:
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.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)
[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 1500
inet 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中的容器是用来部署应用,将软件打包成标准化单元,用于开发、交付和部署,容器技术已经成为应用程序封装和交付的核心技术;
容器的优点:
- 资源效率:容器共享主机操作系统的内核,因此它们占用的资源比虚拟机少得多。
- 启动速度快:容器的启动时间通常以秒计,而虚拟机的启动时间可能需要几分钟。
- 一致性:容器提供了一致的运行环境,确保应用在开发、测试和生产环境中的行为一致。
- 可移植性:容器使用的共享公共库和程序,容器可以轻松地在不同的环境中迁移,无论是物理机、虚拟机还是云平台。
- 隔离性:虽然共享内核,但容器提供了良好的进程和资源隔离,确保应用之间的相互影响最小化。
容器的缺点:
- 安全性:由于容器共享主机操作系统的内核,如果内核存在漏洞,所有容器都可能受到影响。容器的隔离性没有虚拟化强,共用Linux内核,安全性不可靠;
- 操作系统限制:容器通常只能在相同或兼容的操作系统上运行,例如,Linux容器不能直接在Windows主机上运行。
- 复杂性:对于复杂的应用,管理和编排多个容器可能变得复杂。
1、Podman和容器的关系
Podman(Pod Manager)是一个开源的容器管理工具,由Red Hat开发。它是一个无守护进程的容器引擎,允许用户以非root用户身份运行容器。Podman的设计目标是提供与Docker兼容的命令行接口,同时避免Docker守护进程带来的安全和管理问题。
Podman可以直接管理容器、镜像、卷和网络,支持OCI(Open Container Initiative)标准,可以运行和管理符合OCI标准的容器。
2、Podman和Docker的关系
Podman和Docker都是容器管理工具,但它们在设计和实现上有一些关键的区别:
- 守护进程:Docker依赖于一个后台守护进程(Docker daemon)来管理容器,而Podman不需要守护进程,直接通过系统调用与容器交互。
- 用户权限:Podman允许非root用户运行和管理容器,而Docker通常需要root权限。
- 兼容性:Podman提供了与Docker兼容的命令行接口,这意味着用户可以相对容易地从Docker迁移到Podman。
- 安全性:由于没有守护进程,Podman在安全性方面可能更有优势,因为它减少了潜在的攻击面
二、镜像、仓库与容器 概念
镜像、仓库与容器是容器化技术的三个核心概念,它们共同构成了容器生态系统的基础。下面将详细介绍每个概念的含义及其相互关系。
1、镜像(Image)
镜像是一个轻量级、独立的、可执行的软件包,包含运行应用程序所需的一切:代码、运行时环境、系统工具、系统库和设置。镜像是一个静态的概念,可以被看作是一个容器的“模板”。镜像通常是只读的,确保了环境的一致性和可重复性。
镜像可以通过 Dockerfile 来定义,Dockerfile 是一个文本文件,包含了一系列的指令,用于自动化地构建镜像。
2、仓库(Repository)
仓库是用于存储和分发镜像的地方。仓库可以被看作是一个集中式的存储库,用户可以从中拉取(下载)镜像到本地,也可以将本地的镜像推送到仓库中。仓库可以是公开的,如 Docker Hub,也可以是私有的,用于企业内部或特定团队使用。
仓库中的每个镜像都有一个唯一的标签(tag),用于区分不同版本的镜像。例如,一个镜像可以有
latest
、1.0
、2.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等)。
两者的联系:
容器和虚拟化都是为了实现资源的隔离和分配,使得多个应用或操作系统可以在同一台物理机上运行,而不会相互干扰。它们都可以提高硬件的利用率,简化应用的部署和管理。
两者的区别:
隔离级别:
- 虚拟化提供的是硬件级别的隔离,每个虚拟机都有自己的操作系统和内核,因此隔离性更强。
- 容器提供的是操作系统级别的隔离,容器共享主机操作系统的内核,因此隔离性相对较弱。
资源占用:
- 虚拟机需要为每个Guest OS分配独立的资源,因此资源占用较多,启动和运行速度较慢。
- 容器共享主机操作系统的内核,因此资源占用较少,启动和运行速度较快。
性能:
- 虚拟机由于需要模拟硬件,因此性能开销较大。
- 容器由于直接使用主机操作系统的内核,因此性能开销较小。
操作系统支持:
- 虚拟机可以运行不同类型的操作系统,如Windows虚拟机可以在Linux主机上运行。
- 容器通常只能在相同类型的操作系统上运行,如Linux容器只能在Linux主机上运行。
安全性:
- 虚拟机由于提供了完全的硬件隔离,因此安全性较高。
- 容器由于共享内核,如果内核存在漏洞,可能会影响所有容器,因此安全性相对较低。
总结:虚拟化提供了更强的隔离性和更广泛的操作系统支持,但资源占用多,性能开销大;而容器提供了更轻量级的隔离,资源占用少,性能开销小,但隔离性和安全性相对较低。
小结:
本篇章节为 【第一阶段】SERVICES-DAY6 的学习笔记,这篇笔记可以初步了解到 Linux容器基础、Linux容器管理、podman命令行、管理容器进阶。除此之外推荐参考相关学习网址:
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解