podman


podman

什么是Podman?簡而言之:alias docker -podman,是CentOs 8新集成的功能,未來代替docker

Podman是一個為Kubernetes而生的開源的容器管理工具,原來是CRI-O (即容器運行時接口CRI和開放容器計划OCI)項目的一部分,后來被分離成一個單獨的項目叫libpod,其可在大多數Linux平台上使用,它是一種無守護程序的容器引擎,用於在Linux系統上開發,管理和運行任何符合Open Container Initiative (OCI)標准的容器和容器鏡像。

Podman提供了一個與Docker兼容的命令行前端, Podman CLI里面87%的指令都和Docker CL相同,因此該前端可以簡單地為Docker CL剔名,即" alias docker = podman"

官方地址:https://podman.io/
項目地址:https://github.com/containers/libpod/

Podman和docker不同之處

docker需要在我們的系統上運行一個守護進程(docker daemon),而podman不需要

(docker是有專門的服務的,服務名就叫dockerd(systemctl status dockerd)他是以專門的服務器的方式運行的,但是podman沒有服務器架構,他就是一個程序,這個程序在必要的情況下啟動,不需要的情況下就不啟動,所以他沒那么復雜,)

啟動容器的方式不同:

docker c1i命令通過API跟Docker Engine (引擎)交互告訴它我想創建一個container,然后docken Engine才會調用ocI container runtime (runc)來啟動一個container,這代表container的process(進程)不會是Docker cLr的chi1d process(子進程),而是Docker Engine的child process.

Podman是直接給OCI containner runtime (runc)進行交互來創建container的,所以container process直接是podman的chi1d process.

(他的啟動是直接通過podman和你的容器直接打交道,而docker由於是基於c/s架構的,所以我們用戶的應用程序他是通過docker引擎,docker引起說白了就是docker服務器來和容器進行通訊的,也就是說用戶通過客戶端先連接docker的引擎,然后在通過引擎在去和容器進行信息交換,這樣的話就隔了一層他是通過引擎來實現的, 而podman他沒有這個東西他可以直接進行交互,也就是說podman直接通過接口,直接連接到容器上和容器進行交互,所以他更直接更方便)

因為docke有docker daemon,所以docker啟動的容器支持--restart策略,但是podman不支持

docker需要使用root用戶來創建容器, podman既可以由root用戶運行,也可以由非特權用戶運行

安裝podman

# centos8上進行安裝,centos8默認沒有docker(雖然沒有docker的包但是可以安裝(CentOS Linux release 8.1.1911 (Core)測試並不能安裝),但是當在centos8上安裝docker的時候,實際上他並不會真的給你裝docker實際上安裝的是podman-docker,而podman-docker實際上偽裝的docker就是用podman來模擬docker實際上他並不是真的docker,安裝后他實際上並沒有這個docker包,他提供了一個docker程序但這個docker程序實際上是podman的一個腳本而已,他間接的調用了podman)
[root@localhost ~]# yum info docker
CentOS-8 - AppStream                                                                                 6.2 kB/s | 4.3 kB     00:00    
CentOS-8 - AppStream                                                                                 921 kB/s | 5.8 MB     00:06    
CentOS-8 - Base                                                                                      5.0 kB/s | 3.9 kB     00:00    
CentOS-8 - Base                                                                                      925 kB/s | 2.2 MB     00:02    
CentOS-8 - Extras                                                                                    1.3 kB/s | 1.5 kB     00:01    
CentOS-8 - Extras                                                                                     11 kB/s | 8.1 kB     00:00    
錯誤:沒有匹配的軟件包可以列出
[root@localhost ~]# yum info docker-ce
上次元數據過期檢查:0:00:15 前,執行於 2020年10月27日 星期二 13時40分32秒。
錯誤:沒有匹配的軟件包可以列出

# 安裝podman
[root@localhost ~]# dnf -y install podman

# 查看命令路徑
root@localhost ~]# which podman
/usr/bin/podman

配置鏡像源

  默認鏡像庫
        文件 /etc/containers/registries.conf 是設置鏡像地址配置文件,默認會搜索 ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io', 'quay.io']等幾個鏡像庫。

        不過,這幾個鏡像庫下載速度非常慢,可以說是基本無法順利的將鏡像拉下來。

        所以,需要修改修改鏡像庫配置文件,也就是大家說的鏡像加速方案。

  鏡像加速

        只需2個步驟實現鏡像加速:

              1.改名並備份好文件:/etc/containers/registries.conf.bak

              2.再新建一個空的 registries.conf 文件,插入如下內容
                    unqualified-search-registries = ["docker.io"]

                    [[registry]]
                    prefix = "docker.io"
                    location = "******.mirror.aliyuncs.com"

              3.修改 location
                   網易:https://hub-mirror.c.163.com/

                   阿里雲:https://<你的ID>.mirror.aliyuncs.com

                   七牛雲加速器:https://reg-mirror.qiniu.com

              4.保存
