centos oci?CentOS 7

Podman解析

什么是 Linux容器?

Linux 容器是由 Linux 内核所提供的具有特定隔离功能的进程,Linux 容器技术能够让你对应用及其整个运行时环境(包括全部所需文件)一起进行打包或隔离。从而让你在不同环境(如开发、测试和生产等环境)之间轻松迁移应用的同时,还可保留应用的全部功能。

Linux 容器还有利于明确划分职责范围,减少开发和运维团队间的冲突。这样,开发人员可以全心投入应用开发,而运维团队则可专注于基础架构维护。由于 Linux 容器基于开源技术构建,还将便于你在未来轻松采用各类更新、更强的技术产品。包括 CRI-O、Kubernetes 和 Docker 在内的容器技术,可帮助你的团队有效简化、加速和编排应用的开发与部署。

什么是 Docker?

Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker是目前最流行的 Linux 容器解决方案,即使 Docker 是目前管理 Linux 容器的一个非常方便的工具,但它也有两个缺点:

Docker 需要在你的系统上运行一个守护进程。

Docker 是以 root 身份在你的系统上运行该守护程序。

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

什么是 Podman?

Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。

Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。

Podman官网地址:

Podman项目地址:

安装 Podman

Podman 目前已支持大多数发行版本通过软件包来进行安装,下面我们来举几个常用发行版本的例子。

Fedora/ CentOS

$ sudo yum-y install podman

Ubuntu

$ sudo apt-get update-qq$ sudo apt-get install-qq-y software-properties-common uidmap$ sudo add-apt-repository-y ppa:projectatomic/ppa$ sudo apt-get update-qq$ sudo apt-get-qq-y install podman

MacOS

$ brew cask install podman

RHEL 7

$ sudo subscription-manager repos--enable=rhel-7-server-extras-rpms$ sudo yum-y install podman

Arch Linux

$ sudo pacman-S podman

更多系统的安装方法,可参考官方文档:

使用 Podman

使用 Podman 非常的简单,Podman 的指令跟 Docker 大多数都是相同的。下面我们来看几个常用的例子:

运行一个容器

$ podman run-dt-p 8080:8080/tcp \-e HTTPD_VAR_RUN=/var/run/httpd \-e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d\-e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf\-e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/\registry.fedoraproject.org/f27/httpd/usr/bin/run-httpd

列出运行的容器

$ podman ps-a

分析一个运行的容器

$ podman inspect-l| grep IPAddress\":"SecondaryIPAddresses": null,"IPAddress":"",

查看一个运行中容器的日志

$ sudo podman logs--latest10.88.0.1-- [07/Feb/2018:15:22:11+0000]"GET/ HTTP/1.1" 200 612"-""curl/7.55.1""-"10.88.0.1-- [07/Feb/2018:15:22:30+0000]"GET/ HTTP/1.1" 200 612"-""curl/7.55.1""-"10.88.0.1-- [07/Feb/2018:15:22:30+0000]"GET/ HTTP/1.1" 200 612"-""curl/7.55.1""-"10.88.0.1-- [07/Feb/2018:15:22:31+0000]"GET/ HTTP/1.1" 200 612"-""curl/7.55.1""-"10.88.0.1-- [07/Feb/2018:15:22:31+0000]"GET/ HTTP/1.1" 200 612"-""curl/7.55.1""-"

查看一个运行容器中的进程资源使用情况

$ sudo podman top<container_id>  UID  PID  PPID  C STIME TTY      TIME CMD   0 31873 31863  0 09:21?     00:00:00 nginx: master process nginx-g daemon off;  101 31889 31873  0 09:21?     00:00:00 nginx: worker process

停止一个运行中的容器

$ sudo podman stop--latest

删除一个容器

$ sudo podman rm--latest

以上这些特性基本上都和 Docker 一样,Podman 除了兼容这些特性外,还支持了一些新的特性。

给容器设置一个检查点

$ sudo podman container checkpoint<container_id>

需要 CRIU 3.11以上版本支持,CRIU项目地址:

根据检查点位置恢复容器

$ sudo podman container restore<container_id>

迁移容器

Podman支持将容器从一台机器迁移到另一台机器。

首先,在源机器上对容器设置检查点,并将容器打包到指定位置。

$ sudo podman container checkpoint<container_id>-e/tmp/checkpoint.tar.gz$ scp/tmp/checkpoint.tar.gz<destination_system>:/tmp

其次,在目标机器上使用源机器上传输过来的打包文件对容器进行恢复。

$ sudo podman container restore-i/tmp/checkpoint.tar.gz

配置别名

如果习惯了使用 Docker 命令,可以直接给 Podman 配置一个别名来实现无缝转移。你只需要在 .bashrc 下加入以下行内容即可:

$ echo"alias docker=podman">>.bashrc$ source.bashrc

Podman如何实现开机重启容器

