一:容器的基础
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