• [ Docker ] 基础安装使用及架构


    目录
    - Centos7 安装 Docker
    - Docker 架构

    1. CentOS7 安装 Docker

    目前 docker 有三个分支,moby、docker-ce、docker-ee

    moby 是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品。

    docker-ce 是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品

    docker-ee 是docker公司维护的闭源产品,是docker公司的商业产品。

    这里在 CentOS 7 上 通过 yum 安装 docker-ce

    [root@node1 ~]# uname -r 
    3.10.0-327.el7.x86_64
    [root@node1 ~]# cat /etc/redhat-release 
    CentOS Linux release 7.2.1511 (Core)
    

     清华yum 源关于 docker-ce 的安装过程已经很清楚了:https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/

    安装依赖:
    [root@node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
    
    下载 repo 文件:
    [root@node1 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
    
    软件仓库替换为 TUNA
    [root@node1 ~]# sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
    

    查看docker-ce 版本:

    目前安装版本是:19.03.3

    [root@node1 ~]# yum install docker-ce -y
    
    安装完成,启动服务:
    [root@node1 ~]# systemctl start docker
    

    查看 docker 相关信息:

    [root@node1 ~]# docker info
    

     

    运行 docker info 出现告警信息:

    WARNING: bridge-nf-call-iptables is disabled
    WARNING: bridge-nf-call-ip6tables is disabled
    

     解决办法:

    [root@node1 ~]# vim /etc/sysctl.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    
    [root@node1 ~]# sysctl -p
    

     再次运行 docker info

    出现如上告警信息,建议升级到 CentOS 7.4 以上版本,xfs 原生支持。

    告警信息:不推荐使用devicemapper存储驱动程序,它将在将来的版本中被删除。

    在docker 19版本中,不再推荐使用 devicemapper 存储驱动程序,需要切换到 overlayfs,那什么是 overlayfs?
    首先,overlayfs是一种文件系统,也是目前dokcer在使用的最新的文件系统,其他的文件系统还有:aufs、device mapper等。而 overlayfs 其实和 aufs 是类似的。更准确的说,overlayfs,其实是 Linux 文件系统的一种上层文件系统。下面的底层的文件系统格式,是支持overlayfs的:

    • ext4
    • xfs(必须在格式为 xfs 的时候,指定 -n ftype=1,如果在 未使用 ftype=1 的方式格式化的xfs文件系统上使用,则docker可能会出现未知错误)


    如何查看当前操作系统是否支持 overlay

    [root@node1 ~]# lsmod | egrep overlay
    

    如果没有输出,表示不支持,可以通过下面的命令开启overlay

    [root@node1 ~]# modprobe overlay
    

    需要注意的是:

    • docker官方,建议使用 overlay2,而不是 overlay,因为 overlay2 更高效。要使用 overlay2的话,需要 Linux 内核在版本4以上。
    • 只要当前操作系统支持overlay,那docker就可以使用overlay或者overlay2了。
    • 指定docker的overlay2驱动,需要在启动docker的时候,指定 --storage-driver 参数,或者,在配置文件 /etc/docker/daemon.json 中 ,指定驱动配置

    xfs文件系统的 d_type是什么

    d_type 是 Linux 内核的一个术语,表示 “目录条目类型”,而目录条目,其实是文件系统上目录信息的一个数据结构。d_type,就是这个数据结构的一个字段,这个字段用来表示文件的类型,是文件,还是管道,还是目录还是套接字等。

    d_type 从 Linux 2.6 内核开始就已经支持了,只不过虽然 Linux 内核虽然支持,但有些文件系统实现了 d_type,而有些,没有实现,有些是选择性的实现,也就是需要用户自己用额外的参数来决定是否开启d_type的支持。

    为什么docker在overlay2(xfs文件系统)需要d_type

    不论是 overlay,还是 overlay2,它们的底层文件系统都是 overlayfs 文件系统。而 overlayfs 文件系统,就会用到 d_type 这个东西用来文件的操作是被正确的处理了。换句话说,docker只要使用 overlay 或者 overlay2,就等于在用 overlayfs,也就一定会用到 d_type。

    docker info 用来检测你docker服务,是否在使用overlay的时候正确的使用 d_type。如果用了 overlay/overlay2,但 d_type 没有开,就报警告。

    如果在不支持 d_typ 的 overlay/overlay 驱动下使用docker,也就意味着 docker 在操作文件的时候,可能会遇到一些错误,比如 无法删除某些目录或文件,设置文件或目录的权限或用户失败等等。这些都是不可预料的错误。举个具体的场景,就是,docker构建的时候,可能在构建过程中,删除文件等操作失败,导致构建停止。

    如何检测当前的文件系统,是否支持 d_type ?

    其中的 ftype,1表示支持 d_type,0表示不支持。

    因此要处理这个错误,在安装操作系统的时候就需要做好准备:

    • 安装操作系统的时候使用 ext 文件系统格式
    • 预留分区安装完成后进行格式化挂载

    .

    因为这里是虚拟机,通过添加一块磁盘,格式化后进行挂载使用。

    [root@node1 ~]# systemctl stop docker 
    [root@node1 ~]# lsblk 
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0              11:0    1    4G  0 rom  /mnt/centos7
    vda             252:0    0  100G  0 disk 
    ├─vda1          252:1    0  500M  0 part /boot
    └─vda2          252:2    0 99.5G  0 part 
      ├─centos-root 253:0    0   50G  0 lvm  /
      ├─centos-swap 253:1    0  7.9G  0 lvm  [SWAP]
      └─centos-home 253:2    0 41.6G  0 lvm  /home
    vdb             252:16   0   10G  0 disk
    

    这里使用 vdb进行分区并挂载作为 docker 的文件系统。

    分区

    [root@node1 ~]# fdisk /dev/vdb
    

    格式化

    挂载

    [root@node1 ~]# mount /dev/vdb1  /var/lib/docker
    

    启动 docker 服务

    [root@node1 ~]# systemctl start docker
    

    告警解除,而文件启动更改为默认的 overlay2 文件系统格式。

    测试 docker 运行:

    输出这段提示以后,hello world 就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如Mysql镜像等。

    Docker 提供了一套简单实用的命令来创建和更新镜像,可以通过网络直接下载一个已经创建好了的应用镜像,并通过 Docker RUN 命令就可以直接使用。当镜像通过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器,容器可以理解为一个轻量级的沙箱, Docker 利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker 镜像。

     Docker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 docker 命令行运行命令时, Docker 客户端将这些命令发送给服务器端,服务端将执行这些命令。 docker 命令使用 docker API 。 Docker 客户端可以与多个服务端进行通信。

    2. Docker 架构

    Docker 架构图

    Docker 的核心组件包括:

    • Docker client
    • Docker daemon
    • Docker Image
    • Docker Registry
    • Docker Container

    Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。

    Docker Client

    Docker Client ,也称 Docker 客户端。它其实就是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。

    Docker daemon

    Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。它负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。

    Docker Image

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

    镜像有多种生成方法:

    • 从无到有开始创建镜像
    • 下载并使用别人创建好的现成的镜像
    • 在现有镜像上创建新的镜像

    Docker Registry

    Docker registry 是存储 docker image 的仓库,它在 docker 生态环境中的位置如下图所示:

     运行docker push、docker pull、docker search时,实际上是通过 docker daemon 与 docker registry 通信。

    Docker Container

    Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。 Docker Container 提供了系统硬件环境,我们可以使用 Docker Images 这些制作好的系统盘,再加上我们所编写好的项目代码, run 一下就可以提供服务啦。

    Docker组件是如何协作运行容器

    容器启动过程如下:

    可以通过docker images 可以查看到 hello-world 已经下载到本地

    可以通过docker ps 或者 docker container ls 显示正在运行的容器,我们可以看到, hello-world 在输出提示信息以后就会停止运行,容器自动终止,所以在查看的时候没有发现有容器在运行。

    Docker 组件协作运行容器可以分为以下几个过程:

    1. Docker 客户端执行 docker run 命令
    2. Docker daemon 发现本地没有我们需要的镜像
    3. daemon 从 Docker Hub 下载镜像
    4. 下载完成后,镜像被保存到本地
    5. Docker daemon 启动容器

    Docker 常用命令

    参考链接:

    https://www.jianshu.com/p/00ffd8df6010

  • 相关阅读:
    c++ 从vector扩容看noexcept应用场景
    c++11-17 模板核心知识(十一)—— 编写泛型库需要的基本技术
    动态链接的PLT与GOT
    c++11-17 模板核心知识(十)—— 区分万能引用(universal references)和右值引用
    Golang性能分析与优化
    c++11-17 模板核心知识(九)—— 理解decltype与decltype(auto)
    [LuoguP4808][CCC 2018]平衡树(数论分块+记忆化搜索)(有复杂度证明)
    [NOI2016]区间(线段树+尺取法)
    [BZOJ4316]小C的独立集(仙人掌+树形DP)
    [CTSC2002]灭鼠行动(模拟)
  • 原文地址:https://www.cnblogs.com/hukey/p/11656096.html
Copyright © 2020-2023  润新知