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