Podman 部署 - 新一代容器工具 安装部署 docker


https://podman.io/

http://docs.podman.io/en/latest/Commands.html

https://github.com/containers/podman

https://github.com/containers/buildah

https://github.com/containers/skopeo


# Centos

curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo

yum -y install yum-plugin-copr

yum -y copr enable lsm5/container-selinux

#centos8

yum -y install podman

dnf install  -y  podman buildah skopeo


dnf remove -y  podman buildah skopeo


# Ubuntu

apt-get update -qq

apt-get install -qq -y software-properties-common uidmap

add-apt-repository -y ppa:projectatomic/ppa

apt-get update -qq

apt-get -qq -y install podman

 

# Ubuntu 20.04

source /etc/os-release

sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"

wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key -O- | sudo apt-key add -

sudo apt-get update -qq  && sudo apt-get -qq --yes install podman   && sudo apt-get update -y && sudo apt-get dist-upgrade -y && sudo apt-get upgrade -y   &&  sudo apt-get install -y wget vim net-tools curl git cron &&  sudo apt autoremove  &&   sudo apt clean


podman version

podman info

podman --help

systemctl daemon-reload

systemctl restart podman


yum -y  remove podman buildah skopeo

rm -rf  /var/lib/containers/    /var/lib/cni/


# supervisord 安装

https://abc.htmltoo.com/thread-45964.htm


# 镜像修改

sudo vim /etc/containers/registries.conf

[registries.search]
registries = ['hub.htmltoo.com:5000', 'docker.io']
unqualified-search-registries = ["hub.htmltoo.com:5000", "docker.io"]
...
[registries.insecure]
registries = ['hub.htmltoo.com:5000']

[[registry]]
prefix = "hub.htmltoo.com:5000"
location = "hub.htmltoo.com:5000"
insecure = true

---如果为True,则返回未加密的HTTP以及不受信任的TLS连接


---配置为别名

echo "alias docker=podman" >> .bashrc

source .bashrc


#Podman Compose,并根据自己的喜好设置别名(如果仍然忘不了 docker)

pip3 install podman-compose

echo "alias docker-compose=podman-compose" >> .bashrc

source .bashrc


# supervisord-自重启

https://abc.htmltoo.com/thread-45964.htm

apt-get install supervisor

touch /etc/supervisor/conf.d/app.conf

sudo chmod -R 777 /etc/supervisor/conf.d/

sudo vim  /etc/supervisor/conf.d/app.conf

[program:podman]
priority=1
directory=/opt/app/
command=podman start nginxlabs
autostart=true
user=ubuntu

-杀掉原有进程ps -ef | grep supervisor

sudo kill -9  id 

sudo supervisord  -c /etc/supervisor/supervisord.conf 

sudo chmod -R 777 /var/log/supervisor/supervisord.log

-注意是只更改这个文件夹的权限不要连里面的文件也更改,不要加–R 参数,

-不然会更改 ssh 秘钥权限,服务器连接异常.

sudo chmod 777 /run 


#镜像加速

cp /etc/containers/registries.conf{,.bak}

cat > /etc/containers/registries.conf << EOF

unqualified-search-registries = ["docker.io"]

[[registry]]

prefix = "docker.io"

location = "hub-mirror.c.163.com"

EOF


podman run --rm --detach --tty --publish 8080:80 --volume ${PWD}:/usr/share/nginx/html nginx

podman ps

curl 127.0.0.1:8080


---运行nginx

podman run -d  --publish  8081:80  --name nginxlabs1  --restart=always --volume ${PWD}/html:/usr/share/nginx/html  nginx:latest


---进入容器

podman exec -it nginxlabs1 /bin/bash


---查看nginx用户的容器uid

echo "$(id -u nginx)"

101


---更改主机系统权限,以便容器用户nginx拥有共享文件

podman unshare chown 101:101 ${PWD}/html


---提交镜像

podman commit  -f docker  --message "htmltoo"   --author "htmltoo <ihunter@vip.qq.com>" 7bf3e8f817ad   hub.htmltoo.com:5000/http:nginxlabs