由于 Podman 不再使用守护进程管理服务,所以不能通过守护进程去实现自动重启容器的功能。那如果要实现开机自动重启容器,又该如何实现呢?

其实方法很简单,现在大多数系统都已经采用 Systemd 作为守护进程管理工具。这里我们就可以使用 Systemd 来实现 Podman 开机重启容器,这里我们以启动一个 Nginx容器为例子。

首先,我们先运行一个 Nginx 容器。

$ sudo podman run-t-d-p 80:80--name nginx nginx

然后,在建立一个 Systemd 服务配置文件。

$ vim/etc/systemd/system/nginx_container.service[Unit]Description=Podman Nginx ServiceAfter=network.targetAfter=network-online.target[Service]Type=simpleExecStart=/usr/bin/podman start-a nginxExecStop=/usr/bin/podman stop-t 10 nginxRestart=always[Install]WantedBy=multi-user.target

接下来,启用这个 Systemd 服务。

$ sudo systemctl daemon-reload$ sudo systemctl enable nginx_container.service$ sudo systemctl start nginx_container.service

服务启用成功后,我们可以通过 systemctl status 命令查看到这个服务的运行状况。

$ sudo systemctl status nginx_container.service● nginx_container.service- Podman Nginx Service  Loaded: loaded(/etc/systemd/system/nginx_container.service; enabled; vendor preset: disabled)  Active: active(running) since Sat 2019-08-20 20:59:26 UTC; 1min 41s ago Main PID: 845(podman)   Tasks: 16(limit: 4915)  Memory: 37.6M  CGroup:/system.slice/nginx_container.service     └─845/usr/bin/podman start-a nginxAug 20 20:59:26 Ubuntu-dev.novalocal systemd[1]: Started Podman Nginx Service.

之后每次系统重启后 Systemd 都会自动启动这个服务所对应的容器。

其它相关工具

Podman 只是 OCI 容器生态系统计划中的一部分,主要专注于帮助用户维护和修改符合 OCI 规范的容器镜像。其它的组件还有 Buildah、Skopeo 等。

Buildah

虽然 Podman 也可以支持用户构建 Docker 镜像,但是构建速度比较慢。并且默认情况下使用 VFS 存储驱动程序会消耗大量磁盘空间。

Buildah 是一个专注于构建 OCI 容器镜像的工具,Buildah 构建速度非常快并使用覆盖存储驱动程序,可以节约大量的空间。

Buildah 基于 fork-exec 模型,不以守护进程运行。Buildah 支持 Dockerfile 中的所有命令。你可以直接使用 Dockerfiles 来构建镜像,并且不需要任何 root 权限。Buildah 也支持用自己的语法文件构建镜像,可以允许将其他脚本语言集成到构建过程中。

下面是一个使用 Buidah 自有语法构建的例子。

Buildah 和 Podman 之间的一个主要区别是:Podman 用于运行和管理容器,允许我们使用熟悉的容器 CLI 命令在生产环境中管理和维护这些镜像和容器,而 Buildah 主用于构建容器。

项目地址:

Skopeo

Skopeo 是一个镜像管理工具,允许我们通过 Push、Pull和复制镜像来处理 Docker和符合 OCI 规范的镜像。

项目地址:

延伸阅读

什么是 OCI?

OCI (Open Container Initiative),是一个轻量级,开放的治理结构(项目)。在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。

OCI 项目由 Docker、CoreOS 和容器行业中的其它领导者在 2015年 6月的时候启动,OCI 的技术委员会成员包括 Red Hat、Microsoft、Docker、Cruise、IBM、Google、Red Hat 和 SUSE 等。

什么是 CRI?

CRI(Container Runtime Interface)是 Kubernetes v1.5引入的容器运行时接口,它将 Kubelet 与容器运行时解耦,将原来完全面向 Pod 级别的内部接口拆分成面向 Sandbox 和 Container 的 gRPC 接口,并将镜像管理和容器管理分离到不同的服务。

什么是 CNI?

CNI(Container Network Interface)是 CNCF 旗下的一个项目,是 Google 和 CoreOS 主导制定的容器网络标准。CNI 包含方法规范、参数规范等,是 Linux 容器网络配置的一组标准和库,用户可以根据这些标准和库来开发自己的容器网络插件。CNI 已经被 Kubernetes、Mesos、Cloud Foundry、RKT 等使用,同时 Calico、Weave等项目都在为 CNI提供插件。

总结

本文介绍三个了符合 CRI 标准的容器工具 Podman、 Buildah 和 Skopeo。这三个工具都是基于 *nix 传统的 fork-exec 模型,解决了由于 Docker 守护程序导致的启动和安全问题,提高了容器的性能和安全。

参考文档

微服务基础服务之docker篇

什么是docker

