一.Docker架构分析
如下图所示,Docker采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。
客户端和服务器可以运行在同一个 Host 上,客户端也可以通过socket或 REST API与远程的服务器通信。
推荐阅读:
https://docs.docker.com/get-started/overview/
1.Client
Docker客户端,最常用的Docker客户端是docker命令。通过docker我们可以方便地在Host上构建和运行容器。
docker支持很多操作(docker命令行工具),用户也可以通过REST API与服务器通信。
Client和Docker daemon通信可使用https/http协议进行通信,为了安全起见,默认使用的就是https协议。
2.Docker-Host
Docker daemon:
Docker daemon是服务器组件,即Docker守护进程服务器,以Linux后台服务的方式运行。
Docker daemon运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像。默认配置下,Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开TCP监听(支持IPV4和IPV6)。
Containers:
Docker容器,用于加载Docker镜像。换句话说,Docker容器就是Docker镜像的运行实例。我们知道镜像(Image)是只读的,在启动一个Container时,其实就是基于Image来新建一个专用的可写仓供用户使用。
Image:
可将Docker镜像看成只读模板(它类似于虚拟机使用的ISO镜像文件),通过它可以创建Docker容器。例如某个镜像可能包含一个Ubuntu操作系统、一个Apache HTTP Server以及用户开发的Web应用。
镜像有多种生成方法:
(1)可以从无到有开始创建镜像;
(2)也可以下载并使用别人创建好的现成的镜像
(3)还可以在现有镜像上创建新的镜像
(4)我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作Dockerfile,通过执行docker build <docker-file>命令可以构建出Docker镜像。
公开的镜像仓库有很多种,如下所示:
Docker官方镜像地址:
https://hub.docker.com/。
阿里的docker镜像地址:
https://mirrors.aliyun.com/docker-ce/linux/
清华大学docker镜像地址:
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/
温馨提示:
生产环境中,我们通常在公司内部部署有私有镜像仓库。如使用Harbor,Docker Registry等等。在后续的文章我们会逐一对其进行讲解。
3.Registry
我们去构建镜像时,镜像做好之后应该有一个统一存放位置,我们称之为Docker仓库,Registry是存放Docker镜像的仓库(官方默认仓库在"https://hub.docker.com"),Registry分私有和公有两种。
Images和Registry之间默认使用的时https协议,当然如果你非要指定为http协议也是可以的。
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。
Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可自建Registry,也可使用官方的Docker Hub。
Docker Registry中的镜像通常由开发人员制作,而后推送至"公共"或"私有"Registry上保存,供其它人员使用,例如"部署"到生产环境。
Docker Registry可分为以下几类:
Sponsor Registry:
第三方的registry,供客户端和Docker社区使用。
Mirror Registry:
第三方的registry,只让客户使用。
Vendor Registry:
由发布Docker镜像的供应商提供的registry。
Private Registry:
通过设有防火墙和额外的安全层的私有实体提供的registry。
Registry包括Repository和Index,详细说明如下:
Repository:
由某特定的docker镜像的所有迭代版本组成的镜像仓库;
一个Registry中可以存在多个Repository:
Repository可分为"顶层仓库"和"用户仓库";
用户仓库名称格式为"用户名/仓库名"。
每个仓库可以包含多个Tag(标签),每个标签对应一个镜像;
Index:
维护用户账户,镜像的校验以及公共命名空间的信息;
相当于为Registry提供了一个完成用户认证等功能的检索接口。
4.镜像名称判断
官方仓库:
官方镜像:
nginx:1.20.1
用户上传镜像:
jasonyin2020/oldboyedu_birds:v1
第三方仓库:
用户上传镜像:
tuv7rqqq.mirror.aliyuncs.com/library/nginx:latest
5.docker、containerd的关系
为了防止docker一家独大,docker当年的实现被拆分出了几个标准化的模块,标准化的目的是模块是可被其他实现替换的,不由任何一个厂商控制。
docker由docker-client,dockerd,containerd,docker-shim,runc组成,所以containerd是docker的基础组件之一,下面是从containerd引过来的一张图。
推荐阅读:
https://containerd.io/
https://cloud.tencent.com/document/product/457/35747
二.部署docker环境
1.关闭并禁用防火墙
[root@docker201.oldboyedu.com ~]# systemctl stop firewalld
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@docker201.oldboyedu.com ~]#
2.停用并禁用selinux
[root@docker201.oldboyedu.com ~]# getenforce
Enforcing
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# setenforce 0
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# grep ^SELINUX= /etc/selinux/config
SELINUX=enforcing
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# sed -ri s'#(SELINUX=)enforcing#\1disabled#' /etc/selinux/config
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# grep ^SELINUX= /etc/selinux/config
SELINUX=disabled
[root@docker201.oldboyedu.com ~]#
3.卸载docker较旧的依赖项(如果您的操作系统是刚刚安装完成的状态,或者当前服务器没有安装过docker环境,则可以跳过该步骤)
yum -y remove docker docker-client docker-client-latest docker-common docker-lastest docker-lastest-logrotate docker-logrotate docker-engine
温馨提示:
(1)现在将Docker Engine软件包称为docker-ce,较旧的Docker Engine版本称为docker或docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项,因为新老docker版本并不相互兼容哟;
(2)如果您在之前没有安装过docker环境,则无需做当前步骤,如果您非要做该步骤,可能会出现如下图所示的情况,属于正常现象!
4.Docker engine常见的安装方法概述
您可以根据需要以不同的方式安装Docker Engine:
(1)大多数用户会 设置Docker的存储库并从中进行安装,以简化安装和升级任务。这是推荐的方法。
(2)一些用户下载并手动安装RPM软件包,并完全手动管理升级。这在诸如在无法访问互联网的空白系统上安装Docker的情况下非常有用。
(3)在测试和开发环境中,一些用户选择使用自动便利脚本来安装Docker。
温馨提示:
本篇博客是基于存储库(需要配置软件源)的方式进行安装,即在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。
5.切换国内的软件源(本案例切换的是阿里源,当然,您也可以考虑使用其它的公网软件源哟)
(1)备份CentOS官网的软件源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
(2)下载阿里云的软件源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
(3)非阿里云ESC产品推荐操作该步骤
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
(4)生成本地缓存
yum makecache
温馨提示:
上述的sed命令是可选操作,因为非阿里云ECS用户会出现"Could not resolve host: mirrors.cloud.aliyuncs.com; Unknown error"信息,不影响使用。
参考链接:
https://developer.aliyun.com/mirror/centos
6.配置docker-ce的软件源(也称为"存储库")
(1)添加docker-ce的软件源
yum -y install yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(2)官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
yum-config-manager --enable docker-ce-test # 可选操作,若不启用并不影响安装docker-ce。
yum-config-manager --enable docker-ce-nightly # 可选操作
(3)如果您启用了多个Docker存储库,则在未在yum installor yum update命令中指定版本的情况下进行安装或更新将始终安装可能的最高版本,这可能不适合您的稳定性需求,这个时候我们也可以来禁用最新的软件源哟~
yum-config-manager --disable docker-ce-test
yum-config-manager --disable docker-ce-nightly
参考链接:
https://developer.aliyun.com/mirror/docker-ce
https://docs.docker.com/engine/install/centos/
7.安装Docker Engine和容器
(1)若不指定安装的docker版本,则默认安装最新版本的Docker Engine和容器
yum -y install docker-ce docker-ce-cli containerd.io
(2)要安装特定版本的Docker Engine,请在存储库中列出可用版本,然后选择并安装。返回的列表取决于启用的存储库,并且特定于您的CentOS版本(.el7此示例中的后缀表示)
yum list docker-ce --showduplicates | sort -r
(3)通过其完全合格的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。其语法格式如下所示。
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io # 安装特定docker版本的语法格式,下面有对应的案例哟~
yum install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
温馨提示:
(1)此处我安装了指定的版本,我们可以将"/etc/yum.conf"的"keepcache"进行缓存即可。
(2)将rpm包进行打包下发到其他节点
[root@docker201.oldboyedu.com ~]# mkdir docker_rpm_20.10
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# find /var/cache/yum/ -type f -name "*.rpm" | xargs mv -t docker_rpm_20.10
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# tar zcf docker_rpm_20.10.tar.gz docker_rpm_20.10
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# ll -h
总用量 109M
drwxr-xr-x. 2 root root 4.0K 6月 9 21:00 docker_rpm_20.10
-rw-r--r--. 1 root root 109M 6月 9 21:01 docker_rpm_20.10.tar.gz
[root@docker201.oldboyedu.com ~]#
8.启动docker守护进程并设置开机自启动
[root@docker201.oldboyedu.com ~]# systemctl start docker
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# systemctl enable docker
9.查看docker的概要信息
[root@docker201.oldboyedu.com ~]# docker info
10.修改docker engine的默认Registry,建议使用国内的镜像仓库,国外的源网络会延迟较大
[root@docker201.oldboyedu.com ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# systemctl daemon-reload
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# systemctl restart docker
[root@docker201.oldboyedu.com ~]#
参考链接:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
三.dockers命令自动补全(新手必备)
1.为啥能自动补全
Linux系统许多命令都会提供该命令自身的命令补齐脚本,在安装命令时会自动安装自动补齐脚本,如果有的话,该机制在Linux中被称为bash-complete。
如下图所示,在/usr/share/bash-completion/completions/ 目录下有许多命令自动补齐的脚本,我们已经安装了docker环境。
2.安装相关依赖包
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
3.验证补全功能
如下图所示,当我们输入子命令不知道该如何是好的时候,就可以连续按两下"tab"键即可。