Podman 和 Docker 的安装、部署和设置

系统 Linux
容器部署是实际使用和实践容器的第一步,本文结合笔者实际生产实践使用,详细梳理了Podman和Docker如何在不同环境下(在线环境及离线环境)进行安装和部署,以及在部署后如何对Docker的常用功能进行相关设置以便更好地使用,并对容器部署中可能遇到的坑进行了说明。

1、Linux 容器介绍

Linux容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供, 这意味着从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。因而,相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多。容器比较普遍也易于使用,因此也成了 IT 安全方面的重要组成部分。

图片

容器可以确保您的应用拥有必需的库、依赖项和文件,让您可以在生产中自如地迁移这些应用,无需担心会出现任何负面影响。实际上,您可以将容器镜像中的内容,视为 Linux 发行版的一个安装实例,因为其中完整包含 RPM 软件包、配置文件等内容。

容器从出现开始,迅速成为现代数据中心的必要组成部分。目前流行的容器引擎包括Docker以及下一代符合Open Container Initiative(OCI)标准的容器。

Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单的容器使用接口,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到Linux 机器上,但Docker也有两个主要缺点:

  • Docker 需要在你的系统上运行一个守护进程;
  • Docker 是以 root 身份在你的系统上运行该守护程序。

这些缺点的存在可能有一定的安全隐患,为了解决这些问题,下一代容器化工具Podman出现了。图片

Podman是一个开源的容器管理工具,其可在大多数Linux平台上使用,它是一种无守护程序的容器引擎,用于在Linux系统上开发,管理和运行任何符合Open Container Initiative(OCI)标准的容器和容器镜像, 提供了一个与Docker兼容的命令行前端。Podman控制下的容器既可以由root用户运行,也可以由非特权用户运行。

使用Podman,Skopeo和Buildah的新一代容器架构工具后,可以解决由于docker守护程序导致的启动和安全问题。

2、Podman 和docker主要不同之处

docker 需要在我们的系统上运行一个守护进程(docker daemon),而podman 不需要。

  • 启动容器的方式不同: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。
  • docker需要使用root用户来创建容器,但是podman不需要。

3、Podman部署和常见操作

Podman的安装部署非常简便,参考如下:

(1). Arch Linux & Manjaro Linux

sudo pacman -S podman

(2). Fedora,Centos,RHEL

sudo yum -y install podman

(3). Gentoo

sudo emerge app-emulation/libpod

(4). MacOS

brew cask install podman

基本常用命令:

podman info
podman version
podman images
podman rmi
podman ps

Podman CLI 里面很多指令都和Docker CLI 相同,官方给出了这么个例子alias docker=podman,所以说经常使用Docker CLI的人使用Podman上手非常快。

运行一个容器

图片

列出当前所有的容器

图片

查看一个镜像信息

图片

查看容器运行的日志

图片

查看运行中容器资源使用情况

图片

图片


4、Docker部署

4.1 部署准备工作

Docker CE即社区版(Community Edition),免费使用。这里以CentOS为例来介绍Docker的部署流程。在部署前,需要具备以下环境:

  • CentOS 7 及以上版本的操作系统
  • Linux内核版本不低于3.10(CentOS 7 满足最低内核的要求)
  • 已启用centos-extras仓库(默认情况此仓库是启用的,使用yum repolist可以查看是否存在。如未启用,可安装yum-utils后执行 yum-config-manager --enable extras 进行启用)
  • 若安装了旧版本Docker相关内容,需进行卸载,旧版本的Docker称为docker或者docker-engine,卸载命令如下:(若未做说明,后续命令均以root用户执行)

图片

若服务器能够连接到互联网,可参考在线部署步骤进行Docker安装,如无法连接到互联网,可参考离线部署步骤进行Docker安装。

4.2 在线部署步骤

安装必要的软件包

先安装如下的软件包:yum-utils,方便后续配置yum仓库

图片

配置docker-ce稳定仓库

图片

注意,docker-ce.repo中也包含了nightly及test仓库,默认没有启用,可以使用 sudo yum-con-fig-manager --enable docker-ce-nightly 进行启用,一般无需启用。

安装最新版本的docker-ce

图片

该命令默认安装了最新版本的docker-ce,安装过程中如需校验GPG key,输入"y"确认即可。

执行完成后,Docker已经成功安装,但是还未启动,建议先不要启动,完成后续“部署完成后相关设置”后再启动Docker。

安装指定版本的docker-ce

首先使用如下命令查看docker-ce.repo中有哪些docker-ce版本。

图片

第二列的部分字符串(冒号之后连接号之前)是版本号,例如可以使用如下命令安装指定版本:

图片

该命令会安装指定版本的docker-ce,安装中如需校验GPG key,输入"y"确认即可。

执行完成后,Docker已经成功安装,但是还未启动,建议先不要启动,完成后续“部署完成后相关设置”后再启动Docker。

4.3 离线部署步骤

执行完成后,Docker已经成功安装,但是还未启动,建议先不要启动,完成后续“部署完成后相关设置”后再启动Docker。

官方步骤及存在的坑

安装18.09.1版本:

官方给的文档说明是,到Docker官网下载指定版本的rpm包 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/,然后再使用yum进行安装。