Docker最初是 dotCloud公司创始人 Solomon Hykes在法国期间发起的一个公司内部项目,它是基于 dotCloud公司多年云服务技术的一次革新,并于 2013年 3月以 Apache 2.0授权协议开源,主要项目代码在 GitHub上进行维护。Docker项目后来还加入了 Linux基金会,并成立推动开放容器联盟(OCI)。

Docker使用 Google公司推出的 Go语言进行开发实现,基于 Linux内核的 cgroup,namespace,以及 AUFS类的 Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11开始,则进一步演进为使用 runC和 containerd。

Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker技术比虚拟机技术更为轻便、快捷。

下面的图片比较了 Docker和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

传统虚拟化

Docker

为什么要用docker

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。

而且使用 Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

特性容器虚拟机启动秒级分钟级硬盘使用一般为MB一般为GB性能接近原生弱于系统支持量单机支持上千个容器一般几十个

基本概念

我们都知道,操作系统分为内核和用户空间。对于 Linux而言,内核启动后,会挂载 root文件系统为其提供用户空间支持。而 Docker镜像(Image),就相当于是一个 root文件系统。比如官方镜像 ubuntu:18.04就包含了完整的一套 Ubuntu 18.04最小系统的 root文件系统。

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

按照 Docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest作为默认标签。

Centos安装docker18

常用的docker命令

常用的docker镜像

redis

mysql

10. Docker 安装与配置

Docker是一个开源的应用容器引擎,基于LXC(Linux Container)内核虚拟化技术实现,提供一系列更强的功能,比如镜像、 Dockerfile等;Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序,程序之间相互隔离;

容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的一个独立的进程,不占用其他任何可执行文件的内存,非常轻量、高效、快速。

虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

参考:

Linux版本CentOS7

使用加速器可以提升获取Docker官方镜像的速度,下面使用阿里云镜像进行加速。

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

Docker守护进程绑定在 Unix socket而不是 TCP端口。默认情况下 Unix socket归属于 root用户,其他用户只能通过 sudo命令访问。所以 Docker守护进程总是以 root用户来运行。

如果你不希望每次运行 docker命令时在前面加上 sudo,你可以创建一个 docker用户组并把用户加进去。当 Docker守护进程启动时,会创建一个 Unix socket供 docker用户组成员访问

创建 docker用户组并添加你的用户

什么是 DockerHub以及为什么它很重要?DockerHub是一个由 Docker公司运行和管理的基于云的存储库。它是一个在线存储库,Docker镜像可以由其他用户发布和使用。

有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用。

镜像层和容器层

Docker服务端是Docker所有后台服务的统称。其中dockerd是一个非常重要的后台管理进程,它负责响应和处理来自Docker客户端的请求,然后将客户端的请求转化为Docker的具体操作。

例如:镜像、容器、网络和挂载卷等具体对象的操作和管理。

Docker从诞生到现在,服务端经历了多次架构重构。起初,服务端的组件是全部集成在docker二进制里。但是从 1.11版本开始, dockerd已经成了独立的二进制,此时的容器也不是直接由dockerd来启动了,而是集成了containerd、runC等多个组件。

虽然 Docker的架构在不停重构,但是各个模块的基本功能和定位并没有变化。它和一般的 C/S架构系统一样,Docker服务端模块负责和 Docker客户端交互,并管理Docker的容器、镜像、网络等资源。

Docker有两个至关重要的组件: runC和containerd。

runC是Docker官方按照OCI容器运行时标准的一个实现。通俗地讲,runC是一个用来运行容器的轻量级工具,是真正用来运行容器的。

containerd是Docker服务端的一个核心组件,它是从dockerd中剥离出来的,它的诞生完全遵循OCI标准,是容器标准化后的产物。containerd通过containerd-shim启动并管理runC,可以说containerd真正管理了容器的生命周期。

1.容器中长期运行程序

有两种方式:

2.容器开启和停止程序

有两种方式

3.进入容器

有2种方法

想要web部署在互联网上或者在Web上访问应用;

个人电脑处于私网中; IP地址处于 IPV4和 IPV6;

安装appium

排错,困难

测试adb

改变TCPIP连接方式

查看appium运行日志

容器端口号为 4723

开启nginx,就可以在web访问 192.168.0.100;

Dockerfile其实可以看做一个命令集。每行均为一条命令。每行的第一个单词,就是命令command。后面的字符串是该命令所要接收的参数。比如ENTRYPOINT/bin/bash。ENTRYPOINT命令的作用就是将后面的参数设置为镜像的entrypoint。至于现有命令的含义,这里不再详述。DockOne上有很多的介绍。

FROM指令用于指定其后构建新镜像所使用的基础镜像。FROM指令必是 Dockerfile文件中的首条命令,启动构建流程后,Docker将会基于该镜像构建新镜像,FROM后的命令也会基于这个基础镜像。

在镜像的构建过程中执行特定的命令,并生成一个中间镜像。格式:

最多127层,不是写shell;

阅读剩余
THE END