Runc 學習

各種關(guān)系

OCI 介紹

https://github.com/opencontainers/runtime-spec/blob/main/spec.md

Open Container Initiative Runtime Specification 指定容器的配置、執(zhí)行環(huán)境和生命周期

因此執(zhí)行的命令是 runc spec

OCI(Open Container Initiative,開放容器計劃),是在 2015 年由 Docker、CoreOS 等公司共同成立的項目,并由 Linux 基金會進行管理,致力于 container runtime 標準的制定和 runc 的開發(fā)等工作。

所謂 container runtime,主要負責的是容器的生命周期的管理。OCI 主要分為容器運行時規(guī)范(runtime-spec) 和鏡像規(guī)范(image-spec) 兩部分,runtime-spec 標準對容器的創(chuàng)建、刪除、查看、狀態(tài)等操作進行了定義,image-spec 對鏡像格式、打包(Bundle)、存儲等進行了定義。

runc 介紹

runc,是由 Docker 貢獻的對于 OCI 標準的一個參考實現(xiàn),是一個可以用于創(chuàng)建和運行容器的 CLI(command-line interface) 工具。runc 直接與容器所依賴的 Cgroup/OS 等進行交互,負責為容器配置 Cgroup/namespace 等啟動容器所需的環(huán)境,創(chuàng)建啟動容器的相關(guān)進程。

為了兼容 OCI 標準,Docker 也做了架構(gòu)調(diào)整。將容器運行時相關(guān)的程序從 Docker daemon 剝離出來,形成了containerd。containerd 向 Docker 提供運行容器的 API,二者通過 gRPC 進行交互。containerd 最后會通過 runc 來實際運行容器。

CRI 介紹

CRI(Container Runtime Interface,容器運行時接口)是 K8s 定義的一組與容器運行時進行交互的接口,用于將 K8s 平臺與特定的容器實現(xiàn)解耦。在 K8s 早期的版本中,對于容器環(huán)境的支持是通過 Dockershim(hard code) 方式直接調(diào)用 Docker API 的,后來為了支持更多的容器運行時和更精簡的容器運行時,K8s 在遵循 OCI 基礎(chǔ)上提出了CRI。

總結(jié)

都是基礎(chǔ)oci 規(guī)范, cri 是k8s 提的, containerd 是從docker daemon 分離出來的, 最后containerd 也是調(diào)用runc。


圖片.png
圖片.png

下載安裝

https://github.com/opencontainers/runc/releases/tag/v1.0.3
安裝了docker, 就有runc 了, 可能版本不一樣;
下載runc.amd64, 然后改名字, 加執(zhí)行權(quán)限;
放到/usr/bin 里;

準備工作

cd /opt/script; mkdir -p alpine/rootfs
docker pull alpine:3.12
docker export $(docker create alpine:3.12) | tar -C alpine/rootfs -xvf -

命令解析

在 Unix/Linux 中,"-" 通常表示標準輸出或標準輸入。在這個命令中,"-" 表示從標準輸入中讀取 tar 包的數(shù)據(jù)。

具體來說,tar -C alpine/rootfs -xvf - 命令中的 - 表示從標準輸入中讀取 tar 包的數(shù)據(jù),而不是從文件中讀取。這通常用于將 tar 包通過管道傳遞給另一個命令,或者從網(wǎng)絡中獲取 tar 包的數(shù)據(jù)。

在這個命令中,docker export 命令將容器中的文件系統(tǒng)導出為 tar 包,并將 tar 包的數(shù)據(jù)輸出到標準輸出中。然后,tar 命令通過 - 參數(shù)從標準輸入中讀取 tar 包的數(shù)據(jù),并將數(shù)據(jù)解壓到指定的目錄中。

因此,在這個命令中,最后的 - 表示從標準輸入中讀取 tar 包的數(shù)據(jù),這樣就可以將 docker export 命令輸出的 tar 包數(shù)據(jù)傳遞給 tar 命令進行解壓。

OCI 規(guī)范

runc spec

總之,runc spec 命令是用于生成符合 OCI 標準的容器配置文件的工具,它可以幫助用戶創(chuàng)建和管理符合標準的容器。

簡單的說,OCI有兩個規(guī)范,一個是容器運行時規(guī)范runtime-spec,一個是鏡像格式規(guī)范image-spec。一個鏡像,簡單來說就是一個打包好的符合OCI規(guī)范的filesystem bundule。而bundule的話,前面介紹過,包含一個配置文件config.json和一個rootfs目錄。

