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