首页 > 其他分享 >RHCE(podman容器)

RHCE(podman容器)

时间:2024-03-19 09:24:30浏览次数:23  
标签:ago 容器 RHCE podman client ubuntu root

一:容器的基础

1:为什么会出现容器?

 开发和运维的矛盾:就是开发人员有个环境来专门进行开发使用的,运维人员的服务器上面没有开发的环境,因为,不是开发人员,如果添加了,服务器的占用的内存就大了起来,所以就出现了一个问题,当开发的东西放到运维的上面时,因为没有环境,这个就部署不上去,就会报错,这个时候就互相扯皮,效率大大减少;因此出现了容器,就是将开发的环境一并打包,部署在服务器上面,这样就能部署成功

2:容器解决的问题和容器的优势

 运行环境的一致性:就是不会导致在开发的时候一个环境,在运维的时候,又是另一个环境,环境的一致性,能够在不同的linux上面运行

安全性:容器和容器之间互不干扰,就是都是基于镜像创建的容器,会在上面有个容器的可写层,当对A容器进行操作的时候,修改的内容都会在A的可写层上面,登录到B容器上面,没有变化;每一个容器之间都有自己的根文件系统

 

优势:一次构建(镜像),多次运行(容器)

3:容器的基本组成

镜像:就是制作容器的模版(里面有httpd的服务所依赖的环境)

容器:根据镜像创建容器,对镜像的操作都包含在可写层上面的

镜像仓库:就是提供多个镜像的地方,表现的方式就是url

4:容器与虚拟机的对比

1、隔离性(安全性)

 容器是共享物理机的内核的,在系统上一个容器就会有一个进程,多个容器就是多个进程

虚拟机时有自己的内核,不靠物理机的内核

所以的话,就是当虚拟机的内核挂了,不会影响到其他虚拟机的内核(安全性高)

物理机的内核挂了的话,物理机上面的所有容器都运行不了

2、资源的占用率(容器是轻量级,虚拟机是重量级虚拟化)

vm虚拟机会占用更多的资源,会虚拟出一整套的操作系统出来

容器只会运行需要的服务和软件

  例如:运行http服务,虚拟机会虚拟出一整套的操作环境来跑httpd服务,可能有chrony服务,nfs服务等,总之就是有很多无关的东西

  容器只会安装软件和依赖文件,只会运行相关的·软件

3、镜像大小的对比

虚拟机的镜像是GB级别的,

容器的镜像MB级别的(不会安装多余的命令,vim都没有)

4:镜像标准

虚拟机的镜像格式众多,通用的格式就是ova/ovf

容器的镜像大部分是OCI(open container image),就是很通用的

5:启动速度和创建的速度

虚拟机的启动速度是以分钟为单位的,安装一个操作系统10多分钟

容器的创建是以秒为单位的,创建一个容器几秒

6:资源颗粒(就是能跑几个主机)

在计算节点上的虚拟机一般运行上百个

容器的数量运行可达上万个

总之,容器的好处是大于虚拟机的

 

5:容器的三种技术

1、名称空间(namespace)

 就是能够独立的互不干扰的

unshare --net --fork /bin/bash  隔离网络

unshare --user --fork /bin/bash

unshare --mount --fork /bin/bash

2、资源控制

 就是创建一个容器来不可能把所有的资源全部分配给他,所以的话,需要一个东西来控制他。容器里面的/proc里面的mem,cpu等

3、根文件系统

就是每个容器运行的时候,都会有一个根文件系统的存在,删除了容器运行的镜像的话,所有的容器都会消失

6:podman与docker的比较

 最大的区别是:podman没有守护进程,它是分为几个模块来操作的,docker是一个c/s架构的,podman是一个容器的管理工具

podman兼容docker,docker命令也能使用podman

podman能够用的,docker不一定能使用,比如,无根容器,普通用户运行的容器就是无根容器,podman能够将容器做成服务管理

1、架构

podman是一个管理工具,没有任何服务

docker是一个c/s的架构,docker dameon守护进程,进程没有了,docker就无法使用了

2、特权

podman有无根容器,普通用户可以运行容器

3、安全性

如果系统的容器被损坏的话,最多的只能获取普通用户的权限,因为使用的是无根容器(不会对系统造成很大的破坏)

4、systemd服务

podman可以将容器做成一个服务进行管理,poman和systemd进行集成

5、模块管理

buildah  专门构建镜像的

