Docker 系统性入门+进阶实践-09Docker-Podman-10Docker的多架构支持

09-Docker podman

podman是什么?

  1. podman是一个基于Linux系统的daemon-less容器引擎,可以用来开发、管理、运行OCI标准的容器,
    podman可以运行在root或者非root用户模式,podman是red hat在2018年推出的,源代码开放
  2. podman和docker的区别?
  • 最主要的区别就是podman是daemon less无守护进程的,而docker在执行任务的时候,必须依赖于后台的docker daemon
  • podman不需要使用root用户或者root权限,所以更安全
  • podman可以创建pod, pod概念和kubernetes中的pod类似
  • podman运行镜像和容器存储在不同的地方,而docker必须存储在docker engineer本地
  • podman是传统的fork-exec模式,而docker是client-server架构
    docker架构

    podman架构

podman的安装和快速上手

  1. podman对版本要求非常高,Debian>=11, Ubuntu>=20.10版本才可以直接安装
sudo apt update
sudo apt install -y podman
  1. 拉取nginx镜像
    注意:podman拉取镜像和docker有点区别,需要写完整路径才可以
    sudo podman pull docker.io/library/nginx
    查看镜像
    sudo podman image ls
    查看镜像详情
    sudo podman image inspect image_id
  2. 创建一个容器并启动
    sudo podman run -d -p 80:80 docker.io/library/nginx
    查看启动的容器
    sudo podman ps
  3. 停止容器、删除容器
sudo podman container stop container_id  // 停止容器
sudo podman container rm container_id  // 删除容器

注意:默认如果不使用sudo 的话,每次会有警告WARN[0000] The cgroupv2 manager is set to systemd but there is no systemd user session available, 为了解决这个问题,我们需要在家目录下的.config目录下新建目录containers,在containers目录新建文件containers.conf文件,
文件内容如下:

[engine]
events_logger = "file"
cgroup_manager = "cgroupfs"

此时在执行命令,不加sudo,也不会WAARN警告了。
参考文档

docker vs podman实际操作看不同

  1. docker是client-server架构,有一个后台守护进程docker daemon,而podman是daemon-less非后台守护
  2. podman中不同的用户有不同的配置,也就是说各自能看到各自的镜像、容器等, 不同的用户环境是完全隔离的
  3. 拉取docker上的镜像
    podman pull docker.io/1341935532/net-box

podman中pod的基本操作

  1. podman中除了能创建容器外,还能创建pod,pod和kubernets中的pod的概念基本类似
  2. pod: pod是一组共享相同网络、pid、ipc命名空间的一个或多个容器
  3. 创建一个pod
    podman pod create --name demo
    有可能会报错:
ERRO[0060] Error freeing pod lock after failed creation: no such file or directory
Error: error adding Infra Container: Error initializing source docker://k8s.gcr.io/pause:3.2: error pinging docker registry k8s.gcr.io: Get "https://k8s.gcr.io/v2/": dial tcp 74.125.23.82:443: i/o timeout

解决办法,先从国内镜像拉取,然后给拉取的镜像打一个标签,然后再创建pod

podman pull registry.aliyuncs.com/google_containers/pause:3.2  // 阿里镜像拉取
podman image tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2  // 将拉取的镜像打标签为国外镜像
podman pod create --name demo  // 创建pod
  1. 查看pod
    podman pod ps
  2. 查看pod以及它里面的容器:
    podman ps --pod
    podman ps -a --pod
  3. 创建pod的时候会默认帮我们创建一个容器:pod_id + "-" + infra
    这个默认创建的容器是负责pod的基础设施相关的内容,比如说网络命名空间、资源管理之类的内容
  4. 删除Pod
    podman pod rm test
  5. 创建两个容器,指定为同一个pod
podman container run -d --pod demo --name mybox docker.io/1341935532/net-box ping 8.8.8.8
podman container run -d --pod demo --name mybox2 docker.io/1341935532/net-box ping 8.8.8.8

我们查看同一个pod的两个容器的ip发现是相同的,也就印证了上面所说的pod是一组共享同一网络、pid和ipc命名空间的一个或多个容器。
9. 一个pod实际上就是一个命名空间,那么在这一个命名空间的所有容器处在同一个网络命名空间里面,
这样的好处就是,同一个pod里面的容器相互访问时,只需要通过127.0.0.1+port就可以访问了,相当于同一台机器上的不同端口
podman中的pod和kubernetes中的pod基本一致,也可以和docker-compose去比较,compose可以部署多个服务,pod也可以部署多个服务,
只不过在podman里面无法使用docker-compose的yml文件,
10. 基于podman play文件创建pod及其容器
podman play --help

podman后续学习

podman 官方文档

10-docker的多架构支持

随着苹果M1芯片的快速发展和普及,arm架构快速进入更多开发者的视野,docker是如何支持多CPU架构的?
以及我们如何发布支持多CPU架构的容器镜像呢?

本章介绍


2. 我们如何构建一个支持多CPU架构的镜像,并分享出去
如何在单一架构的系统上面构建支持多CPU架构的镜像

docker buildx命令构建多CPU架构镜像

  1. windows和mac桌面版docker自带buildx命令,但是linux环境下的docker需要自行安装buildx命令
  2. 克隆代码
    git@github.com:mayanan-python/flask-redis.git
    切换到目录下:cd flask-redis
  3. 创建构建实例。通俗的讲,就是创建用于构建的节点
    sudo docker buildx create --name mybuilder --use
    3.1 构建多架构的镜像
    sudo docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 -t xiaopeng163/flask-redis:latest .
  4. manifest命令,可以查看docker hub上镜像的详细信息, 需要联网才能查看
    sudo docker manifest inspect 1341935532/net-box
  5. 删除builder容器,删除builderx实例
sudo docker container rm container_id
sudo docker container buildx rm mybuilder
posted @ 2022-06-02 19:21  专职  阅读(498)  评论(0编辑  收藏  举报