Docker 简介与安装
约 1603 个字 46 行代码 7 张图片 预计阅读时间 6 分钟
为什么用 Docker
一台服务器上的配置
每个服务都需要选择合适的版本安装,且安装过程通常非常繁琐。
安装、启停的时候还要考虑依赖和是否有冲突(最常见的是端口、依赖项冲突)。
更新服务较为麻烦。
伴有许多数据文件和配置文件,且十分分散,维护、迁移非常麻烦;在不同设备上部署相同的服务时,操作费时费力。
需考虑端口是否要对外暴露,由此还要配置防火墙(虽然现在上云之后通常在云服务提供商解决这类问题)。
持续交付时代下的项目
实际上,一个项目不止一台服务器需要配置。
在持续交付的时代,需要配置开发、测试、生产等环境,每个环境的服务、配置等有差别。
如果按传统方式部署,要处理环境、配置不一致等带来的问题,非常耗时耗力。再加上频繁的版本迭代,根本无法达成需求。
高并发、多节点、需故障处理的项目
生产环境下需要使用若干个负载均衡器和多个运行相似服务的服务器进行分流。为应对服务器故障的情况,可能还要有备份、浮动 IP 等技术。
这需要在多台设备上部署相似的服务。
传统的部署方式在这种情况下耗时耗力,难以做到动态扩容缩容。
安全问题
基础设施漏洞
Log4j 在 2021-11-24 被发现的漏洞堪称爆炸性灾难。
其应用十分广泛,现代的 Java 应用几乎都在使用。
利用这个漏洞,攻击者几乎可以获得无限的权利——比如他们可以提取敏感数据、将文件上传到服务器、删除数据、安装勒索软件、或进一步散播到其它服务器。
供应链投毒
node-ipc 包:该包此前被诸如 vue-cli(搭建 Vue 项目的常用工具)等应用使用。其在 2022-03-16 被发现:如果用户 IP 属地为俄罗斯或白俄罗斯,则尝试覆盖、删除所有文件。
应对前述的安全问题
实际操作中,需要尽量让每个服务能够被隔离开,且尽量无法影响彼此和宿主机。
Docker 做到了什么
- 确保运行环境、配置的一致性
- 简化了环境的部署和迁移工作,方便做持续集成,并有助于整体发布
- 可以做到自动化部署,实现高并发环境下的自动扩容缩容
- 便于测试;出现异常,可以通过一致的测试环境快速定位和修复
- 隔离了各项服务及其与宿主机之间的联系,提升整体安全性
Docker 简介
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache 2.0 协议开源。
基于 Linux 容器技术。
主要目标:Build, Ship and Run an App Anywhere;一次镜像,处处运行。
Docker 的三个要素
- 仓库(registry)
- 镜像(image)
- 容器(container)
与虚拟机的区别
常见的虚拟机:VMWare、VirtualBox、KVM、Hyper-V、QEMU。
虚拟机里面运行的是一整套系统,需模拟硬件,资源开销较大,启动较慢;虚拟机有资源配额,一个虚拟机不能充分利用宿主机的资源。
Docker 容器里面运行的不是一整套系统,不需模拟硬件,资源开销较小,启动较快;容器既可以充分利用宿主机的资源,也可以像虚拟机一样搞资源配额。
Docker 容器所需资源仍大于直接部署。
虚拟机可以运行不同系统,一些可以做异构;Docker 不行。
版本区别
Docker 有桌面版(Docker Desktop),基于虚拟机和 WSL 2(Windows),为商业软件,大企业商用需付费,一般不会使用,而是用 Docker Engine(以下提到 Docker,默认均指 Docker Engine)。
Docker Engine 分社区版(CE, Community Edition)和企业版(EE, Enterprise Edition),这里使用前者。
Docker 在不同系统和架构上的适配性
Info
以下均不考虑基于虚拟机、WSL 的方式。
Docker 的技术基于 Linux,故对 Linux 的支持最好,不过只能运行 Linux 基础的容器。
不同架构的支持要看发行版;二进制包支持 x86_64、arm64、arm 架构,但镜像不一定支持,实际情况还要看运行的应用是否支持对应的架构。
Windows 只有特定版本支持,只能运行 Windows 基础的容器(不多,不过可以运行 .NET 基础的应用)。
macOS 上的 Docker Engine 无守护进程(dockerd),只能做测试,不能运行容器。
内网环境下的 Docker 安装
考虑到公司内网问题,这里只介绍下载二进制包进行安装的方法。
直接从软件仓库下载的话,版本可能过低,一般不推荐。
下载软件包
先查看系统架构和发行版信息:
访问 https://download.docker.com/linux/ ,选取合适的系统发行版和版本,浏览 pool/stable/
,选择合适的系统架构,下载对应的包(注意版本)。
安装软件包(root 权限)
Debian 系(Debian、Ubuntu……):
Red Hat 系(RHEL、CentOS……)
如果提示依赖未安装,先配置好内网的软件源,安装依赖项。
Info
参见 Linux 软件安装基础。
配置镜像源(root 权限)
创建 /etc/docker
目录(如无):
新建 /etc/docker/daemon.json
文件(如无),编辑如下 :
Info
多个源要分开写。
重新加载服务配置文件:
开启服务(root 权限)
设置为开机自启动:
启动服务:
验证安装
其他可用的实验环境
参考资料
- 尚硅谷2022版Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili
- 全面回答什么是持续集成和持续交付
- What is Load Balancing? | DigitalOcean
- log4j2远程漏洞事件_程序员杨叔的博客-CSDN博客_log4j事件
- Log4j安全漏洞事件引发安全行业的几点思考-51CTO.COM
- 如何看待 node-ipc 包以反战为名进行供应链投毒? - 知乎
- CVE-2022-23812 | RIAEvangelist/node-ipc is malware / protest-ware
- Docker Documentation | Docker Documentation
- Docker 教程 | 菜鸟教程
- What is a Container? - Docker
- .Net大户的选择:Windows Container在携程的应用 - SegmentFault 思否