skopeo  专门存储镜像到镜像仓库的

docker的核心就是docker-daemon,所有的工作都有他做

 

podman安装:
从rhel8开始后,podman就集成到操作系统中了,自带的podman是不完全的

安装一个容器的工具的软件包,container-tools

podman:管理容器和镜像

skopeo:检查,复制等镜像

buildah:构建镜像

二:容器的操作

1:镜像的操作

案例:

#查看系统上的镜像
[root@client /]# podman  images
REPOSITORY             TAG         IMAGE ID      CREATED      SIZE
quay.io/centos/centos  latest      300e315adb2f  3 years ago  217 MB


#查看镜像的详细信息(就是分层的查看)
#网络什么的,都有,非常的详细,经常要用的
[root@client /]# podman inspect quay.io/centos/centos:latest 
[
     {
          "Id": "300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
          "Digest": "sha256:8301d100020ffaedc93f57d8c8bb0e8e88006862bcb48ebc5dfbe1d1cb83060c",
          "RepoTags": [
               "quay.io/centos/centos:latest"
          ],

#查远程镜像的详细信息(需要使用skopeo这个命令),需要安装软件包即可
[root@client /]# skopeo  inspect docker://uhub.service.ucloud.cn/rhel97/ubuntu:2024-3-17 
{
    "Name": "uhub.service.ucloud.cn/rhel97/ubuntu",
    "Digest": "sha256:be80696addbcab0ffe0fced1d1ef4e309da49dc25a6849ec70ea27a01ca45cf7",
    "RepoTags": [
        "2024-3-17"
    ],
    "Created": "2024-02-27T18:52:59.070788584Z",
    "DockerVersion": "24.0.5",
    "Labels": {
        "org.opencontainers.image.ref.name": "ubuntu",
        "org.opencontainers.image.version": "22.04"

#搜索镜像
[root@client /]# podman search centos
NAME                                        DESCRIPTION
quay.io/wildfly/wildfly-centos7             WildFly S2I image
quay.io/wildfly/wildfly-runtime-centos7     WildFly runtime image. Base image to be used in multi stage builds or chained builds.  Steps: - Build application with WildFly S2I image. Application and server are copied to `/s2i-output/server` - Create a docker multi stage build from this image to copy `/s2i-output/server`  from S2I generated image.  Example:  `FROM wildfly/wildfly-runtime-centos7:latest`  `COPY --from=wildflytest:latest /s2i-output/server $JBOSS_HOME`  `USER root`  `RUN chown -R jboss:root $JBOSS_HOME && chmod -R ug+rwX $JBOSS_HOME`  `RUN ln -s $JBOSS_HOME /wildfly`  `USER jboss`  `CMD $JBOSS_HOME/bin/openshift-launch.sh`


#拉取镜像
[root@client /]# podman pull ubuntu:14.04
Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/ubuntu:14.04...
Getting image source signatures
Copying blob 512123a864da done  
Copying blob 0551a797c01d done  
Copying blob 2e6e20c8e2e6 done  
Copying config 13b66b4875 done  
Writing manifest to image destination
Storing signatures
13b66b487594a1f2b75396013bc05d29d9f527852d96c5577cc4f187559875d0

#修改镜像的名称
[root@client /]# podman tag docker.io/library/ubuntu:14.04 qcy/ubuntu:v1
[root@client /]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/ubuntu  14.04       13b66b487594  2 years ago  206 MB
localhost/qcy/ubuntu      v1          13b66b487594  2 years ago  206 MB
quay.io/centos/centos     latest      300e315adb2f  3 years ago  217 MB


#删除镜像
[root@client /]# podman rmi docker.io/library/ubuntu:14.04 
Untagged: docker.io/library/ubuntu:14.04
[root@client /]# podman images
REPOSITORY             TAG         IMAGE ID      CREATED      SIZE
localhost/qcy/ubuntu   v1          13b66b487594  2 years ago  206 MB
quay.io/centos/centos  latest      300e315adb2f  3 years ago  217 MB


#将镜像打包的操作,然后导入到另一个主机上面去
[root@client /]# podman save -o ubuntu.tar localhost/qcy/ubuntu:v1 
Copying blob f2fa9f4cf8fd done  
Copying blob 30d3c4334a23 done  
Copying blob 83109fa660b2 done  
Copying config 13b66b4875 done  
Writing manifest to image destination
Storing signatures
#一定要使用ssh登录,否则会报错,而且每个用户的容器的环境都是单独的
[q7@client /]$ ls
afs  boot  etc   lib    media  opt   root  sbin  sys  ubuntu.tar  var
bin  dev   home  lib64  mnt    proc  run   srv   tmp  usr
[q7@client /]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
[q7@client /]$ podman load < ubuntu.tar 
Getting image source signatures
Copying blob 83109fa660b2 done  
Copying blob f2fa9f4cf8fd done  
Copying blob 30d3c4334a23 done  
Copying config 13b66b4875 done  
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/qcy/ubuntu:v1
[q7@client /]$ podman images
REPOSITORY            TAG         IMAGE ID      CREATED      SIZE
localhost/qcy/ubuntu  v1          13b66b487594  2 years ago  206 MB

2:容器的操作

容器是为了服务而生的,如果一个容器内部的服务结束掉了,那么这个容器也会退出

#创建一个容器
# -d放在后台运行,-i交互式,-t分配一个终端,如果/bin/bash没有的话,就是使用/bin/sh即可
[root@client /]# podman run  -tid localhost/qcy/ubuntu:v1   /bin/bash
80ca3f37b741e3151d4da8ac378787f252383c16cbf6c0daf4e5b3137a179243
[root@client /]# podman ps 
CONTAINER ID  IMAGE                    COMMAND     CREATED        STATUS            PORTS       NAMES
80ca3f37b741  localhost/qcy/ubuntu:v1  /bin/bash   5 seconds ago  Up 5 seconds ago              modest_pasteur

#列出运行的容器
[root@client /]# podman ps 
CONTAINER ID  IMAGE                    COMMAND     CREATED        STATUS            PORTS       NAMES
80ca3f37b741  localhost/qcy/ubuntu:v1  /bin/bash   5 seconds ago  Up 5 seconds ago              modest_pasteur

#列出所有的容器
[root@client /]# podman ps -a
CONTAINER ID  IMAGE                    COMMAND         CREATED        STATUS            PORTS       NAMES
9a36695bf8bb  localhost/qcy/ubuntu:v1  -tid /bin/bash  2 minutes ago  Created                       vibrant_khayyam
80ca3f37b741  localhost/qcy/ubuntu:v1  /bin/bash       2 minutes ago  Up 2 minutes ago              modest_pasteur

#在运行容器的时候,指定容器的名称
#运行完之后也可以改名使用--rename
[root@client /]# podman run --name superq -tid  localhost/qcy/ubuntu:v1   /bin/bash
39d115badcd8f99b1c6b28927d5e4c4cbec27922e599ea4c20fb263ec453ac74
[root@client /]# podman ps 
CONTAINER ID  IMAGE                    COMMAND     CREATED        STATUS            PORTS       NAMES
80ca3f37b741  localhost/qcy/ubuntu:v1  /bin/bash   6 minutes ago  Up 6 minutes ago              modest_pasteur
39d115badcd8  localhost/qcy/ubuntu:v1  /bin/bash   4 seconds ago  Up 4 seconds ago              superq

#在运行容器的时候,执行命令(就是查看的容器的里面的东西)
#运行完这个命令,这个容器就结束了
[root@client /]# podman run --name q1 localhost/qcy/ubuntu:v1   cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.6 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.6 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
[root@client /]# podman ps -a
CONTAINER ID  IMAGE                    COMMAND               CREATED        STATUS                     PORTS       NAMES
9a36695bf8bb  localhost/qcy/ubuntu:v1  -tid /bin/bash        8 minutes ago  Created                                vibrant_khayyam
80ca3f37b741  localhost/qcy/ubuntu:v1  /bin/bash             8 minutes ago  Up 8 minutes ago                       modest_pasteur
39d115badcd8  localhost/qcy/ubuntu:v1  /bin/bash             2 minutes ago  Up 2 minutes ago                       superq
f57ef8dd03b0  localhost/qcy/ubuntu:v1  cat /etc/os-relea...  9 seconds ago  Exited (0) 10 seconds ago              q1

#删除容器
#使用$这个来列出所有的容器的id
[root@client /]# podman rm -f $(podman ps -aq)
80ca3f37b741e3151d4da8ac378787f252383c16cbf6c0daf4e5b3137a179243
39d115badcd8f99b1c6b28927d5e4c4cbec27922e599ea4c20fb263ec453ac74
[root@client /]# podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

#进入容器的方式
#attach进入,退出后,容器结束
[root@client /]# podman attach q1
root@3d842f79ca0a:/# exit 
exit

[root@client /]# podman ps -a
CONTAINER ID  IMAGE                    COMMAND     CREATED        STATUS                    PORTS       NAMES
3d842f79ca0a  localhost/qcy/ubuntu:v1  /bin/bash   2 minutes ago  Exited (0) 4 seconds ago              q1

#使用exec进入容器(退出后,容器还在运行)
[root@client /]# podman exec -ti q1 /bin/bash
root@3d842f79ca0a:/# exit
exit
[root@client /]# podman ps 
CONTAINER ID  IMAGE                    COMMAND     CREATED        STATUS             PORTS       NAMES
3d842f79ca0a  localhost/qcy/ubuntu:v1  /bin/bash   7 minutes ago  Up 24 seconds ago              q1


#基于容器生成镜像
#就是对容器做了一些操作,然后把他做成一个镜像,然后基于这个镜像创建容器,操作都在
#将容器导成一个包
[root@client /]# podman export q1 > q1.tar 
[root@client /]# ls
afs  boot  etc   lib    media  opt   q1.tar  run   srv  tmp         usr
bin  dev   home  lib64  mnt    proc  root    sbin  sys  ubuntu.tar  var

#导入成镜像
[root@client /]# podman import q1.tar 
Getting image source signatures
Copying blob 50011ed7c1e8 done  
Copying config fa0cdec10b done  
Writing manifest to image destination
Storing signatures
sha256:fa0cdec10bf6c4cd0dc8d447905d925a4b4c607bfacb7d875ff48a4be4847db5
[root@client /]# podman images
REPOSITORY             TAG         IMAGE ID      CREATED         SIZE
<none>                 <none>      fa0cdec10bf6  29 seconds ago  206 MB
localhost/qcy/ubuntu   v1          13b66b487594  2 years ago     206 MB
quay.io/centos/centos  latest      300e315adb2f  3 years ago     217 MB
#修改镜像的标签
[root@client /]# podman tag fa0cdec10bf6 qcy/ubuntu-z:v2
[root@client /]# podman images
REPOSITORY              TAG         IMAGE ID      CREATED             SIZE
localhost/qcy/ubuntu-z  v2          fa0cdec10bf6  About a minute ago  206 MB
localhost/qcy/ubuntu    v1          13b66b487594  2 years ago         206 MB
quay.io/centos/centos   latest      300e315adb2f  3 years ago         217 MB
[root@client /]# podman run --name q2 -tid localhost/qcy/ubuntu-z:v2  /bin/bash
29ddd904dfa9c1a9a805e44ba51cacc1db2f589aa8bd17ddac3afba7f0548520
#运行容器
[root@client /]# podman exec -ti q2 /bin/bash
root@29ddd904dfa9:/# ls
bin   dev  home  lib64  mnt  proc  root  sbin  sys  usr
boot  etc  lib   media  opt  q10   run   srv   tmp  var
root@29ddd904dfa9:/# cd q10/
root@29ddd904dfa9:/q10# ls
file1

3:搭建一个容器镜像仓库(网络)

操作指南 容器镜像库 UHub_文档中心_UCloud中立云计算服务商

首先要登录仓库,将本地的镜像推送到仓库,将删除 

 镜像仓库的配置文件:/etc/containers/下面的conf文件

用户镜像仓库的配置文件:~username/,config/containers/registries.conf(优先级更高)

国内的一些镜像仓库,阿里云,腾讯云等,ucloud.cn

配置镜像仓库

  1)使用引号包裹起来,多个镜像使用逗号隔开

  2)可以使用ip地址 主机名 来指定镜像仓库

  3)搜索镜像是从前往后的顺序进行搜索

#首先登录镜像仓库
[root@client /]# podman login uhub.service.ucloud.cn/rhel97
Username: 
Password: 
Login Succeeded!

#将本地镜像导入到这个容器镜像库中去
[root@client /]# podman pull centos
Resolved "centos" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull quay.io/centos/centos:latest...
Getting image source signatures
Copying blob 7a0437f04f83 done  
Copying config 300e315adb done  
Writing manifest to image destination
Storing signatures
300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
[root@client /]# podman images
REPOSITORY             TAG         IMAGE ID      CREATED      SIZE
quay.io/centos/centos  latest      300e315adb2f  3 years ago  217 MB

#打上标签(检查要用的)
[root@client /]# podman tag quay.io/centos/centos:latest uhub.service.ucloud.cn/rhel97/centos:2024-03-18

[root@client /]# podman images
REPOSITORY                            TAG         IMAGE ID      CREATED      SIZE
quay.io/centos/centos                 latest      300e315adb2f  3 years ago  217 MB
uhub.service.ucloud.cn/rhel97/centos  2024-03-18  300e315adb2f  3 years ago  217 MB
[root@client /]# podman push uhub.service.ucloud.cn/rhel97/centos:2024-03-18 
Getting image source signatures
Copying blob 2653d992f4ef done  
Copying config 300e315adb done  
Writing manifest to image destination
Storing signatures

#这样的话容器的镜像仓库就有了上传的镜像

4:容器数据的持久化保存

为什么,因为删除容器的话,容器里面的数据也就会消失,所以的话,就是用挂载的形式来保存数据,这样的话,就能永久的保存数据了

1、存储卷的保存

不需要考虑标签什么的,因为是有podman创建的,标签什么的都已经自定义好了

#本质就是将物理机的目录挂载给容器中的目录,可以挂多个目录
#创建存储卷
podman volume create data1
#运行一个容器
[root@client /]# podman run  --name q3 -v data1:/opt/data1 -ti localhost/qcy/ubuntu:v1 /bin/bash 
root@6d62ccd93724:/opt# cd data1/
root@6d62ccd93724:/opt/data1# ls
root@6d62ccd93724:/opt/data1# touch data1

#然后使用inspect查看挂载点在哪里
[root@client /]# podman inspect q3|grep data1
                    "Name": "data1",
                    "Source": "/var/lib/containers/storage/volumes/data1/_data",
                    "Destination": "/opt/data1",
                    "data1:/opt/data1",
                    "data1:/opt/data1:rw,rprivate,nosuid,nodev,rbind"
[root@client /]# cd /var/lib/containers/storage/volumes/
[root@client _data]# touch 22222
[root@client _data]# ls
22222  data1
[root@client _data]# podman exec -ti q3 /bin/bash
root@6d62ccd93724:/# cd /opt/data1/
root@6d62ccd93724:/opt/data1# ls
22222  data1

2、本地目录保存

 本质就是使用物理的目录挂载给容器中

#创建挂载点(将容器中的目录挂载在这个物理机上面)
[root@client /]# mkdir data2
#创建容器,大Z就是为了保证标签一致,也可以在创建目录的时候,修改标签
[root@client /]# podman run -d --name q4 -it -v /data2/:/opt/data2:Z localhost/qcy/ubuntu:v1 /bin/bash
7d5546e558252846f7d088b2d5ba61c66397254b7d9d7a7f0a814851adc2c6d2

#进入容器
[root@client data2]# podman exec -ti q4 /bin/bash
root@7d5546e55825:/opt# cd data2/
root@7d5546e55825:/opt/data2# ls
root@7d5546e55825:/opt/data2# touch 11
root@7d5546e55825:/opt/data2# exit
exit
[root@client data2]# ls
11
[root@client data2]# 

#查看selinux的标签
[root@client data2]# ll -Zd
drwxr-xr-x. 2 root root system_u:object_r:container_file_t:s0:c309,c994 16 Mar 19 16:16 .

#查看挂载的详细信息
[root@client data2]# podman inspect q4 | grep data2
                    "Source": "/data2",
                    "Destination": "/opt/data2",
                    "/data2/:/opt/data2:Z",
                    "/data2:/opt/data2:rw,rprivate,rbind"

  

5:无根容器

 就是普通用户运行的容器(非常安全)

优点:

1)普通用户创建的容器被入侵,攻击者最多只能获得普通用户的权限

