本期目录
1. Docker介绍
1.1 Docker解决的问题
-
技术职级变化。开发逐渐承担起运维的角色,演变成最近非常火爆的概念【DevOps】。开发者的职级升级打怪之路变为:Coder --> Programmer --> Software Engineer --> DepOps Engineer 。兼开发与运维一体的 (DevOps) 新一代开发工程师。
-
一次构建,随处运行。
- 更快速的应用交付和部署;
- 更便捷的升级和扩缩容;
- 更简单的系统运维;
- 更高效的计算资源利用。Docker 是内核级虚拟化,所以在一台物理机上可以运行很多个容器的实例,大大提升物理服务器的 CPU 和内存的利用率。
2. Docker和虚拟机的区别
2.1 虚拟机的缺点
- 资源占用多
- 冗余步骤多
- 启动慢
2.2 Docker的优点
- 容器不需要捆绑一整套操作系统,只包含保证软件能正常运行的最小 Linux 内核 (Ps. CentOS/Ubuntu 基础镜像仅 170 MB )、库资源和设置。系统因此变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
- Docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker 优势体现为启动速度快、体积占用小。
2.3 比较
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程;
- 内核级虚拟化。Docker 容器内的应用进程直接运行在宿主机的内核 (复用) ,容器内没有自己的内核且没有进行硬件虚拟化。因此 Docker 容器比传统虚拟机更改为轻便;
- 每个 Docker 容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
3. Docker架构
- Docker 的架构由三要素组成:
- 镜像 (image)
- 容器 (container)
- 仓库 (repository)
3.1 镜像和容器
1)镜像
- 镜像是只读的。一个镜像可以创建出多个容器 (container) ,可以理解为 Java 里的类。
2)容器
- 而创建出来的 Docker 容器,可以理解为 Java 中的类 new 实例化出来的一个一个对象。
- 镜像是静态的定义,而容器是运行时的实体。容器为镜像提高了一个标准的和隔离的运行环境,容器可以被启动、开始、停止和删除。每个容器都是相互隔离的、保证安全的平台。
- 可以把容器看作是一个简易版的 Linux 环境 (包括 root 权限、进程空间、用户空间和网络空间等) 和运行在其上的应用程序。
3.2 Docker和DockerHub
- 为了提高下载速度,一般国内的公开仓库使用阿里云。
3.3 整体结构及底层通信原理
- Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上,然后通过 Socket 连接从客户端访问,守护进程 ( Docker Daemon) 从客户端接受命令并管理运行在主机上的容器。Docker 运行的基本流程为:
- 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
- Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 job 的形式存在。
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载的镜像以 Graph 的形式存储。
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network Driver 创建并配置 Docker 容器网络环境。
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec Driver 来完成。
- Libcontainer 是一项独立的容器管理包,Network Driver 以及 Exec Driver 都死通过 Libcontainer 来实现具体对容器进行的操作。
- Docker 内部的高级架构图如下所示。了解并熟知这个架构图是学习 Docker 高级篇的重要基础。
4. 安装Docker
- Docker 官网:https://www.docker.com/
- Docker Hub 官网:https://hub.docker.com/
- Docker 必须部署在 Linux 内核的系统上。其他操作系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
4.1 安装条件
- 操纵系统:CentOS 7 (64 bit)
- Linux 内核版本 3.8 以上。可以使用命令
uname -r
查询 Linux 内核版本。
4.2 卸载旧版本
-
如果你的 Linux 服务器曾经装过 Docker ,首先执行下列命令卸载。
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
其中,
\
在 Linux 终端中表示太长了,下一行继续。
4.3 yum安装gcc相关
-
确保你的 CentOS 7 能连上网。
$ ping www.baidu.com
-
安装 gcc 编译工具。
$ yum -y install gcc
-
安装 gcc-c++ 编译工具。
$ yum -y install gcc-c++
4.4 安装需要的软件包
-
安装
yum-utils
软件包。$ yum install -y yum-utils
4.5 设置stable镜像仓库
-
这一步和官网操作略有不同,还是因为 Docker 官方 stable 仓库服务器在国外,拉取镜像时网速会很慢。因此还是使用国内的阿里云、腾讯云等镜像仓库。笔者这里设置为阿里云镜像仓库。
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.6 更新yum软件包索引
-
因为后续我们很多都是通过 yum 下载安装,这部分属于 Linux 基础知识。相当于重建 yum 索引,以后安装就能快一些。
$ yum makecache fast
4.7 安装Docker CE
-
开始安装 Docker 引擎,这一步才是真正开始安装 Docker 。
$ yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
4.8 启动Docker
-
安装好后就可以直接启动 Docker 引擎了。
$ systemctl start docker
-
查看 Docker 引擎是否成功启动。
$ ps -ef | grep docker
或者:
$ systemctl status docker
出现上面的画面,恭喜你,Docker 引擎已经成功启动了。
4.9 开机自启
$ systemctl enable docker
4.10 测试
-
通过查看 Docker 版本来验证是否成功安装。
$ docker version
从这里也很容易看出来 Docker 是 C/S 架构。
-
运行
hello-world
镜像来验证 Docker 引擎是否正确地安装。$ docker run hello-world
如果看到上面的页面,说明 Docker 安装成功。也能看到 Docker 先去本地仓库查找是否有
hello-world:latest
镜像,在本地仓库找不到,就去阿里云远程仓库 pull 拉取镜像,然后运行镜像成一个容器。
4.11 卸载
-
如有需要卸载 Docker ,依次执行下列命令即可。
$ systemctl stop docker
$ yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ rm -rf /var/lib/docker
$ rm -rf /var/lib/containerd
5. 阿里云镜像加速器
5.1 介绍
- 为了后续从远程仓库拉取镜像更加快速,我们给 Docker 配置阿里云镜像加速器。
5.2 操作
-
先注册一个阿里云账号。用淘宝、支付宝账号登录即可。点击【控制台】。
-
点击【容器镜像服务】。
-
点击【镜像加速器】。
-
复制加速器地址。下面也说明了 CentOS 的操作文档,下面按照操作文档操作。
-
创建
daemon.json
文件并往里写入镜像加速器地址链接。$ tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://1s3b33m1.mirror.aliyuncs.com"] } EOF
-
重启 Docker daemon 守护进程使上面的配置生效。
$ systemctl daemon-reload
-
重启 Docker 生效。
$ systemctl restart docker
-
再次运行
hello-world
镜像来验证 Docker 引擎是否正确地安装。$ docker run hello-world
如果看到上面的页面,说明 Docker 安装成功。