# 修改podman鏡像源(podman默認的鏡像拉取鏡像地址第一個是紅帽的,從紅帽去拉去,而且可能要都要涉及到紅帽的一個付費用戶才行的,最后一個才是正兒八經的docker的鏡像倉庫的源,所以把他這個順序調整一下,把docker的鏡像倉庫的源調整到第一位置上去,如果不調整的話,他裝軟件他會優先跑到上去,結果紅帽的連接不上去,就會導致安裝特別慢)
[root@localhost ~]# vim /etc/containers/registries.conf 
registries = ['docker.io','registry.access.redhat.com', 'registry.redhat.io']

# 鏡像加速
## 備份文件
[root@localhost ~]# cp /etc/containers/registries.conf /etc/containers/registries.conf.bak

## 編輯配置文件(直接刪除或者注釋掉之前的,或者以registries.conf命名的新文件,只需要這一段)
[root@localhost ~]# vim /etc/containers/registries.conf
unqualified-search-registries = ["docker.io"]
  
[[registry]]
prefix = "docker.io"
location = "hub-mirror.c.163.com/"

run跑一個mariadb容器

  啟動容器及容器端口映射
        我們最終需要的實際上是宿主機暴露 3306 端口,因此將 MariaDB 容器的 3306 端口與宿主機的端口進行映射。

        容器的啟動方式是 -d 后台守護進程啟動,啟動的時候需要指定 ROOT 密碼或者是選擇空 ROOT 密碼。

              --name:給了一個 mariadb 的別名
              MYSQL_ROOT_PASSWORD:設置 root 密碼
                    “數據庫未初始化,密碼沒設置。你需要設置MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD三個中的任意一項”

                          其中 MYSQL_ROOT_PASSWORD即root賬戶的密碼。

                                MYSQL_ALLOW_EMPTY_PASSWORD即允許密碼為空。

                                MYSQL_RANDOM_ROOT_PASSWORD隨機一個root賬戶密碼。****


        啟動成功之后,實際上就能夠在在宿主機直接訪問 mysql 了。
              保證宿主機安裝了 mysql-client

        這里遇到一個問題,如果不指定 -h 為某個 ip(本機指定為 127.0.0.1 或 局域網 ip),則無法連接,如果指定 -h 為 localhost也無法連接
              $ mysql -uroot -proot
              報錯:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
                    區別是mysql在使用-hlocalhost選擇使用的連接方式為unix-socket,而你沒有在mysql的配置文件中啟用:socket=/var/run/mysqld/mysqld.sock,導致這個文件不存在而使連接失敗;而-hIP的形式使用的是tcp-socket

              加ip連接:
                    $ mysql -h127.0.0.1 -uroot -proot
                    $ mysql -h192.168.1.130 -uroot -proot
# 啟動容器及容器端口映射
[root@localhost ~]# podman  run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mariadb mariadb:latest

# 查看容器狀態並查看監聽的地址和端口,並查看本地暴露出來的地址和端口
[root@localhost ~]# podman ps 
CONTAINER ID  IMAGE                             COMMAND  CREATED        STATUS            PORTS                   NAMES
295e75fecb73  docker.io/library/mariadb:latest  mysqld   5 minutes ago  Up 5 minutes ago  0.0.0.0:3306->3306/tcp  mariadb

[root@localhost ~]# netstat -tunlp |grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      31331/conmon      

# 訪問數據庫(需要實現安裝mariadb客戶端程序,dnf -y install mariadb)
[root@localhost ~]# mysql -h127.0.0.1 -uroot -proot

允許遠程訪問數據庫(方法一,更換caching_sha2_password身份驗證插件)

  問題:

        我在使用navicat 進行MySQL管理是出現了。2059 - authentication plugin 'caching_sha2_password' -navicat連接異常。這個錯誤。

        這個錯誤的原因是由於MySQL8.0之后的加密規則為caching_sha2_password.而在此之前的加密規則為mysql_native_password。

        可以將加密規則改成mysql_native_password來。

  C:\mysqldata>mysql -h 127.0.0.1 -P 13306 -uroot -p
  Enter password: ****
  ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: ÕÒ²»µ½Ö¸¶¨µÄÄ£¿é¡£

        查看一下加密的方式
              MySQL [(none)]> show variables like 'default_authentication_plugin';
              +-------------------------------+-----------------------+
              | Variable_name                 | Value                 |
              +-------------------------------+-----------------------+
              | default_authentication_plugin | caching_sha2_password |
              +-------------------------------+-----------------------+
              1 row in set (0.02 sec)

        查看本地mysql用戶的信息(可以看到root賬戶的加密方式是caching_sha2_password)
              MySQL [(none)]> select host,user,plugin from mysql.user;
              +------------+------------------+-----------------------+
              | host       | user             | plugin                |
              +------------+------------------+-----------------------+
              | %          | root             | mysql_native_password |
              | 172.17.0.2 | root             | caching_sha2_password |
              | localhost  | mysql.infoschema | caching_sha2_password |
              | localhost  | mysql.session    | caching_sha2_password |
              | localhost  | mysql.sys        | caching_sha2_password |
              | localhost  | root             | caching_sha2_password |
              +------------+------------------+-----------------------+
              6 rows in set (0.00 sec)

  解決方案:

        1.進入mysql容器

              docker exec -it mysql2 /bin/bash

        2.進入mysql

              mysql -uroot -pmima

        3.修改密碼,指定加密規則

              ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

        4.遠程訪問數據庫(修改后,訪問容器內的數據庫,就算是宿主機的也要使用網絡地址127.0.0.1或本機ip,否者默認使用的是本地mysql.sock會連不上)

              mysql -uroot -h127.0.0.1 -proot 