INFRA [root@wqdcsrv3160 alpine]# rc list
ID          PID         STATUS      BUNDLE                    CREATED                          OWNER
abc         0           stopped     /opt/script/runc/alpine   2023-06-01T06:33:22.403659746Z   root

INFRA [root@wqdcsrv3160 alpine]# cd /opt/script/runc/alpine/
INFRA [root@wqdcsrv3160 alpine]# ll
total 5
-rw-r--r--  1 root root   81 Jun  1 15:05 abc.out
-rw-r--r--  1 root root 2811 Jun  1 14:33 config.json
drwxr-xr-x 20 root root 1024 Jun  1 14:21 rootfs

啟動

rc run abc
ctrl + d 退出

-d 參數(shù), --detach

有三個步驟

  • 修改config.json


    圖片.png

    圖片.png
  • golang 寫個程序, 編譯后放到/app 目錄中, 設(shè)置可執(zhí)行權(quán)限。

  • rc run -d abc > abc.out 2>&1

刪除

rc kill abc
rc delete abc

掛載文件夾

    "mounts": [
            {
                    "destination": "/opt/script/runc/alpine/rootfs/app",
                    "source": "/opt/script/test",
                    "options": ["rbind","rw"]
            },

destination 和 source 都必須是目錄;
rc run -d abc > abc.out 2>&1 運行起來
rc exec -t abc sh 然后進去看一下。

虛擬網(wǎng)卡設(shè)置

結(jié)構(gòu):


圖片.png
yum install bridge-utils -y
brctl show

# 創(chuàng)建網(wǎng)橋
brctl addbr jtthink0
ip link set jtthink0 up
ip addr add 10.12.0.1/24 dev jtthink0

# 創(chuàng)建veth 設(shè)備對
ip link add name veth0-host type veth peer name veth0-ns
ip link set veth0-host up
brctl addif  jtthink0  veth0-host

# 創(chuàng)建一個net namespace
ip netns add mycontainer
ip link set veth0-ns netns mycontainer

# 設(shè)置ns 里面的網(wǎng)卡名稱和啟動
ip netns exec mycontainer ip link set veth0-ns name eth0
ip netns exec mycontainer ip addr add 10.12.0.2/24 dev eth0
ip netns exec mycontainer ip link set eth0 up
ip netns exec mycontainer ip addr add 127.0.0.1 dev lo
ip netns exec mycontainer ip link set lo up
ip netns exec mycontainer ip route add default via 10.12.0.1

端口映射

修改config.json

                "namespaces": [
                        {
                                "type": "pid"
                        },
                        {
                                "type": "network",
                                "path": "/var/run/netns/mycontainer"
                        },
                        {
                                "type": "ipc"
                        },
                        {
                                "type": "uts"
                        },
                        {
                                "type": "mount"
                        }
                ],
iptables -t nat -I PREROUTING -p tcp  -m tcp  --dport 9090 -j DNAT --to-destination 10.12.0.2:80

刪除
iptables -t nat -D PREROUTING -p tcp  -m tcp  --dport 9090 -j DNAT --to-destination 10.12.0.2:80
還需要一些iptables 前置操作:
iptables -P FORWARD ACCEPT

vi /etc/sysctl.conf
# 找到下面的值并將0改成1
net.ipv4.ip_forward = 1

sysctl -p(使之立即生效)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章內(nèi)容 ◆ Docker簡介◆ Docker 鏡像與制作◆ Docker 數(shù)據(jù)管理◆ Docker 網(wǎng)絡◆ Do...
    Liang_JC閱讀 917評論 0 0
  • 導讀 接觸kubernetes的時候, 搞不懂OCI,CRI,runC,containerd,shim 之間的區(qū)別...
    allenhaozi閱讀 7,398評論 2 7
  • 參考文檔https://github.com/containerd/containerd/blob/master/...
    bearxiong77閱讀 2,524評論 0 1
  • docker.io(官網(wǎng)) 輕量、高效的虛擬化 Docker 公司位于舊金山,原名dotCloud,底層利用了Li...
    以九為書閱讀 399評論 0 1
  • kubernetes集群三步安裝 概念介紹 cri (Container runtime interface)cr...
    sealyun閱讀 2,354評論 0 1

友情鏈接更多精彩內(nèi)容