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