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