Docker
- 一、Docker认识
- 二、Docker功能
- 1、更快速的交付和部署
- 2、更高效的虚拟化
- 3、更轻松的迁移和扩展
- 4、更简单的管理
- Docker 和 VM
- 三、学习Docker前的必备知识
- 1、环境配置
- 2、虚拟化部署方式
- 3、虚拟化优点
- 4、虚拟化局限性
- 5、容器与虚拟机的区别
- 6、Docker为什么比VM快?
- 7、虚拟化与容器
- 四、Docker详细介绍
- 1、简介
- 2、应用场景
- 3、Docker使用
- 4、Docker镜像上运行Docker容器的优势
- 4.1 标准性
- 4.2 轻巧性
- 4.3 隔离安全性
- 4.4 Docker实现DevOps(开发、运维)
- 5、仓库(Registry)
- 6、镜像(Images)
- 7、容器(Containers)
- 8、主机(Host)
- 9、Docker守护程序(Daemon)
- 10、Docker客户端(Client)
- 五、安装Docker
- 1、通过 yum 的方式安装
- 2、yum安装方式二
- 3、下载 rpm 包的安装方式
- 4、国内镜像加速操作
一、Docker认识
如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。
Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时"在我的机器上可正常工作"的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server 应用发布新功能。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker最初是dotCloud公司创始人Solomon Hykes 在法国期间发起的一个分公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache2.0授权协议开源,主要项目代码在GitHub上进行维护。Docker项目后来还加入了Linux基金会,并成立推动开放容器联盟(OCI)。
二、Docker功能
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可。
1、更快速的交付和部署
对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器很轻很快。容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker容器的运行不需要额外的 hypervisor(管理程序)支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另一个。
4、更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都已增量的方式被分发和更新,从而实现自动化并且高效得出管理。
Docker 和 VM
VM是一个运行在宿主机上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,比如隔离效果不如VM,共享宿主操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。
作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Docker容器。
三、学习Docker前的必备知识
1、环境配置
- 软件开发最大的麻烦事之一,就是环境配置
- 相信每位编程初学者都会在环境配置上倒腾很久,而作为老师也会因为不同机器出现五花八门的环境配置问题而烦恼
- 想要软件正常运行,那么系统的设置和各种库、组件正确的安装才能如期运行
- 举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量
- 当你需要换机器的时候,你之前所配置的环境又要重头来一遍,非常麻烦
2、虚拟化部署方式
一个主机部署多个虚拟机,每个虚拟机可以部署多个应用
比如在Windows系统里面运行Linux系统的VM
对于底层系统(主机)来说,虚拟机就是一个普通文件,不需要就删掉,对主机没有影响
3、虚拟化优点
- 资源池: 一个物理机的资源分配到了不同的虚拟机
- 易扩展: 添加物理主机或虚拟机
- 易云化: 阿里云、AWS提供虚拟化技术
4、虚拟化局限性
- 资源占用多: 每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,物理主机本身消耗的资源势必增多
- 冗余步骤多: 虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录
- 启动慢: 启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行
5、容器与虚拟机的区别
容器和虚拟机都具有相似的资源隔离和分配特点,但是功能不同,因为容器虚拟化了操作系统,而不是硬件,所以更加便携和高效
比较点 | 容器 | VM |
---|---|---|
抽象层 | 应用程序的抽象,将代码和依赖项打包在一起(容器是应用层面的隔离) | 将一台服务器转变为多台服务器的物理硬件层的抽象(虚拟化是物理资源层面的隔离) |
OS内核 | 多个容器可以在同一台计算机上运行,并与其他容器共享OS内核 | 也允许多个VM在单台计算机上运行,但需要单独的虚拟机OS |
OS数量 | 仅有一个物理机的OS,多个容器共享物理机的资源 | 多个OS(物理机一个OS,每个VM一个OS),均独享资源 |
运行数 | 一台物理机可以运行数百个容器 | 一台物理机最多可以运行十来个虚拟机 |
大小 | 容器镜像的大小通常为几十MB | 包含操作系统、二进制文件、库,至少也要几个GB |
启动速度 | 可以在数秒内完成启动 | 和物理机启动时间一样慢,可能要几分钟 |
资源利用率 | 可以处理更多的应用程序,消耗的资源比VM少 | |
隔离性 | 每个容器在用户空间中作为隔离的进程运行 |
6、Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- Docker不需要Hypervisor(虚拟机监视器)实现硬件资源虚拟化
- 运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源
7、虚拟化与容器
其实就是一台物理机上部署多个VM,每个VM上又有多个容器
容器和VM一起结合使用,在部署和管理应用程序时提供了很大的灵活性
四、Docker详细介绍
1、简介
- Docker是一个开源的应用容器引擎,基于Go语言
- 可以打包应用以及依赖包到一个轻量级、可移植的容器中
- Docker打包好了的容器,可以发布到任何流行的Linux机器上,也可以实现虚拟化
- 容器是完全使用沙箱机制,相互之间不会有任何接口(独立)
- Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器
- 容器性能开销极低
- Docker是实现容器技术的一种工具
- Docker容器还可以进行版本管理、复制、分享、修改,就像普通的代码一样
2、应用场景
- Web应用的自动化打包和发布
- 自动化测试和持续集成、发布(重点)
- 组件微服务架构,通过多个容器,一台机器可以跑多个服务,因此在本机可以模拟出微服务架构
3、Docker使用
将软件打包到容器中,以进行开发、运输和部署
- 容器是打包代码及其所有依赖项的软件的标准单元,所以该软件可以从一个计算机环境快速可靠地在另一个计算机环境进行运行
- Docker容器镜像是一个轻量级、独立的、可执行的软件包,它包含运行应用程序所需的一切: 运行环境、系统工具、系统库、配置
- 容器镜像在运行时成为容器
- 容器化软件都可用于基于Linux和Windows的应用程序,始终运行相同
- 容器将软件与其环境隔离开来,即使存在差异,但软件仍然可以运行
4、Docker镜像上运行Docker容器的优势
4.1 标准性
Docker创建了容器的行业标准,因此它们可以在任何地方移植
4.2 轻巧性
- 容器共享机器的操作系统内核,因此不需要每个容器都有完整的操作系统
- 容器本身没有自己的内核,也没有虚拟硬件
- 提高了服务器效率,并降低了服务器资源的消耗
4.3 隔离安全性
- 容器中的应用程序更安全,Docker提供业界最强大的默认隔离功能
- 每个容器都是相互隔离,内部有属于自己的文件系统,互不影响
4.4 Docker实现DevOps(开发、运维)
- 应用更快速的交付和部署,打包镜像发布测试,一键运行,不再需要写大量帮助文档,安装程序
- 更便捷的升级和扩缩容,部署应用就像搭积木一样方便
- 更简单的系统运维,开发和测试的环境高度一致
- 更高效的计算资源利用,内核级别的虚拟化,可以在一个物理机上运行很多个容器实例,服务器性能可以被压榨到极致
架构图箭头的意思大概是
- 1.在Docker Client 里用Docker命令调用Docker API 来操作 Host上的Docker服务
- 2.Docker服务可以从仓库拉镜像到本机,也可以用本机镜像创建一个容器运行
5、仓库(Registry)
- 集中存放镜像文件的场所
- 每个镜像文件有不同的标签(不同的版本)
- 最大的仓库是Docker Hub: https://hub.docker.com/ 存放了数量庞大的镜像供用户下载
- 国内的公开仓库包括阿里云、网易云等
- 仓库分为公开仓库和私有仓库两种形式
6、镜像(Images)
- 创建容器的模板
- 一个镜像可以创建很多容器
7、容器(Containers)
- 容器是镜像生成的运行实例
- Docker利用容器独立运行一个或者一组应用(服务)
- 每个容器之间是相互隔离的
- 它可以被启用、开始、停止、删除
8、主机(Host)
- 一个物理机或虚拟机
- 用于运行Docker守护进程和多个容器
- 可以存放多个镜像
- 也称宿主机,node节点
9、Docker守护程序(Daemon)
- 监听Docker API 请求
- 管理Docker对象,如: 镜像、容器、网络、卷
- 守护程序还可以与其他守护程序通信以管理Docker服务
10、Docker客户端(Client)
- 客户端使用Docker命令或其他工具调用Docker API
- 当然也可以在Host直接用Docker命令
- 客户端可以与多个Docker守护程序通信
五、安装Docker
OS安装环境要求
- 要安装 Docker Engine,需要 CentOS 7 的维护版本,不支持或未测试存档版本(一句话:需要正常迭代版本的 Centos 7 系统,其他系统都不行)
- 必须启用 centos-extras 存储库,该存储库默认情况下处于启用状态,但是如果已禁用它,则需要重新启用它
- 建议使用 overlay2 存储驱动程序
注意:
- CentOS 6 因内核太旧,即使支持安装 docker,但会有各种问题,不建议安装
- CentOS 7 的 extras 源虽然可以安装 docker,但包比较旧,建议从官方源或镜像源站点下载安装 docker
- CentOS 8 有新技术 podman 代替 docker
- 因此建议在 CentOS 7 上安装 docker
卸载旧版Docker
[root@localhost ~]# yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
已加载插件:fastestmirror, langpacks
参数 docker 没有匹配
参数 docker-client 没有匹配
参数 docker-client-latest 没有匹配
参数 docker-common 没有匹配
参数 docker-latest 没有匹配
参数 docker-latest-logrotate 没有匹配
参数 docker-logrotate 没有匹配
参数 docker-engine 没有匹配
不删除任何软件包
注意:
/var/lib/docker/ 下的内容(包括 images,containers,volumes,networks)被保留
Docker Engine 软件包现在称为 docker-ce
安装Docker
有两种方式,可供选择
- 从 Docker 的 repositories 安装,即 yum 的方式(推荐)
- 手动下载并安装 rpm 软件包,需要完全手动管理升级版本
1、通过 yum 的方式安装
配置 Docker Repository
在主机上首次安装 Docker Engine之前,需要设置 Docker Repository,之后可以从 Repository 安装和更新 Docker
- 1.安装必要的一些系统工具
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data.x86_64 lvm2
- 2.添加软件源信息,国内 Repository 更加稳定
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 3.更新
[root@localhost ~]# yum makecache fast
安装最新版本的 Docker Engine 和 Container
[root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io
从 https://mirrors.aliyun.com/docker-ce/linux/centos/gpg 检索密钥
导入 GPG key 0x621E9F35:
用户ID : "Docker Release (CE rpm) <docker@docker.com>"
指纹 : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
来自 : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
是否继续?[y/N]:y
注意:
- 如果提示接受GPG密钥,请验证指纹是否与 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35 匹配,如果是,可接受
- 安装成功后不代表 Docker 已成功,且 Docker 组虽已创建,但没有用户添加到该组
安装指定版本的 Docker Engine
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable
....
安装最新版本
[root@localhost ~]# yum install -y docker-ce
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirror.lzu.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.bupt.edu.cn
软件包 3:docker-ce-20.10.18-3.el7.x86_64 已安装并且是最新版本,无须任何处理
启动Docker
[root@localhost ~]# systemctl start docker
验证 Docker Engine 是否已正确安装
通过运行 hello-world 映像来验证
[root@localhost ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
建议使用 sudo 运行上面的命令,以便非特权用户运行 Docker 命令以及其他可选配置 步骤
2、yum安装方式二
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
sudo yum install docker-ce docker-ce-cli containerd.io
systemctl enable --now docker
更新Docker Engine
直接指定最新版本的方式去安装即可
3、下载 rpm 包的安装方式
下载地址
官方rpm包下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里镜像下载地址:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
安装rpm包
将下好的 rpm 包放到 Linux 任意目录下
yum install /root/package.rpm
yum install docker-ce-19.03.9-3.el7.ex86_64.rpm
启动Docker
systemctl start docker
更新Docker Engine
下载对应的 rpm 包
通过 yum -y upgrade package.rpm 去更新
4、国内镜像加速操作
- 默认情况下,Docker 下载镜像是从官网下载,下载速度特别特别的慢
- 使用国内加速器可以提升获取 Docker 官方镜像的速度
直接复制即可到 Linux 下回车即可
配置多个地址,避免某个站点不行时自动切换到后面的站点
# 1.创建一个目录
mkdir -p /etc/docker
# 2.编写配置文件
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://reg-mirror.qiniu.com"
]
}
EOF
# 3.重启服务
systemctl daemon-reload
systemctl restart docker
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://8iyselrq.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://8iyselrq.mirror.aliyuncs.com"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker