[ 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

告警信息:不推荐使用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

猜你喜欢

转载自www.cnblogs.com/hukey/p/11656096.html