測試環境為 CentOS 8 x86_64 虛擬機.
使用一般使用者 ben (非 sudo user)登入並操作.
下面使用 Nginx (http server) 為範例.
[ben@localhost ~]$ podman search nginx docker.io docker.io/library/nginx Official build of Nginx. 14935 [OK] ...
[root@localhost ~]# podman pull docker.io/library/nginx Trying to pull docker.io/library/nginx:latest... Getting image source signatures Copying blob 8283eee92e2f done Copying blob febe5bd23e98 done Copying blob 69692152171a done Copying blob 30afc0b18f67 done Copying blob 351ad75a6cfa done Copying blob 596b1d696923 done Copying config d1a364dc54 done Writing manifest to image destination Storing signatures d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee
[root@localhost ~]# podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/nginx latest d1a364dc548d 6 days ago 137 MB
CMD
下面範例會用本地端 ~/docker-nginx/html 資料夾去取代 Container 內的 /usr/share/nginx/html 資料夾,先建立該資料夾.
[ben@localhost ~]$ mkdir -p ~/docker-nginx/html
[ben@localhost ~]$ vi ~/docker-nginx/html/index.html Local index.html
使用指令的方式來建立 Nginx 的 Container .
[ben@localhost ~]$ podman run --pod new:mypod --name docker-nginx -p 8080:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx 0f22d07fed4f10787e6e62980007a6b257b16638377012ba7904ebe6367b6080
使用參數:
- –pod=name
Run container in an existing pod. If you want Podman to make the pod for you, prefix the pod name with new:.
上面範例將容器放入 singular pod 中,這些容器可以直接使用 localhost 進行溝通.Podman pod 中的所有 Container 共享相同的 network namespace ( namespace 命名空間是 Linux 核心 2.6.24 之後的一個功能,它可以隔離和虛擬化 processes 相關系統資源,虛擬化資源包括 process IDs, hostnames, user IDs, network access, interprocess communication, 以及 filesystems . ) ,這意味著 Containers 將使用相同的 IP 地址 , MAC 地址 與 Port mapping 網路埠映射.
參數 –pod new:mypod 指定了一個新的 pod 名稱為 mypod (也可以是先建立 podman pod create –name testpod),從以下指令可以看到.
[ben@localhost ~]$ podman pod ls POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS d3aae47d8cc6 mypod Degraded About a minute ago ade5ec81c311 2
- –name=name
Assign a name to the container. - –publish, -p=ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
Publish a container’s port, or range of ports, to the host. - –detach, -d=true|false
Detached mode: run the container in the background and print the new container ID. - –volume, -v[=[[SOURCE-VOLUME|HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]
Create a bind mount. If you specify /HOST-DIR:/CONTAINER-DIR, Podman bind mounts host-dir in the host to CONTAINER-DIR in the Podman container.
用本地端 ~/docker-nginx/html 資料夾去取代 Container 內的 /usr/share/nginx/html 資料夾.
檢視一下剛剛建立的 pod 與 container .
[ben@localhost ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c0d2f9b37a2 registry.access.redhat.com/ubi8/pause:latest 17 seconds ago Up 18 seconds ago 0.0.0.0:8080->80/tcp 2ca433d84b42-infra 0f22d07fed4f docker.io/library/nginx:latest nginx -g daemon o... 17 seconds ago Up 18 seconds ago 0.0.0.0:8080->80/tcp docker-nginx
[ben@localhost ~]$ podman port -a 0f22d07fed4f 80/tcp -> 0.0.0.0:8080 6c0d2f9b37a2 80/tcp -> 0.0.0.0:8080
[ben@localhost ~]$ podman pod list POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 2ca433d84b42 mypod Running 31 seconds ago 6c0d2f9b37a2 2
YAML
剛剛參數很多,可以把它寫成 Kubernetes YAML 檔案,可以使用指令 #podman generate kube pod_name/pod_id 來將現有的環境轉成 YAML 檔案.
[ben@localhost ~]$ podman generate kube mypod -f docker-nginx.yaml
使用參數 :
- –filename, -f=filename
Output to the given file, instead of STDOUT.
格式如下(可以對照一下剛剛的指令就會知道相對應的欄位).
[ben@localhost ~]$ cat docker-nginx.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-3.1.0-dev apiVersion: v1 kind: Pod metadata: creationTimestamp: "2021-06-02T11:59:25Z" labels: app: mypod name: mypod spec: containers: - args: - nginx - -g - daemon off; command: - /docker-entrypoint.sh env: - name: PATH value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - name: TERM value: xterm - name: container value: podman - name: NGINX_VERSION value: 1.21.0 - name: NJS_VERSION value: 0.5.3 - name: PKG_RELEASE value: 1~buster image: docker.io/library/nginx:latest name: docker-nginx ports: - containerPort: 80 hostPort: 8080 protocol: TCP resources: {} securityContext: allowPrivilegeEscalation: true capabilities: drop: - CAP_MKNOD - CAP_AUDIT_WRITE privileged: false readOnlyRootFilesystem: false seLinuxOptions: {} volumeMounts: - mountPath: /usr/share/nginx/html name: home-ben-docker-nginx-html-host workingDir: / dnsConfig: {} restartPolicy: Never volumes: - hostPath: path: /home/ben/docker-nginx/html type: Directory name: home-ben-docker-nginx-html-host status: {}
可以使用這個 YAML 檔案來建立 pod 與 Container,先把現有環境的 pod 與 Container 移除.
[ben@localhost ~]$ podman stop docker-nginx docker-nginx
[ben@localhost ~]$ podman rm docker-nginx 0f22d07fed4f10787e6e62980007a6b257b16638377012ba7904ebe6367b6080
[ben@localhost ~]$ podman pod rm mypod 2ca433d84b420dd0ae88c9b32a035392805fbfeed6d5d837f4ad31850b8b6ab5
現在可以使用指令 #podman play kube YAML 檔案來建立 pod 與 Container .
[ben@localhost ~]$ podman play kube docker-nginx.yaml Trying to pull docker.io/library/nginx:latest... Getting image source signatures Copying blob 351ad75a6cfa skipped: already exists Copying blob 69692152171a skipped: already exists Copying blob 30afc0b18f67 skipped: already exists Copying blob 596b1d696923 skipped: already exists Copying blob febe5bd23e98 skipped: already exists Copying blob 8283eee92e2f [--------------------------------------] 0.0b / 0.0b Copying config d1a364dc54 done Writing manifest to image destination Storing signatures Pod: 29c0f7cd4b158f3a3e610815a873a2686c8b7deb1d26705eac3240ece80e7aca Container: 659a9b77d939a4e0c11cbaa821d45f712a49015d483b5207071cc618b12b6a10
可以看到 pod 與 container 都建立好了.
[ben@localhost ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fc371cc54372 registry.access.redhat.com/ubi8/pause:latest 35 seconds ago Up 27 seconds ago 0.0.0.0:8080->80/tcp 29c0f7cd4b15-infra 659a9b77d939 docker.io/library/nginx:latest nginx -g daemon o... 27 seconds ago Up 27 seconds ago 0.0.0.0:8080->80/tcp mypod-docker-nginx
[ben@localhost ~]$ podman pod list POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 29c0f7cd4b15 mypod Running 41 seconds ago fc371cc54372 2