- 所属概念?容器工具
- 概念的目的?创建,运行,管理容器
- 工具是如何实现所属概念的?Podman的创建旨在完全替代Docker。用Docker能完成的东西,Podman和它的兄dei儿姐妹们都能完成。对Podman的介绍和与Docker的对比见下文:
Podman介绍
- Podman背景
- Podman vs Docker
- Podman常用命令锦集
- 初始化
- 登入登出
- 新建容器相关
- 运行相关
- 挂载相关
- 镜像相关
Podman背景
Podman是红帽公司提供并维护的容器工具集合的其中一个。Podman的官方文档原话 What is Podman? Simply put: alias docker=podman
红帽提供的容器工具集
- Podman:Pod和容器管理器 --> 用来代替docker(因为docker需要docker daemon才能跑)。通常执行tag,push,pull镜像
- Buildah:镜像生成器
- Skopeo:使用远程镜像数据库 - 检索信息、图像、签署内容。通常执行copy,delete,review镜像
- Runc:容器运行器和特性构建器,并传递给Podman和Buildah
- Crun:可选Runtime,为Rootless容器提供更大的灵活性、控制和安全性
Podman是在Linux系统运行的。Mac和Windows用户可以通过podman machine init去初始化一个Linux的虚拟机,然后通过ssh使用Podman的服务。
Podman vs Docker
| Podman | Docker |
|---|
| Daemon | 不需要 | 需要Docker Daemon才能运行容器,一旦Docker Daemon死亡,所有容器都会被停掉 |
| 权限 | 可选,可以用root或者非root的用户进行Podman的操作不用所有都用root,因此也更安全, | 所有Docker的操作都必须由root用户执行 |
| 构建镜像 | 需要它的兄dei儿Buildah帮忙 | 自己可以解决 |
| 小结: | Podman 模块化的工具集中的一种,和他的兄dei儿各自负责不同的工作 | Docker整合了所有功能的大型工具 |
图片来自这里
Podman常用命令锦集
初始化
| Command | Description |
|---|
| podman machine init | 初始化初始化一个可以运行容器的Linux 虚拟机。 |
| podman machine start | 启动虚拟机 |
| podman system connection list | 列出 Podman 服务的目的地 |
登入登出
| Command | Description |
|---|
| podman login quay.io | 登入镜像数据库quay.io |
| podman logout --all | logout for alle |
新建容器相关
| Command | Description |
|---|
| podman search ubi | 查找含有 "ubi"的镜像(前提是已经成功登入镜像数据库quay.io) |
| podman pull quay.io/ubi | 下载镜像 |
| podman images | 查看所有本地镜像 |
| podman run ubi --name MyContainer echo "hello world" | 从镜像ubi中新建一个名为myContainer的容器。并在容器中执行命令 echo (默认工具是 /bin/bash)。该容器在你用Ctrl+C终止命令的时候也会同时停掉 |
| -d: 分离模式。即就算命令被中柱,容器还是在跑 |
| -it: 交互模式,即直接进入容器的命令行工具 |
| -p 8080: 将容器暴露到本地的8080端口 |
| -e: 在创建容器时使用环境变量,注意每个环境变量之前都要有一个单独的-e。举例:-e DB_NAME=test_db -e DB_USER=user -e DB_PW=mypa55 |
| podman port MyContainer | 查看容器myContainer的端口 |
| podman port -a | 查看所有端口 |
| podman ps | 查看所有在运行的容器 |
| --format "{{.ID}} {{.Image}} {{.Names}}": 定义输出格式. |
运行相关
| Command | Description |
|---|
| podman exec -it MyContainer /bin/bash | 进入容器的命令行工具(前提是容器正在运行) |
| 除了 /bin/bash, 我们也可以跑其他的,比如mysql, echo "xx",print $ENV_VAR等,举例: |
| mysql items -e "SELECT * FROM Item" |
| mysql -uuser1 -h127.0.0.1 -pmypa55 -P13306 items -e "SELECt * FROM Item" |
| podman logs MyContainer | 打印容器myContainer的日志 |
| podman cp /user/chuying/document/db.sql mysql:// | 将文件db.sql从本地复制到容器内 |
| podman container prune | 删除没有在运行的容器 |
| podman stop MyContainer | 暂停容器myContainer的运行 |
| podman restart MyContainer | 重新运行容器myContainer |
| podman rm MyContainer | 删除容器myContainer(前提是该容器已经停止运行) |
挂载相关
| Command | Description |
|---|
| sudo semanage fcontext -a -t container_file_t '/home/student/local/mysql(/.*)?' | 使用正确的 SELinux 上下文和权限设置目录 |
| semanage: 用于配制SElinux元素 |
| fcontext: file-context mapping definition |
| -a: 添加fcontext-type |
| -t: SELinux type |
| sudo restorecon -Rv /home/student/local/mysql | 应用SELinux 政策 |
| restorecon: 恢复 SELinux Context |
| -r: 目录递归 |
| ls -ldZ /home/student/local/mysql | 查看context_type |
| podman unshare chown -R 27:27 /home/student/local/mysql | 修改文件所有权, UID=217 |
| podman run -v /home/student/dbfiles:/var/lib/mysql rhmap47/mysql | 将本地文件挂载到容器上 |
镜像相关
| Command | Description |
|---|
| podman save -o ubi.tar quay.io/ubi | 将quay.io下的 ubi镜像保存成本地文件ubi.tar(前提是已经成功登入镜像数据库quay.io) |
| podman load -i ubi.tar | 从本地文件ubi.tar加载镜像ubi |
| podman rmi ubi | 删除镜像 ubi(前提是所有使用该镜像的容器都已经停止运行,并已删除) |
| podman rmi -a | 删除所有镜像 |
| --force: 强制删除(就算还有在使用该镜像的容器,也可以删除,但不建议这么做) |
| podman image prune | 删除没有被使用的镜像 |
| podman diff MyContainer | 查看容器修改了什么 |
| podman commit MyContainer MyImage | 基于容器MyContainer创建映像MyImage |
| -a: 作者信息 |
| --message: 添加commit的信息 |
| podman build --layers=false -t MyImage ./container-folder | 用Containerfile创建镜像MyImage |
| podman tag MyImage quay.io/${QUAY_USER}/MyImage | 将MyImage重命名为 quay.io/${QUAY_USER}/MyImage |
| podman push quay.io/${QUAY_USER}/MyImage | 将镜像quay.io/${QUAY_USER}/MyImage发布到镜像数据库quay.io中 |