2)允许多个用户在一台机器上运行容器

3)支持嵌套,容器中还能运行容器

使用无根容器的时候,一定要使用ssh连接普通用户,不要使用su - 切换用户,不然无法配置systemd服务,也就是将容器做成systemd服务,无根容器只能映射1024以上的端口

创建无根容器的镜像仓库的配置文件:

#进入到用户的家目录下
mkdir -p /home/q7/.config/containers
#配置文件拷贝过来
[q7@server .config]$ cp /etc/containers/registries.conf ./

 

三:容器的网络

 1:hosts网络模式

 就是直接使用虚拟机上面的网络设备,并且设备都是一样的,进入了之后,主机名和用户名都变了,但还是在容器里面的

图片:

 

#指定网络模式--network=host
#没有这个curl命令,虽然与虚拟机是一样的,但是还是一个容器
[root@client /]# podman run --name q2 --network=host  -ti localhost/qcy/ubuntu:v1 /bin/bash
root@client:/# ifconfig 
cni-podman0 Link encap:Ethernet  HWaddr 62:bb:54:58:6c:a0  
          inet addr:10.88.0.1  Bcast:10.88.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:167 errors:0 dropped:0 overruns:0 frame:0
          TX packets:63 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:10162 (10.1 KB)  TX bytes:6282 (6.2 KB)

