每个服务都需要选择合适的版本安装,且安装过程通常非常繁琐。
安装、启停的时候还要考虑依赖和是否有冲突(最常见的是端口、依赖项冲突)。
更新服务较为麻烦。
伴有许多数据文件和配置文件,且十分分散,维护、迁移非常麻烦;在不同设备上部署相同的服务时,操作费时费力。
需考虑端口是否要对外暴露,由此还要配置防火墙(虽然现在上云之后通常在云服务提供商解决这类问题)。
实际上,一个项目不止一台服务器需要配置。
在持续交付的时代,需要配置开发、测试、生产等环境,每个环境的服务、配置等有差别。
如果按传统方式部署,要处理环境、配置不一致等带来的问题,非常耗时耗力。再加上频繁的版本迭代,根本无法达成需求。
生产环境下需要使用若干个负载均衡器和多个运行相似服务的服务器进行分流。为应对服务器故障的情况,可能还要有备份、浮动 IP 等技术。
这需要在多台设备上部署相似的服务。
传统的部署方式在这种情况下耗时耗力,难以做到动态扩容缩容。
Log4j 在 2021-11-24 被发现的漏洞堪称爆炸性灾难。
其应用十分广泛,现代的 Java 应用几乎都在使用。
利用这个漏洞,攻击者几乎可以获得无限的权利——比如他们可以提取敏感数据、将文件上传到服务器、删除数据、安装勒索软件、或进一步散播到其它服务器。
node-ipc 包:该包此前被诸如 vue-cli(搭建 Vue 项目的常用工具)等应用使用。其在 2022-03-16 被发现:如果用户 IP 属地为俄罗斯或白俄罗斯,则尝试覆盖、删除所有文件。
实际操作中,需要尽量让每个服务能够被隔离开,且尽量无法影响彼此和宿主机。
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache 2.0 协议开源。
基于 Linux 容器技术。
主要目标:Build, Ship and Run an App Anywhere;一次镜像,处处运行。
常见的虚拟机: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),这里使用前者。
以下均不考虑基于虚拟机、WSL 的方式。
Docker 的技术基于 Linux,故对 Linux 的支持最好,不过只能运行 Linux 基础的容器。
不同架构的支持要看发行版;二进制包支持 x86_64、arm64、arm 架构,但镜像不一定支持,实际情况还要看运行的应用是否支持对应的架构。
Windows 只有特定版本支持,只能运行 Windows 基础的容器(不多,不过可以运行 .NET 基础的应用)。
macOS 上的 Docker Engine 无守护进程(dockerd),只能做测试,不能运行容器。
考虑到公司内网问题,这里只介绍下载二进制包进行安装的方法。
直接从软件仓库下载的话,版本可能过低,一般不推荐。
先查看系统架构和发行版信息:
# 查看系统架构
ding@ding-server:~$ arch
x86_64
# 查看发行版信息
ding@ding-server:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
访问 https://download.docker.com/linux/ ,选取合适的系统发行版和版本,浏览 pool/stable/
,选择合适的系统架构,下载对应的包(注意版本)。
Debian 系(Debian、Ubuntu……):
dpkg -i /path/to/package.deb
Red Hat 系(RHEL、CentOS……)
yum install /path/to/package.rpm
如果提示依赖未安装,先配置好内网的软件源,安装依赖项。
参见 Linux 软件安装基础。
创建 /etc/docker
目录(如无):
mkdir -p /etc/docker
新建 /etc/docker/daemon.json
文件(如无),编辑如下 :
{
"registry-mirrors": ["http://x.x.x.x:x/"],
"insecure-registries": ["x.x.x.x:x","x.x.x.x:x"]
}
多个源要分开写。
重新加载服务配置文件:
systemctl daemon-reload
设置为开机自启动:
systemctl enable docker.service
systemctl enable containerd.service
启动服务:
systemctl start docker.service
# 执行命令
root@ding-server:/home/ding# docker run hello-world
# 拉取镜像
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4
Status: Downloaded newer image for hello-world:latest
# 运行容器
Hello from Docker!
This message shows that your installation appears to be working correctly.
......(省略)......
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/
# 运行完成
root@ding-server:/home/ding#