一:容器的基礎
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重啟