ens160    Link encap:Ethernet  HWaddr 00:0c:29:ad:67:f9  
          inet addr:192.168.20.20  Bcast:192.168.20.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fead:67f9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5148 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2766 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2016895 (2.0 MB)  TX bytes:339005 (339.0 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:154 errors:0 dropped:0 overruns:0 frame:0
          TX packets:154 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:19513 (19.5 KB)  TX bytes:19513 (19.5 KB)

veth5b4f9a53 Link encap:Ethernet  HWaddr fa:38:7e:1b:75:61  
          inet6 addr: fe80::f838:7eff:fe1b:7561/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:43 errors:0 dropped:0 overruns:0 frame:0
          TX packets:63 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3358 (3.3 KB)  TX bytes:6341 (6.3 KB)

root@client:/# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
64 bytes from 183.2.172.42: icmp_seq=1 ttl=128 time=60.4 ms
^C
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 60.467/60.467/60.467/0.000 ms
root@client:/# curl www.baidu.com
bash: curl: command not found

  

 2、桥接模式

图片:

 

就是创建一个桥接的网卡,然后虚拟机上面的网卡有2张,cni-podman0(容器的网关的网卡),另外一张是veth5b4f9a53(容器的ip网卡)与容器里面的网卡是一样的

每次创建桥接桥接网卡后,再来创建一个容器,这样的话,就是会在虚拟机上面创建一个虚拟的桥接的网关的网卡,和容器网卡一样的veth网卡

#查看帮助
[root@client /]# man podman-network-create 

#查看容器的网络
[root@client ~]# podman network ls
NETWORK ID    NAME        DRIVER
2f259bab93aa  podman      bridge

#创建一个桥接网卡,并且分配一个ip范围,网关
[root@client /]# podman network create --subnet 192.168.30.0/24 --gateway 192.168.30.254 br0
br0
[root@client /]# podman network ls
NETWORK ID    NAME        DRIVER
0f1575ab177c  br0         bridge
2f259bab93aa  podman      bridge

#创建一个容器
podman run --name q3  -tid --network=br0 localhost/qcy/ubuntu:v1 /bin/bash
[root@client /]# podman exec -ti q3 /bin/bash
root@78dc4134719c:/# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
64 bytes from 183.2.172.42: icmp_seq=1 ttl=127 time=29.9 ms
^C

可以通过inspect查看详细的网络模式

[root@client ~]# podman network inspect br0
[
     {
          "name": "br0",
          "id": "0f1575ab177c63b4a9de71c81aaf76cd2680bc20fa9b0ba6444e14e5303803e8",
          "driver": "bridge",
          "network_interface": "cni-podman1",
          "created": "2024-03-19T18:13:12.680837929+08:00",
          "subnets": [
               {
                    "subnet": "192.168.30.0/24",
                    "gateway": "192.168.30.254"
               }
          ],
          "ipv6_enabled": false,
          "internal": false,
          "dns_enabled": false,
          "ipam_options": {
               "driver": "host-local"
          }
     }
]

1、自定义桥接模式(桥接到物理网卡上面去实现通信)

自定义桥接模式的网络默认是没有桥接到虚拟机的网卡上面的,需要用nmcli桥接上去

默认的桥接网络模式是桥接到物理网卡上面的

 

 

 

3、none网络模式

none网络模式就是没有网卡,用于测试用的,就是在让服务监听这个端口

#只有lo网卡
podman run --name q3  -tid --network=br0 localhost/qcy/ubuntu:v1 /bin/bash
podman exec -ti q3 /bin/bash
root@65c7c5f5aacb:/# ifconfig 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

4、使用容器搭建一个nginx服务

通过网路来进行通信的

#主机上所有ip地址的8080端口访问,就直接跳转到容器里面80端口上去
#拉取nginx服务镜像
podman pull  uhub.service.ucloud.cn/ucloud/nginx:latest 

#将本地的8080映射到容器的80端口,并且实现容器持久化的存在
 podman run -d  --name nginx01   --network=podman  -p 8080:80 -v /home/q7/data1/:/usr/share/nginx/html:Z uhub.service.ucloud.cn/ucloud/nginx:latest 
[q7@client data1]$ podman ps 
CONTAINER ID  IMAGE                                       COMMAND               CREATED         STATUS             PORTS                 NAMES
2be0bfa24042  uhub.service.ucloud.cn/ucloud/nginx:latest  nginx -g daemon o...  17 minutes ago  Up 17 minutes ago  0.0.0.0:8080->80/tcp  nginx01


#进入容器,修改网页
podman exec -ti nginx01  /bin/bash
root@2be0bfa24042:/usr/share/nginx/html# echo welcome rhel > index.html 
root@2be0bfa24042:/usr/share/nginx/html# cat index.html 
welcome rhel

#本地访问
[q7@client data1]$ curl localhost:8080
welcome rhel
[q7@client data1]$ cat index.html 
welcome rhel

但是有一个点就是,为什么访问不了虚拟机,和为什么访问不了外网

  

实现了通过容器部署一个服务,然后通过容器持久化和端口映射来实现访问了网页,但是为什么访问不了了

也能实现其他的主机访问这个主机的8080端口,也就跳转到容器的80端口上面了,不能直接访问这个容器的ip

图片:

 

四:容器和systemd进行集成

 就是将容器做成一个服务,实现开机自启的一个进程

好处:就是可以更好的管理容器,因为用户可以依赖于systemd来进行管理服务,更加有效率的管理容器

1、root用户集成:

为容器创建一个systemd单元文件,创建文件的时候,容器必须是运行的状态,

放在的目录为:/etc/systemd/system目录下(规定的服务的单元文件)

#首先要有一个正在运行的web服务的容器,然后根据这个容器做成一个服务
[root@client system]# podman ps 
CONTAINER ID  IMAGE                                       COMMAND               CREATED         STATUS             PORTS       NAMES
7e778ba09953  uhub.service.ucloud.cn/ucloud/nginx:latest  nginx -g daemon o...  15 minutes ago  Up 15 minutes ago              q1

[root@client ~]# podman generate systemd q1 --name --files --new 
--name     是以容器的名字作为单元文件
--file        将服务单元的内容生成一个文件(否则的话,输出在终端上面)
--new        每一次启动服务的时候,都是运行一个新的容器,不是对原来的容器进行停止和启动

#将生成的单元文件拷贝到/etc/systemd/system目录下(使用cp,不要使用mv)
[root@client ~]# cp ./container-q1.service  /etc/systemd/system/

#重新加载配置
[root@client system]# systemctl daemon-reload 

#设置开启自启
[root@client system]# systemctl enable container-q1.service 

#启动服务后,可以删除原有的容器,因为启动后,会生成一个容器,停止服务,这个容器就会删除(非常的方便)
[root@client system]# systemctl start container-q1.service 

#查看容器
[root@client system]# systemctl start container-q1.service 
[root@client system]# podman ps 
CONTAINER ID  IMAGE                                       COMMAND               CREATED        STATUS            PORTS       NAMES
f1522a469d27  uhub.service.ucloud.cn/ucloud/nginx:latest  nginx -g daemon o...  4 seconds ago  Up 4 seconds ago              q1

2、普通用户集成:

步骤:

#创建一个目录,专门存放单元配置文件的目录
[q7@client .config]$ mkdir -p  systemd/user

#生成一个单元文件
[q7@client user]$ podman generate systemd nginx01 --name --files --new 
/home/q7/.config/systemd/user/container-nginx01.service

#重新加载和设置开启自启
[q7@client user]$ systemctl --user daemon-reload 
[q7@client user]$ systemctl --user enable container-nginx01.service 
Created symlink /home/q7/.config/systemd/user/default.target.wants/container-nginx01.service → /home/q7/.config/systemd/user/container-nginx01.service.


#开机自启还需要修改一个东西
[q7@client user]$ loginctl show-user q7
UID=1000
GID=1000
Name=q7
Timestamp=Tue 2024-03-19 20:18:56 CST
TimestampMonotonic=27295284162
RuntimePath=/run/user/1000
[email protected]
Slice=user-1000.slice
Display=32
State=active
Sessions=32
IdleHint=no
IdleSinceHint=1710850920101540
IdleSinceHintMonotonic=27478512145
Linger=no

#将Linger的值设置为yes,普通用户的服务才能实现开机自启,如果没有开启这个功能的话,只有登录到普通用户时,容器的服务才能实现开机自启
[q7@client user]$ loginctl enable-linger q7
[q7@client user]$ loginctl show-user q7
UID=1000
GID=1000
Name=q7
Timestamp=Tue 2024-03-19 20:18:56 CST
TimestampMonotonic=27295284162
RuntimePath=/run/user/1000
[email protected]
Slice=user-1000.slice
Display=32
State=active
Sessions=32
IdleHint=no
IdleSinceHint=1710850936101540
IdleSinceHintMonotonic=27494512144
Linger=yes

reboot重启

标签:ago,容器,RHCE,podman,client,ubuntu,root
From: https://www.cnblogs.com/qm77/p/18078244

相关文章

  • 【Docker】wordpress 容器化部署
    WordPress标准软件基于Bitnamiwordpress构建。当前版本为6.4.3你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取配置文件地址:https://gitee.com/qingplus/qingcloud-platformqinghub自动安装部署配置库什么是Wo......
  • 传统虚拟化与容器的区别
    什么是虚拟化?由于成本的过大开销,出现了虚拟化技术;虚拟化,大白话理解就是:服务器上建虚拟机,不同的虚拟机跑不同的业务好处:避免了资源的浪费减少了成本的花销坏处:虚拟化相对于真实的硬件服务器来说,性能低、稳定性不高。对数据安全性和稳定性有一定要求的,不建议使用虚拟化技......
  • 制作opencv+jdk8容器镜像
    前言 之前使用opencv实现了获取湖泊轮廓,在打包到线上服务器时出现了问题.本来打算自己写一套不使用opencv的代码,但是效果不理想.无奈还是只能继续寻找使用opencv的解决方案.在过程中发现服务器使用了docker普通的安装不起作用.最终只能使用这版解决方案,为避免下次踩坑,......
  • Docker 最常用的镜像命令和容器命令
    目录一、帮助命令二、运行第一个容器:hello-world2.1运行命令2.2命令执行流程图三、镜像相关命令及其基本操作3.1登录私有镜像仓库3.2拉取镜像3.3查看镜像基本信息3.3.1dockerimages命令查看镜像基本信息(一)、dockerimages命令常用选项-a:显示所有的镜像(包括临时镜像文......
  • 【STL】 C++常用容器介绍系列(一)----(map、set、stack)
    目录一、map系列1、map介绍2、unordered_map介绍3、map和unordered_map的选择二、set系列1、set介绍2、unordered_set介绍3、set和unordered_set的选择三、如何遍历和查询map和set1、map的遍历2、map的查询3、set的遍历4、set的查询四、stack介绍和操作stack的方......
  • 红帽rhce认证报名费用多少?rhcsa 红帽认证含金量高吗?
    红帽rhce认证报名费用多少?RHCE的考试费用大概在4200人民币左右,但是不同的考场收费有所差异,具体费用以预约的考场为准。如若通过RHCSA考试,却没有通过RHCE考试,考生则需缴纳2000左右的补考费,补考的费用也是根据考场的不同而有些许差异的。rhcsa红帽认证含金量高吗?1、全球认可:红......
  • STL容器之list类
    文章目录STL容器之list类1、list的介绍2、list的使用2.1、list的常见构造2.2、list的iterator的使用2.3、list空间增长问题2.4、list的增删查改2.5、list迭代器失效问题3、list的模拟实现(含反向迭代器)STL容器之list类1、list的介绍list是序列容器,允许在序列中......
  • 图片超过容器溢出的几种解决方法(实现图片缩放)
    网页插入图片的两种常见应用场景在网页编写,我们经常会插入图片来优化网页整体结构,增强用户体验感,在插入图片时,我们会有两种比较常见的应用场景,一种就是使用background-image属性插入背景图片,还有一种是使用img标签插入图片。使用background-image属性插入背景图片当插入......
  • Docker与containerd:容器技术的双璧
    ......
  • 使用c++容器string相关完成
    //把邮箱地址字符串[email protected],取出其中用户名字符串打印stringgetUsername(string&s){   intpops=s.find('@');   stringusername=s.substr(0,pops);   returnusername;}//大小写转换 使用标准库提供俩函数,单个字符为操作对象stringstr=......