这种方式会存在一个问题,在完全离线的环境中,直接安装docker官网下载的rpm包会缺少很多依赖,这些依赖需要手动去下载相应的rpm包进行升级或者安装,非常麻烦。因此这里推荐以下方法进行离线安装。

下载所有的rpm包到本地

(1)在可以上网的环境(例如个人电脑),安装一台与离线环境机器相同操作系统的虚拟机,确保该虚拟机能够访问互联网,在安装虚拟机操作系统时最好选择最小化安装。假设操作系统为CentOS。

(2)安装完毕后,配置机器的yum源(建议配置阿里云的镜像),先备份/etc/yum.repos.d/。

图片

(3)然后配置CentOS-Base.repo及docker-ce.repo

图片

(4)下载docker-ce相关的rpm包。

图片

创建repo仓库

在以上能联网的虚机上安装createrepo创建仓库。

图片

此时会在 /tmp/rpm_download 下生成repodata仓库数据文件夹。

在离线环境进行安装

拷贝以上文件到离线环境的机器上,配置本地yum源进行安装。

将以上文件夹拷贝到离线环境的机器上,假设目录也为/tmp/rpm_download

配置离线环境机器的本地yum源。

图片

至此,完成了离线环境下docker的安装。

4.4 部署完成后相关设置

配置非root用户使用Docker命令

Docker daemon默认监听一个Unix套接字(/var/run/docker.sock),这个Unix套接字默认属于用户root,其他用户如果要使用docker命令行与daemon通信,则必须使用sudo。

非root用户每次都使用sudo比较麻烦,可以创建一个名为“docker”的组(安装完docker后默认就有),然后把非root用户加入到docker组里面,就可以直接访问Docker daemon了。

图片

注意,如果已经使用了sudo,然后再把该用户加入到docker组,可能会因为目录权限的问题导致报错,使用以下命令修复即可。

图片

配置Docker开机自启动

CentOS 7中使用Systemd管理服务,执行以下命令即可。

图片

配置默认的日志驱动

Docker daemon的默认日志驱动是json-file,可以把docker容器的标注输出、标准错误输出到json文件中,也可以支持其他日志驱动,例如local、journald,通过在/etc/docker/daemon.json中配置。

图片

也可以在创建容器时,指定容器使用的日志驱动,例如:

图片

配置Docker daemon监听TCP端口

默认情况下,Docker
daemon监听一个本地的Unix
socket,接收来自本地docker客户端的请求。如果要从远程访问,比如docker-compose、docker-swarm之类的工具需要与Docker
daemon通信,可以让Docker daemon监听一个本地的tcp端口。

CentOS系统下,修改文件/usr/lib/systemd/system/docker.service,修改如下内容:

图片

然后重启docker。

图片

使用 netstat -tnlp | grep 2375 可以看到dockerd进程监听了2375端口。

配置镜像下载加速

默认情况下Docker会从国外的镜像仓库pull镜像,可以使用国内的仓库镜像服务器以加快pull image 的速度,同时增加下载的并发数。

CentOS系统下,修改docker配置文件/etc/docker/daemon.json。

图片

然后重启docker。

图片

配置Docker的默认网桥

Docker服务启动后默认会创建一个docker0网桥,它使用的默认网段是172.xx.xx.xx,假设部署docker的机器也是用这个网段,则可能会有冲突,可以修改docker默认的网段。

CentOS系统下,修改docker配置文件/etc/docker/daemon.json

图片

然后重启docker。

图片

4.5 功能验证

启动Docker

图片

查看docker状态信息

图片

运行hello-world容器

图片

首次运行会从远程镜像仓库下载hello-world镜像,并启动一个容器,当容器运行时会输出一段信息,然后自动退出,通过 docker ps -a 可以查看。

Docker daemon的日志

systemd使用journalctl命令统一管理所有Unit的启动日志,使用以下命令可以查看Docker daemon日志。

图片

Docker卸载

图片

5、本章小结

本文介绍了容器的部署过程和简单的容器操作,分别说明了Docker和下一代容器工具Podman的区别。目前,Docker容器引擎还被很多的工程师广泛使用,但是由于其本身的局限性,未来符合OCI标准的Podman还是会逐渐成为社区主流,而被广大的开发人员、运维人员所接受。技术在不断发展,新的工具在涌现,我们可以根据相应的新的容器工具链,构建一个与
Docker 完全兼容,然而却更加轻量、灵活和安全的容器环境。

参考引用:Podman 官网地址:https://podman.io/Podmanhttps://www.redhat.com/zh/topics/containers/whats-a-linux-containerhttps://baijiahao.baidu.com/s?id=1653853217702500436&wfr=spider&for=pchttps://www.redhat.com/zh/topics/containers/whats-a-linux-containerhttps://www.cnblogs.com/shoufu/p/11803010.html

责任编辑:庞桂玉 来源: 运维派
相关推荐

2022-05-05 08:08:55

Podman命令Linux

2022-06-26 09:29:41

PodmanDocker

2022-01-17 10:56:59

2021-08-09 09:39:59

2022-01-17 10:07:05

2022-04-27 10:51:00

PythonMLCubePodman

2021-02-17 09:39:41

2021-02-17 09:16:58

PodmanLinuxDocker

2022-01-18 17:57:21

2021-05-17 12:54:04

AnsiblePodman开源

2021-07-25 10:34:17

2018-10-26 16:20:27

点赞
收藏

51CTO技术栈公众号