podman  push  hub.htmltoo.com:5000/http:nginxlabs


---拉取镜像

podman run -d  --publish  8082:80  --name nginxlabs2 --restart=always --volume ${PWD}/html:/usr/share/nginx/html  hub.htmltoo.com:5000/http:nginxlabs


---健康检测

--healthcheck-command 'CMD-SHELL curl http://localhost:4001 && curl http://localhost:4002 && echo "Okay" && exit 0 || exit 1' \

--healthcheck-start-period 5s \

--healthcheck-retries 5 \

--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次;

--start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒;


---特权

--privileged


#客户端配置文件

/etc/containers/registries.conf和/etc/containers/storage.conf文件定义客户端环境配置。

-其中registries.conf定义了podman能够访问到的container registry服务器的信息,

-而storage.conf定义了podman保存在本地的容器镜像和其运行容器的文件目录。

-我们可以通过执行“podman info”查看这些配置是否生效。

podman info

-在registries.conf文件中,"[registries.search]”是podman搜索镜像的目标registry,

而“[registries.insecure]”定义了可以不通过TLS访问的registry。

-在storage.conf文件中,“graphroot”参数是用来定义存放Image和容器可写内容的目录(其下面对应相关的子目录);而“runroot”参数是用来定义存放容器临时可写内容的目录;“VolumePath”参数指定了“podman volume create”命令创建的目录位置。


#登录/登出Container Registry

“podman login”命令将登录指定的Registry服务器。

-如果命令没有指定Registry服务器,podman命令将使用“registries.conf”文件中在“[registries.search]”配置的第一个Registry。“podman login”命令可以使用用户名和密码、也可用证书登录Registry。

-如果不指定“–authfile”参数,podman在首次成功登陆Registry后会将登录凭证存放到缺省为 ${XDG_RUNTIME_DIR}/containers/auth.json的认证文件中,登录凭证的内容是“USERNAME:PASSWORD”,但是是以base64格式记录的。我们也可以使用“–authfile”参数指定podman使用的认证文件。podman只有在对Registry操作的时候才使用“–authfile”指定的认证文件(或缺省的认证文件)中的身份凭证,这些操作包括“podman login、podman pull、podman push、podman search、podman run”等。


---用podman登录Container Registry,Podman会自动将登录认证写到auth.json中。

其中“auth”中的内容是“user1:password1”字符串的base64编码。

注意:本环境中${XDG_RUNTIME_DIR}指向的是“/run/user/0”目录。

podman login ${REGISTRY_DOMAIN}:5000 -u user1 -p password1 
more /run/user/0/containers/auth.json
{
        "auths": {
                "registry.domain.com:5000": {
                        "auth": "dXNlcjE6cGFzc3dvcmQx"
                }
        }
}

---对以上base64字符串进行反编码。

echo -n "dXNlcjE6cGFzc3dvcmQx" | base64 -d
user1:password1

---如果此时在第二个Terminal中再次用podman登录Container Registry,

podman会缺省使用当前有效的认证文件auth.json进行登录。

podman login ${REGISTRY_DOMAIN}:5000
Authenticating with existing credentials...

---执行命令登出Container Registry,可以发现此时缺省认证文件auth.json中已经没有认证信息了。

podman logout ${REGISTRY_DOMAIN}:5000
more /run/user/0/containers/auth.json
{
        "auths": {}
}

--此时再进行登录,系统会提示输入用户名和密码。

podman login ${REGISTRY_DOMAIN}:5000

Username:


#利用登录凭证免密操作

---先用podman登录,同时在keyfree.json文件中记录可以免密操作的Token。

podman login ${REGISTRY_DOMAIN}:5000 -u user1 -p password1 --authfile keyfree.json
Login Succeeded

---查看

cat /keyfree.json
{
        "auths": {
                "registry.domain.com:5000": {
                        "auth": "dXNlcjE6cGFzc3dvcmQx"
                }
        }
}

