Podman的使用方法是怎樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為赤壁企業(yè)提供專業(yè)的網(wǎng)站制作、成都做網(wǎng)站,赤壁網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
Podman
原來(lái)是 CRI-O 項(xiàng)目的一部分,后來(lái)被分離成一個(gè)單獨(dú)的項(xiàng)目叫 libpod。Podman 的使用體驗(yàn)和 Docker
類(lèi)似,不同的是 Podman 沒(méi)有 daemon。以前使用 Docker CLI 的時(shí)候,Docker CLI 會(huì)通過(guò) gRPC API 去跟 Docker Engine 說(shuō)「我要啟動(dòng)一個(gè)容器」,然后 Docker Engine 才會(huì)通過(guò) OCI Container runtime(默認(rèn)是 runc
)來(lái)啟動(dòng)一個(gè)容器。這就意味著容器的進(jìn)程不可能是 Docker CLI 的子進(jìn)程,而是 Docker Engine 的子進(jìn)程。
Podman 比較簡(jiǎn)單粗暴,它不使用 Daemon,而是直接通過(guò) OCI runtime(默認(rèn)也是 runc
)來(lái)啟動(dòng)容器,所以容器的進(jìn)程是 podman 的子進(jìn)程。這比較像 Linux 的 fork/exec
模型,而 Docker 采用的是 C/S
(客戶端/服務(wù)器)模型。與 C/S 模型相比,fork/exec
模型有很多優(yōu)勢(shì),比如:
系統(tǒng)管理員可以知道某個(gè)容器進(jìn)程到底是誰(shuí)啟動(dòng)的。
如果利用 cgroup
對(duì) podman 做一些限制,那么所有創(chuàng)建的容器都會(huì)被限制。
SD_NOTIFY: 如果將 podman 命令放入 systemd
單元文件中,容器進(jìn)程可以通過(guò) podman 返回通知,表明服務(wù)已準(zhǔn)備好接收任務(wù)。
socket 激活: 可以將連接的 socket
從 systemd 傳遞到 podman,并傳遞到容器進(jìn)程以便使用它們。
廢話不多說(shuō),下面我們直接進(jìn)入實(shí)戰(zhàn)環(huán)節(jié),本文將手把手教你如何用 podman 來(lái)部署靜態(tài)博客,并通過(guò) Sidecar 模式將博客所在的容器加入到 Envoy
mesh 之中。
我的部署方案涉及到兩層 Envoy:
首先會(huì)有一個(gè)前端代理單獨(dú)跑一個(gè)容器。前端代理的工作是給訪問(wèn)者提供一個(gè)入口,將來(lái)自外部的訪問(wèn)請(qǐng)求轉(zhuǎn)發(fā)到具體的后端服務(wù)。
其次,博客靜態(tài)頁(yè)面由 nginx 提供,同時(shí)以 Sidecar 模式運(yùn)行一個(gè) Envoy
容器,它與 nginx 共享 network nemspace
。
所有的 Envoy 形成一個(gè) mesh,然后在他們之間共享路由信息。
我之前寫(xiě)過(guò)一篇用 Docker
部署 hugo 靜態(tài)博客并配置 HTTPS
證書(shū)的文章,本文采用的是相同的方案,只是將 docker 換成了 podman,具體參考為 Envoy 開(kāi)啟 TLS 驗(yàn)證實(shí)戰(zhàn)。
我的博客是通過(guò) hugo 生成的靜態(tài)頁(yè)面,可以將其放到 nginx
中,其他靜態(tài)網(wǎng)站工具類(lèi)似(比如 hexo 等),都可以這么做?,F(xiàn)在我要做的是讓 nginx 容器和 envoy 容器共享同一個(gè) network namespace,同時(shí)還要讓前端代理能夠通過(guò)域名來(lái)進(jìn)行服務(wù)發(fā)現(xiàn)。以前用 docker 很簡(jiǎn)單,直接用 docker-compose 就搞定了,podman 就比較麻煩了,它又不能用 docker-compose
,服務(wù)發(fā)現(xiàn)看來(lái)是搞不定了。
好不容易在 Github 上發(fā)現(xiàn)了一個(gè)項(xiàng)目叫 podman-compose,以為有救了,試用了一下發(fā)現(xiàn)還是不行,podman-compose 創(chuàng)建容器時(shí)會(huì)將字段 network_mode: "service:hugo"
轉(zhuǎn)化為 podman CLI 的參數(shù) --network service:hugo
(真腦殘),導(dǎo)致容器創(chuàng)建失敗,報(bào)錯(cuò)信息為 CNI network "service:hugo" not found
。將該字段值改為 network_mode: "container:hugo_hugo_1"
可以啟動(dòng)成功,然而又引來(lái)了另一個(gè)問(wèn)題:podman-compose 的做法是為每一個(gè) service
創(chuàng)建一個(gè) pod
(pod 的名字為 docker-compose.yml 所在目錄名稱),然后往這個(gè) pod 中添加容器。我總不能將前端代理和后端服務(wù)塞進(jìn)同一個(gè) pod 中吧?只能分別為前端代理和 hugo 創(chuàng)建兩個(gè)目錄,然后分別創(chuàng)建 docker-compose.yml。這個(gè)問(wèn)題解決了,下個(gè)問(wèn)題又來(lái)了,podman-compose 不支持通過(guò) service name 進(jìn)行服務(wù)發(fā)現(xiàn),扒了一圈發(fā)現(xiàn)支持 links
(其實(shí)就是加個(gè)參數(shù) --add-host
),然而 links 只在同一個(gè) pod 下才生效,我都拆分成兩個(gè) pod 了,links 鞭長(zhǎng)莫及啊,還是沒(méi)什么卵用。我能怎么辦,現(xiàn)在唯一的辦法就是手?jǐn)]命令行了。
上面我提到了一個(gè)新名詞叫 pod
,這里花 30 秒的時(shí)間給大家簡(jiǎn)單介紹一下,如果你是 Kubernetes
的重度使用者,對(duì)這個(gè)詞應(yīng)該不陌生,但這里確實(shí)說(shuō)的是 podman 的 pod,意思還是一樣的,先創(chuàng)建一個(gè) pause
容器,然后再創(chuàng)建業(yè)務(wù)容器,業(yè)務(wù)容器共享 pause
容器的各種 linux namespace,因此同一個(gè) pod 中的容器之間可以通過(guò) localhost 輕松地相互通信。不僅如此,podman 還可以將 pod 導(dǎo)出為 Kubernetes 的聲明式資源定義,舉個(gè)栗子:
先創(chuàng)建一個(gè) pod:
$ podman pod create --name hugo
查看 pod:
$ podman pod ls POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 88226423c4d2 hugo Running 2 minutes ago 2 7e030ef2e7ca
在這個(gè) pod 中啟動(dòng)一個(gè) hugo 容器:
$ podman run -d --pod hugo nginx:alpine
查看容器:
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c91cab1e99d docker.io/library/nginx:alpine nginx -g daemon o... 3 minutes ago Up 3 minutes ago reverent_kirch
查看所有容器,包括 pause 容器:
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c91cab1e99d docker.io/library/nginx:alpine nginx -g daemon o... 4 minutes ago Up 4 minutes ago reverent_kirch 7e030ef2e7ca k8s.gcr.io/pause:3.1 6 minutes ago Up 6 minutes ago 88226423c4d2-infra
查看所有容器,包括 pause 容器,并顯示容器所屬的 pod id:
$ podman ps -ap CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 3c91cab1e99d docker.io/library/nginx:alpine nginx -g daemon o... 4 minutes ago Up 4 minutes ago reverent_kirch 88226423c4d2 7e030ef2e7ca k8s.gcr.io/pause:3.1 6 minutes ago Up 6 minutes ago 88226423c4d2-infra 88226423c4d2
查看 pod 中進(jìn)程的資源使用情況:
$ podman pod top hugo USER PID PPID %CPU ELAPSED TTY TIME COMMAND root 1 0 0.000 8m5.045493912s ? 0s nginx: master process nginx -g daemon off; nginx 6 1 0.000 8m5.045600833s ? 0s nginx: worker process nginx 7 1 0.000 8m5.045638877s ? 0s nginx: worker process 0 1 0 0.000 9m41.051039367s ? 0s /pause
將 pod 導(dǎo)出為聲明式部署清單:
$ podman generate kube hugo > hugo.yaml
查看部署清單內(nèi)容:
$ cat hugo.yaml # Generation of Kubernetes YAML is still under development! # # Save the output of this file and use kubectl create -f to import # it into Kubernetes. # # Created with podman-1.0.2-dev apiVersion: v1 kind: Pod metadata: creationTimestamp: 2019-10-17T04:17:40Z labels: app: hugo name: hugo spec: containers: - command: - nginx - -g - daemon off; env: - name: PATH value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - name: TERM value: xterm - name: HOSTNAME - name: container value: podman - name: NGINX_VERSION value: 1.17.4 - name: NJS_VERSION value: 0.3.5 - name: PKG_RELEASE value: "1" image: docker.io/library/nginx:alpine name: reverentkirch resources: {} securityContext: allowPrivilegeEscalation: true capabilities: {} privileged: false readOnlyRootFilesystem: false workingDir: / status: {}
怎么樣,是不是有種熟悉的味道?這是一個(gè)兼容 kubernetes 的 pod 定義,你可以直接通過(guò) kubectl apply -f hugo.yaml
將其部署在 Kubernetes 集群中,也可以直接通過(guò) podman 部署,步驟大致是這樣的:
先刪除之前創(chuàng)建的 pod:
$ podman pod rm -f hugo
然后通過(guò)部署清單創(chuàng)建 pod:
$ podman play kube hugo.yaml
回到之前的問(wèn)題,如果通過(guò)聲明式定義來(lái)創(chuàng)建 pod,還是無(wú)法解決服務(wù)發(fā)現(xiàn)的問(wèn)題,除非換個(gè)支持靜態(tài) IP 的 CNI
插件,而支持靜態(tài) IP 的這些 CNI 插件又需要 etcd 作為數(shù)據(jù)庫(kù),我就這么點(diǎn)資源,可不想再加個(gè) etcd,還是手?jǐn)]命令行吧。
首先我要?jiǎng)?chuàng)建一個(gè) hugo 容器,并指定容器的 IP:
$ podman run -d --name hugo \ --ip=10.88.0.10 \ -v /opt/hugo/public:/usr/share/nginx/html \ -v /etc/localtime:/etc/localtime \ nginx:alpine
再創(chuàng)建一個(gè) envoy 容器,與 hugo 容器共享 network namespace:
$ podman run -d --name hugo-envoy \ -v /opt/hugo/service-envoy.yaml:/etc/envoy/envoy.yaml \ -v /etc/localtime:/etc/localtime \ --net=container:hugo envoyproxy/envoy-alpine:latest
service-envoy.yaml 的內(nèi)容如下:
static_resources: listeners: - address: socket_address: address: 0.0.0.0 port_value: 8080 filter_chains: - filters: - name: envoy.http_connection_manager config: codec_type: auto stat_prefix: ingress_http access_log: - name: envoy.file_access_log config: path: "/dev/stdout" route_config: name: local_route virtual_hosts: - name: service domains: - "*" routes: - match: prefix: "/" route: cluster: local_service http_filters: - name: envoy.router config: {} clusters: - name: local_service connect_timeout: 0.25s type: strict_DNS lb_policy: round_robin hosts: - socket_address: address: 127.0.0.1 port_value: 80 admin: access_log_path: "/dev/null" address: socket_address: address: 0.0.0.0 port_value: 8081
具體的含義請(qǐng)參考為 Envoy 開(kāi)啟 TLS 驗(yàn)證實(shí)戰(zhàn)。
本文開(kāi)頭提到 podman 創(chuàng)建的容器是 podman 的子進(jìn)程,這個(gè)表述可能比較模糊,實(shí)際上 podman 由兩部分組成,一個(gè)是 podman CLI,還有一個(gè)是 container runtime,container runtime 由 conmon
來(lái)負(fù)責(zé),主要包括監(jiān)控、日志、TTY 分配以及類(lèi)似 out-of-memory
情況的雜事。也就是說(shuō),conmon 是所有容器的父進(jìn)程。
conmon 需要去做所有 systemd
不做或者不想做的事情。即使 CRI-O 不直接使用 systemd 來(lái)管理容器,它也將容器分配到 sytemd 兼容的 cgroup
中,這樣常規(guī)的 systemd 工具比如 systemctl
就可以看見(jiàn)容器資源使用情況了。
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 42762bf7d37a docker.io/envoyproxy/envoy-alpine:latest /docker-entrypoin... About a minute ago Up About a minute ago hugo-envoy f0204fdc9524 docker.io/library/nginx:alpine nginx -g daemon o... 2 minutes ago Up 2 minutes ago hugo
對(duì) cgroup 不熟的同學(xué),可以參考下面這個(gè)系列:
深入理解 Linux Cgroup 系列(一):基本概念
深入理解 Linux Cgroup 系列(二):玩轉(zhuǎn) CPU
深入理解 Linux Cgroup 系列(三):內(nèi)存
深入理解 Kubernetes 資源限制:CPU
Kubernetes 內(nèi)存資源限制實(shí)戰(zhàn)
Kubernetes Pod 驅(qū)逐詳解
零基礎(chǔ)的同學(xué)建議按照上面的目錄從上到下打怪升級(jí),祝你好運(yùn)!
這個(gè)很簡(jiǎn)單,直接創(chuàng)建容器就好了:
$ podman run -d --name front-envoy \ --add-host=hugo:10.88.0.10 \ -v /opt/hugo/front-envoy.yaml:/etc/envoy/envoy.yaml \ -v /etc/localtime:/etc/localtime \ -v /root/.acme.sh/yangcs.net:/root/.acme.sh/yangcs.net \ --net host envoyproxy/envoy
由于沒(méi)辦法自動(dòng)服務(wù)發(fā)現(xiàn),需要通過(guò)參數(shù) --add-host
手動(dòng)添加 hosts 到容器中。envoy 的配置文件中是通過(guò)域名來(lái)添加 cluster 的,front-envoy.yaml 內(nèi)容如下:
static_resources: listeners: - address: socket_address: address: 0.0.0.0 port_value: 80 filter_chains: - filters: - name: envoy.http_connection_manager config: codec_type: auto stat_prefix: ingress_http access_log: - name: envoy.file_access_log config: path: "/dev/stdout" route_config: virtual_hosts: - name: backend domains: - "*" routes: - match: prefix: "/" redirect: https_redirect: true response_code: "FOUND" http_filters: - name: envoy.router config: {} - address: socket_address: address: 0.0.0.0 port_value: 443 filter_chains: - filter_chain_match: server_names: ["yangcs.net", "www.yangcs.net"] tls_context: common_tls_context: alpn_protocols: h3 tls_params: tls_maximum_protocol_version: TLSv1_3 tls_certificates: - certificate_chain: filename: "/root/.acme.sh/yangcs.net/fullchain.cer" private_key: filename: "/root/.acme.sh/yangcs.net/yangcs.net.key" filters: - name: envoy.http_connection_manager config: codec_type: auto stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: backend domains: - "yangcs.net" - "www.yangcs.net" routes: - match: prefix: "/admin" route: prefix_rewrite: "/" cluster: envoy-ui - match: prefix: "/" route: cluster: hugo response_headers_to_add: - header: key: "Strict-Transport-Security" value: "max-age=63072000; includeSubDomains; preload" http_filters: - name: envoy.router config: {} clusters: - name: hugo connect_timeout: 0.25s type: strict_dns lb_policy: round_robin http2_protocol_options: {} hosts: - socket_address: address: hugo port_value: 8080 admin: access_log_path: "/dev/null" address: socket_address: address: 0.0.0.0 port_value: 8001
具體的含義請(qǐng)參考為 Envoy 開(kāi)啟 TLS 驗(yàn)證實(shí)戰(zhàn)。
現(xiàn)在就可以通過(guò)公網(wǎng)域名訪問(wèn)博客網(wǎng)站了,如果后續(xù)還有其他應(yīng)用,都可以參考第二節(jié)的步驟,然后重新創(chuàng)建前端代理,添加 --add-host
參數(shù)。以我的網(wǎng)站 https://www.yangcs.net 為例:
我好像透露了一些什么不得了的東西,就此打住,你也不要說(shuō),你也不要問(wèn)。
由于 podman 不再使用 daemon 管理服務(wù),--restart
參數(shù)被廢棄了,要想實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)啟動(dòng)容器,只能通過(guò) systemd 來(lái)管理了。先創(chuàng)建 systemd 服務(wù)配置文件:
$ vim /etc/systemd/system/hugo_container.service [Unit] Description=Podman Hugo Service After=network.target After=network-online.target [Service] Type=simple ExecStart=/usr/bin/podman start -a hugo ExecStop=/usr/bin/podman stop -t 10 hugo Restart=always [Install] WantedBy=multi-user.target
$ vim /etc/systemd/system/hugo-envoy_container.service [Unit] Description=Podman Hugo Sidecar Service After=network.target After=network-online.target After=hugo_container.service [Service] Type=simple ExecStart=/usr/bin/podman start -a hugo-envoy ExecStop=/usr/bin/podman stop -t 10 hugo-envoy Restart=always [Install] WantedBy=multi-user.target
$ vim /etc/systemd/system/front-envoy_container.service [Unit] Description=Podman Front Envoy Service After=network.target After=network-online.target After=hugo_container.service hugo-envoy_container.service [Service] Type=simple ExecStart=/usr/bin/podman start -a front-envoy ExecStop=/usr/bin/podman stop -t 10 front-envoy Restart=always [Install] WantedBy=multi-user.target
然后將之前停止之前創(chuàng)建的容器,注意:是停止,不是刪除!
$ podman stop $(podman ps -aq)
最后通過(guò) systemd 服務(wù)啟動(dòng)這些容器。
$ systemctl start hugo_container $ systemctl start hugo-envoy_container $ systemctl start front-envoy_container
設(shè)置開(kāi)機(jī)自啟。
$ systemctl enable hugo_container $ systemctl enable hugo-envoy_container $ systemctl enable front-envoy_container
之后每次系統(tǒng)重啟后 systemd 都會(huì)自動(dòng)啟動(dòng)這個(gè)服務(wù)所對(duì)應(yīng)的容器。
以上就是將博客從 Docker 遷移到 Podman 的所有變更操作,總體看下來(lái)還是比較曲折,因?yàn)?Podman 是為 Kubernetes 而設(shè)計(jì)的,而我要求太高了,就一個(gè)資源緊張的 vps,即不想上 Kubernetes
,也不想上 etcd
,既想搞 sidecar,又想搞自動(dòng)服務(wù)發(fā)現(xiàn),我能怎么辦,我也很絕望啊,這個(gè)事怨不得 podman,為了防止在大家心里留下 “podman 不好用”的印象,特此聲明一下。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
新聞名稱:Podman的使用方法是怎樣的
本文網(wǎng)址:http://chinadenli.net/article42/ppsshc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、標(biāo)簽優(yōu)化、網(wǎng)站排名、網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)