Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的 Linux 机器上。容器是彻底使用沙箱机制,相互之间不会有任何接口。前端
Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 很是类似的功能。正如前面提到的那样,它不须要在你的系统上运行任何守护进程,而且它也能够在没有 root 权限的状况下运行。
Podman 能够管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。nginx
- Podman 官网地址:https://podman.io/
- Podman 项目地址:https://github.com/containers/libpod
docker cli
命令经过API跟 Docker Engine(引擎)
交互告诉它我想建立一个container,而后docker Engine
才会调用OCI container runtime(runc)
来启动一个container。这表明container的process(进程)不会是Docker CLI
的child process(子进程)
,而是Docker Engine
的child process
。Podman
是直接给OCI containner runtime(runc)
进行交互来建立container的,因此container process
直接是podman
的child process
。--restart
策略,可是podman不支持,若是在k8s中就不存在这个问题,咱们能够设置pod的重启策略,在系统中咱们能够采用编写systemd服务来完成自启动sudo pacman -S podman
sudo yum -y install podman
sudo emerge app-emulation/libpod
brew cask install podman
Podman CLI 里面87%的指令都和DOcker CLI 相同,官方给出了这么个例子alias docker=podman
,因此说常常使用DOcker CLI的人使用podman上手很是快git
podman run -dt -p 80:80 --name nginx -v /data:/data -e NGINX_VERSION=1.16 nginx:1.16.0
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19f105d5dc1e docker.io/library/nginx:1.16.0 nginx -g daemon o... 2 minutes ago Up 2 minutes ago 0.0.0.0:80->80/tcp nginx
# podman inspect nginx | grep -i "ipaddress" "SecondaryIPAddresses": null, "IPAddress": "10.88.0.110",
podman logs nginx
# podman top nginx USER PID PPID %CPU ELAPSED TTY TIME COMMAND root 1 0 0.000 5m26.420969043s pts/0 0s nginx: master process nginx -g daemon off; nginx 6 1 0.000 5m26.421085502s pts/0 0s nginx: worker process # podman stats nginx ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS 19f105d5dc1e nginx -- 2.036MB / 1.893GB 0.11% 978B / 10.55kB -- / -- 2
Podman 支持将容器从一台机器迁移到另外一台机器。
首先,在源机器上对容器设置检查点,并将容器打包到指定位置。github
$ sudo podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz $ scp /tmp/checkpoint.tar.gz <destination_system>:/tmp
其次,在目标机器上使用源机器上传输过来的打包文件对容器进行恢复。docker
$ sudo podman container restore -i /tmp/checkpoint.tar.gz
因为 Podman 再也不使用守护进程管理服务,因此不能经过守护进程去实现自动重启容器的功能。那若是要实现开机自动重启容器,又该如何实现呢?
其实方法很简单,如今大多数系统都已经采用 Systemd 做为守护进程管理工具。这里咱们就可使用 Systemd 来实现 Podman 开机重启容器,这里咱们以刚才启动的nginx为例。
创建一个 Systemd 服务配置文件。vim
$ vim /etc/systemd/system/nginx_podman.service [Unit] Description=Podman Nginx Service After=network.target After=network-online.target [Service] Type=simple ExecStart=/usr/bin/podman start -a nginx ExecStop=/usr/bin/podman stop -t 10 nginx Restart=always [Install] WantedBy=multi-user.target
接下来,启用这个 Systemd 服务bash
$ sudo systemctl daemon-reload $ sudo systemctl enable nginx_podman.service $ sudo systemctl start nginx_podman.service
以后每次系统重启后 Systemd 都会自动启动这个服务所对应的容器,容器死亡以后也会启动这个容器,咱们能够用下面的例子作测试
打一个sleep 30的docker包,这个容器运行起来一次只能坚持30sapp
$ vim Dockerfile FROM busybox:latest CMD ["sh","-c","sleep 30"]
而后按照上述方式设置启动自启动tcp
咱们刚才启动了一个nginx的podman 如今咱们来看一下他的进程ide
# ps -ef | grep [n]ginx root 19368 19359 0 11:38 pts/0 00:00:00 nginx: master process nginx -g daemon off; 101 19381 19368 0 11:38 pts/0 00:00:00 nginx: worker process
而后查看这个nginx的父进程是那个
# ps -ef | grep 19359 root 19359 1 0 11:38 ? 00:00:00 /usr/libexec/podman/conmon 。。。。
因此验证了我上面的说法