RHCE(podman容器)

q_7發表於2024-03-19

一:容器的基礎

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
Service=user@1000.service
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
Service=user@1000.service
Slice=user-1000.slice
Display=32
State=active
Sessions=32
IdleHint=no
IdleSinceHint=1710850936101540
IdleSinceHintMonotonic=27494512144
Linger=yes

reboot重啟

相關文章