---登出Container Registry

podman logout ${REGISTRY_DOMAIN}:5000

用免密文件对Container Registry中的Image进行操作,确认无需密码,只需免密文件即可运行。

podman pull ${REGISTRY_DOMAIN}:5000/busybox:latest --authfile /keyfree.json


#查询镜像

---podman默认是搜索/etc/containers/registries.conf文件中“[registries.search]”中配置的registry。

---查询“docker.io/busybox”镜像,只返回3个结果。

podman search docker.io/busybox --limit 3

---查本地Registry上的busybox镜像。

podman search ${REGISTRY_DOMAIN}:5000/busybox --limit 3

---将busybox镜像从docker.io拉到本地缓存。注意“Storing signatures”后面的字符创。

podman pull busybox

---查看本地镜像缓存。注意“IMAGE ID”的内容是上面“Storing signatures”的一部分。

podman images

---设置podman在本地存放镜像的目录。

PODMAN_DATA_DIR=/var/lib/containers/storage

---查看镜像的存储目录,确认有上面有对应“IMAGE ID”的“c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998”目录。

ll ${PODMAN_DATA_DIR}/overlay-images


#访问非安全的Registry

当podman访问Registry的时候进行build、commit、pull或push操作的时候,如果所访问的Registry在“[registries.insecure]”中,那么podman缺省用“–tls-verify=false”发起请求。如果访问其它Registry(没有在registries.conf中定义或在registries.conf中定义为“[registries.search]”),podman缺省用“–tls-verify=true”发起请求。如果需要不使用上述缺省访问,可以在命令中会用“–tls-verify”。


#保存镜像-恢复镜像

---执行命令,将本地docker.io/library/busybox:latest镜像保存到文件中。

podman save --quiet -o busybox.tar docker.io/library/busybox:latest

ll busybox.tar

---将本地docker.io/library/busybox:latest镜像删除。

podman rmi docker.io/library/busybox:latest

---从busybox.tar文件加载busybox镜像,然后确认镜像已经加载成功

podman load --quiet -i busybox.tar

Loaded image(s): docker.io/library/busybox:latest



#Podman Compose,并根据自己的喜好设置别名(如果仍然忘不了 docker)

pip3 install podman-compose

echo "alias docker-compose=podman-compose" >> .bashrc

source .bashrc

---或github的最新稳定版本:
pip install https://github.com/muayyad-alsadi/podman-compose/archive/master.tar.gz
---或github的最新开发版本:
pip install https://github.com/muayyad-alsadi/podman-compose/archive/devel.tar.gz
---映射
1podfw-在一个pod中创建所有容器(通过localhost完成容器间通信),在该pod中进行端口映射。
1pod-在一个pod中创建所有容器,在每个容器中进行端口映射。
identity-没有映射。
hostnet-使用主机网络,通过主机网关和发布的端口完成容器间通信。
cntnet-创建一个容器并通过--network container:name(通过localhost进行容器间通信)使用它。
publishall-将所有端口发布到主机(使用-P)并通过网关进行通信。
---工作示例
-通过在一个共享网络的pod上使用多个容器(服务对话 通过本地主机):
podman-compose -t 1podfw -f examples/awx3/docker-compose.yml up
-或者通过重用容器网络和--add-host:
podman-compose -t cntnet -f examples/awx3/docker-compose.yml up
-或者使用主机网络和本地主机按如下方式工作:
podman-compose -t hostnet -f examples/awx3-hostnet-localhost/docker-compose.yml up
-进行中的工作
podman-compose -t 1pod -f examples/awx3/docker-compose.yml up


---日志文件过大

vim  /etc/containers/containers.conf

[containers]

log_size_max=51200


#使用Podman

---运行一个容器

podman run -dt -p 8080:8080/tcp \

-e HTTPD_VAR_RUN=/var/run/httpd \

-e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \

-e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \

-e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/ \

registry.fedoraproject.org/f27/httpd /usr/bin/run-httpd