停止容器

[root@ecs-kc1-large-2-linux-20200825091713 ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS                 NAMES
e01cb058cfd5  docker.io/library/nginx:1.16.0  nginx -g daemon o...  8 weeks ago  Up 8 weeks ago  0.0.0.0:8080->80/tcp  nginx
4d3f7adfaf95  docker.io/library/httpd:latest  httpd-foreground      8 weeks ago  Up 8 weeks ago  0.0.0.0:80->80/tcp    quirky_swartz
[root@ecs-kc1-large-2-linux-20200825091713 ~]# podman stop e01cb058cfd5 4d3f7adfaf95
e01cb058cfd54d503c78c56e8731e7dc29047d2af9971208504d1f61090a001f
4d3f7adfaf95c32fc8b5178f5ca54b70943f3e57ff4230bc8f25435b367e293a
[root@ecs-kc1-large-2-linux-20200825091713 ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS                    PORTS                 NAMES
e01cb058cfd5  docker.io/library/nginx:1.16.0  nginx -g daemon o...  8 weeks ago  Exited (0) 3 seconds ago  0.0.0.0:8080->80/tcp  nginx
4d3f7adfaf95  docker.io/library/httpd:latest  httpd-foreground      8 weeks ago  Exited (0) 3 seconds ago  0.0.0.0:80->80/tcp    quirky_swartz


# 使用方法
[root@ecs-kc1-large-2-linux-20200825091713 ~]# podman stop --help
Stop one or more containers(停止一個或多個容器)

Description:(描述:)
  Stops one or more running containers.  The container name or ID can be used.(停止一個或多個運行中的容器。 可以使用容器名稱或ID。)

  A timeout to forcibly stop the container can also be set but defaults to 10 seconds otherwise.(也可以設置強制停止容器的超時,否則默認為10秒。)

Usage:(用法:)
  podman stop [flags] CONTAINER [CONTAINER...](podman stop [標簽] 容器 [容器...])

Examples:(例子:)
  podman stop ctrID
  podman stop --latest(podman stop --最新)
  podman stop --timeout 2 mywebserver 6e534f14da9d(podman stop --超時 2 容器 容器)

Flags:(標志)
  -a, --all            Stop all running containers(停止所有正在運行的容器)
  -l, --latest         Act on the latest container podman is aware of(有關最新的容器podman的信息)
      --time uint      Seconds to wait for stop before killing the container (default 10)(在終止容器之前等待停止的秒數(默認值為10))
  -t, --timeout uint   Seconds to wait for stop before killing the container (default 10)(在終止容器之前等待停止的秒數(默認為10))

容器內安裝yum

  使用busybox容器實現安裝yum(失敗,失敗原因,busybox提供的沒有編譯環境,python和yum的源碼包可以通過下載使用,但是無法解決源碼編譯)
# 啟動,進入busybox容器
[root@localhost ~]# docker  run --name mybusybox -it busybox:latest

# yum是由python實現的,先下載,安裝python
~ # wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz

# 解壓,壓縮方法要於解壓方法保持一直,否則報錯
~ # tar -xvf Python-3.9.0.tar.xz 

# 編譯(報錯,原因沒有編譯環境)
./configure --prefix=/usr/local --enable-shared
make
make install

# 下載最新的yum-3.2.28.tar.gz並解壓
wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz
tar xvf yum-3.2.28.tar.gz

# 進入目錄,運行安裝
~ # cd Python-3.9.0
~ # yummain.py install yum 

# 如果結果提示錯誤: CRITICAL:yum.cli:Config Error: Error accessing file for config file:///etc/ 可能是原來是缺少配置文件。在etc目錄下面新建yum.conf文件,然后再次運行 yummain.py install yum,順利完成安裝。

# 最后更新系統。
yum check-update      #升級所有包,同時也升級軟件和內核系統
yum update            #升級所有包,同時也升級軟件和內核系統
yum -y upgrade        #只升級所有包,不升級軟件和系統內核。
yum clean all         #列出所有可更新的軟件清單命令

容器內安裝netstat

[root@62c210d9160e /]# yum -y install net-tools


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM