【导读】容器部署是实际使用和实践容器的第一步,本文结合笔者实际生产实践使用,详细梳理了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/Podman
https://www.redhat.com/zh/topics/containers/whats-a-linux-container
https://baijiahao.baidu.com/s?id=1653853217702500436&wfr=spider&for=pc
https://www.redhat.com/zh/topics/containers/whats-a-linux-container
https://www.cnblogs.com/shoufu/p/11803010.html