---列出运行的容器

sudo podman ps -a


---分析一个运行的容器

podman inspect -l | grep IPAddress\"


---查看一个运行中容器的日志

sudo podman logs --latest


--查看一个运行容器中的进程资源使用情况

sudo podman top <container_id>


---停止一个运行中的容器

sudo podman stop --latest


---删除一个容器

sudo podman rm --latest


#新的特性

---执行命令,列出所有已挂载容器挂载点。返回结果包括容器ID和其挂载点目录

podman mount


---查看容器的文件系统变化情况

podman diff  rid

podman container diff  rname

podman diff redis:alpine

podman diff --format json redis:alpine


---查看容器运行运行的实施消耗资源情况。

podman stats --all


---将所有不运行的容器全部删除,

podman container prune


---查看运行环境信息

podman system df


---删除所有不用的容器、镜像和本地存储卷

podman system prune --all --volumes


---列出所有端口映射

podman port -a

---特定容器的列表端口映射

podman port b4d2f054


----podman export, 导出为tar存档

podman export -o redis-container.tar 883504668ec465463bc0fe7e63d53154ac3b696ea8d7b233748918664ea90e57

podman export 883504668ec465463bc0fe7e63d53154ac3b696ea8d7b233748918664ea90e57 > redis-container.tar


---podman healthcheck run mywebapp

Runs the healthcheck command defined in a running container manually. The resulting error codes are defined as follows:

0 = 健康检查命令成功

1 = 健康检查命令失败

125 = 发生了一个错误


---podman history debian

podman history --format json debian


---podman rename, 重命名容器

-,by ID

podman rename 717716c00a6b testcontainer

-by container rename

podman container rename 6e7514b47180 databaseCtr


---podman restart

podman restart ff6cf1

podman restart --time 4 test1 test2

podman restart --running

podman restart --all



---给容器设置一个检查点

sudo podman container checkpoint <container_id>

---根据检查点位置恢复容器

sudo podman container restore <container_id>

---迁移容器

-Podman 支持将容器从一台机器迁移到另一台机器。

-首先,在源机器上对容器设置检查点,并将容器打包到指定位置。

sudo podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz

scp /tmp/checkpoint.tar.gz <destination_system>:/tmp

-其次,在目标机器上使用源机器上传输过来的打包文件对容器进行恢复。

sudo podman container restore -i /tmp/checkpoint.tar.gz

---配置为别名

echo "alias docker=podman" >> .bashrc

source .bashrc


#Podman 外网

-p :9090:80

sudo podman run --name phpmyadmin  --restart=always  -itd  -p 9090:80  -e

PMA_HOST=10.88.0.1  phpmyadmin/phpmyadmin


#Buildah Buildah专注于构建OCI镜像。 Buildah 构建速度非常快并使用覆盖存储驱动程序,可以节约大量的空间

https://github.com/containers/buildah

yum install buildah -y
buildah --version

使用 Buildah 从 Dockerfile 构建镜像也很简单,使用 buildah bud -t hello . 替换 docker build -t hello . 即可

镜像构建完毕后,可以使用 buildah images 命令查看这个新镜像

使用 buildah push 可以很容易的完成推送操作


#Skopeo是一个工具,允许我们通过push,pull和复制镜像来处理Docker和OC镜像。

https://github.com/containers/skopeo

yum install skopeo -y  
skopeo --help

-Skopeo是用来对Registry的Images操作的工具,它主要功能包括:查看Registry上的镜像信息、在Registry之间或Registry和本地之间复制镜像、删除Registry上的镜像。

-查看Registry上的Image信息

skopeo inspect docker://${REGISTRY_DOMAIN}:5000/busybox:latest

-在2个Registry之间复制Image

skopeo copy docker://quay.io/buildah/stable docker://${REGISTRY_DOMAIN}:5000/buildah

curl -u user1:password1 https://${REGISTRY_DOMAIN}:5000/v2/_catalog

-删除images

skopeo delete docker://localhost:5000/imagename:latest


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回