前端也可以学习的Docker
前言
最近在写的项目中使用 Docker & Kubernetes & Nginx & Nacos & Koa 实现了前端应用的容器化、容器编排、反向代理、负载均衡集群、BFF 层开发,总结一下 docker 相关的知识,其它部分有时间再总结
本文从使用者角度介绍了 Docker Engine
、Docker CLI
、Dockerfile
相关内容并使用了官方文档中的示例进行技术演示。最后对 Docker Compose
, Kubernetes
等容器编排技术进行了简单的介绍
建议阅读顺序:
Docker 入门 - 基本概念 Docker 入门 - 尝试一下示例 Docker Engine、Docker CLI、Dockerfile 再次理解示例,尝试打包一个项目镜像并运行 了解容器编排
Docker 入门
基本概念
首先,介绍三个基本概念:
- image - 镜像
容器中的内容由镜像提供,镜像必须包含运行应用程序所需的依赖项
、配置
、脚本
、二进制文件
等。镜像还包含容器的其他配置,如环境变量
、要运行的默认命令
和其他元数据
- container - 容器
容器是在主机上运行的沙盒进程,它与在该主机上运行的所有其他进程隔离 - repository - 仓库
仓库是一个存储和分发 Docker 镜像的服务,类似于代码版本控制系统中的代码仓库。可以类比 npmjs, npmmirror 这类平台
用面向对象中类和实例的概念举个例子,image
可以类比为 class
,container
可以类比为 instance
,我们可以用一个 image
来 “实例化” 多个 container
。
repository
可以类比为 https://registry.npmmirror.com
这类的镜像仓库,你可以在 registry
中获取 image
并使用
层 Layer
Docker Layer 是指 Docker 镜像中的一个可读写的文件系统层。每个 Docker 镜像由多个Layer组成,每个Layer都包含了文件系统中的一部分内容
当Docker容器启动时,它会在 最上层
创建一个 可写
的Layer,所有的修改都会被保存在这个可写Layer中
。这种机制使得Docker容器可以快速启动和停止,并且可以共享相同的文件系统内容,从而节省了磁盘空间
FROM nginx
WORKDIR /app
COPY dist .
COPY nginx.conf /etc/nginx/conf.d/default.conf
RUN ["nginx", "-g", "daemon off;"]
以上的示例中,每一行都会创建一个新的 Layer
。但只有最后一条命令创建的 Layer
是 读写层
,其他层全部为 只读层
示例
可以根据官方文档中 Getting Started
章节的内容实践一下。本示例中的内容你可能不知道是什么,可以先实践一下并阅读后续章节,阅读后再回来看这个示例,会有新的理解
示例运行环境:Google Cloud - Debian 11
将项目容器化
拉取一个示例项目(一个使用 React 开发的 TodoList)
cd ~/username
git clone https://github.com/docker/getting-started-app.git
cd getting-started-app
创建一个 Dockerfile 文件
touch Dockerfile
编辑 Dockerfile,写入以下内容
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
文件中的内容有什么含义?我们来逐行解释一下
FROM node:18-alpine
继承 node:18-alpine 镜像的内容
WORKDIR /app
将工作目录设置为 /app
COPY . .
将所有文件从当前目录复制到工作目录,第一个参数.
代表当前上下文的目录,第二个参数.
代表工作目录
RUN yarn install --production
创建新的镜像层并安装依赖
CMD ["node", "src/index.js"]
用于指定容器启动时要运行的默认命令。它只能出现一次
EXPOSE 3000
暴露容器的 3000 接口
使用 Dockerfile 创建镜像
docker build -t getting-started .
这条命令中,-t
是 tag
的缩写,用于为镜像添加一个标签
最后的 .
参数,用于指定 Dockerfile 的路径,这里的路径是当前目录
使用镜像创建容器并运行
docker run -dp 4000:3000 getting-started
命令使用了 -d
-p 4000:3000
参数,-d
参数是 detach
的缩写,意味着将会在后台运行这个容器
-p 4000:3000
代表创建容器内部端口和宿主系统端口的映射,这里将容器的3000端口映射到宿主系统的4000端口
命令运行成功后,使用浏览器访问 服务器ip:4000
,将会成功打开一个 TodoList App
如何持久化某些数据
有时我们需要持久化项目中的某些文件,以便在容器重启或多个容器总共享这些数据
如果在容器中使用卷挂载一个目录,那么在主机上也可以看到该目录的更改。如果在容器重新启动时挂载相同的目录,将看到相同的文件
- 创建一个卷
docker volume create todo-db
- 创建容器时,将卷挂载到容器的某个目录中
docker run -dp 4000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
为什么是 /etc/todos?
本篇文章的示例项目中,会在 /etc/todos 中创建 SQLite 文件来持久化数据
Docker Engine
管理数据 & 数据持久化
默认情况下,容器中的应用修改数据时,数据变动会保存在容器的可写层(writable layer)
中。这样做的弊端:
- 容器不存在时,数据也会消失
- 很难在容器外部访问容器内的数据
- 数据与宿主机紧密耦合,不容易迁移
- 性能相对较低
可以使用 Docker 的数据持久化方案来解决这些问题
持久化的类型
docker 实现持久化数据的方法可以分为两类:
- 内存持久化
- tmpfs mounts
- 磁盘持久化
- bind mounts
- tmpfs mounts
这意味着你可以将数据保存在宿主机的 内存
或 文件系统
中
三种数据持久化方案存储位置对比:
Volumes
- 存储于宿主机文件系统,但
完全由 Docker 管理和维护
- 容易
备份
和迁移
- 在多容器间共享时更
安全
- 可以在
远程主机
上存储 - 挂载的
目标文件夹
中如果有文件会继承
到卷中
Bind Mounts
直接
将宿主机的某个目录挂载到容器中- Docker
无法管理
其内容 - 性能较高
- 挂载的
源文件夹
中如果有文件会屏蔽
Tmpfs Mounts
- 数据不会写入到
容器可写层
或宿主机磁盘
中 - 数据存储在
宿主机内存
中,容器停止,数据消失
- 不可以在容器间共享数据
- 仅在 Linux 宿主系统中可用
开启数据持久化
在运行 docker run
或 docker create
时,可以使用 --mount
、-v
、--tmpfs
运行参数来开启数据持久化功能
--mount
与-v
--tmpfs
相比,语法更为显式、暴露了更多的参数。-v
--tmpfs
可以看做内置了一些参数的--mount
--mount
语法:--mount key=value,key2=value2...
使用逗号分隔的键值对
支持的配置项:
- type: 挂载的类型(值为
volume
,bind
,tmpfs
) - src: 挂载源(适用于
volumes
、bind mounts
挂载方式)- volumes: 使用具名卷时 source 为卷的名字;使用匿名卷时,忽略该参数
- bind mounts: 挂载的路径
- target: 要挂载到容器中的路径
- readonly: 是否为只读挂载(适用于
volumes
、bind mounts
) - volume-opt: Volumes 挂载配置
- bind-propagation: Bind Mounts 挂载冒泡配置
- tmpfs-size: Tmpfs 挂载空间大小(单位字节、默认为无限大)
- tmpfs-mode: Tmpfs 挂载模式(八进制、默认为1777)
-v
语法:-v aaa:bbb,ro
aaa: 具名卷的名字 / 匿名卷时省略 / Bind Mounts 的源路径
bbb: 要挂载到容器中的路径
ro: 只读
--tmpfs
语法:--tmpfs
网络连接
Docker 的网络子系统使用不同的驱动程序进行扩展并向容器内提供网络,目前存在以下几种驱动类型:
- bridge: 默认网络驱动。适用于运行在同一Docker守护进程中的容器
- overlay: 适用于运行在多个Docker守护进程中的容器
- host: 取消容器和宿主系统间的网络隔离,直接使用宿主系统的网络
- none: 将容器网络与外部完全隔离
- ipvlan
- macvlan
本文不介绍 ipvlan、macvlan、overlay 网络
网络驱动类型
Bridge Network(默认)
Bridge Network
适用于运行在 同一Docker守护进程主机
上的容器。对于运行在 不同Docker守护进程主机
上的容器之间的通信,可以在操作系统级别
管理路由,也可以使用 Overlay Network
Docker 启动时,会创建一个名字为 bridge
的桥接网络作为 默认
网络,所有 未指定网络
的新容器都会连接到这个网络
默认桥接网络与手动创建的桥接网络
- 手动创建的桥接网络提供
容器间
的DNS 解析
- 默认桥接网络
只能通过 IP 地址
访问其他容器 - 手动创建的桥接网络可以
将容器名称作为URI
访问其他容器
- 默认桥接网络
- 手动创建的桥接网络提供了
更好的网络隔离环境
- 默认桥接网络会自动连接名为
bridge
的桥接网络,不相关的服务也可以互相访问
- 默认桥接网络会自动连接名为
- 手动创建的桥接网络可以在
容器运行期间
接入或断开- 从默认桥接网络中删除容器,需要停止容器并重新创建
内部端口映射
连接到同一个手动创建的网络的容器间可以互相访问,不同网络的容器或从外部访问需要使用 -p
或 --publish
来暴露端口
创建或运行容器时,容器不会向外部公开任何端口。使用 --publish
或 -p
使端口对 Docker以外
的服务可用
语法:
Flag 值 | 描述 |
---|---|
-p 8080:80 | 将容器中的TCP端口80映射到Docker主机上的8080端口 |
-p 192.168.1.100:8080:80 | 将容器中的TCP端口80映射到Docker主机上的8080端口,用于连接IP为192.168.1.100的主机 |
-p 8080:80/udp | 将容器中的UDP端口80映射到Docker主机上的8080端口 |
-p 8080:80/tcp -p 8080:80/udp | 将容器的TCP 80端口映射到Docker主机的TCP 8080端口,将容器的UDP 80端口映射到Docker主机的UDP 8080端口 |
Host Network
- 容器不会与主机隔离,暴露容器所有端口
- 容器不会获得自己的 IP 地址
- 端口映射
-p
无效 - 性能相对较高
- 仅支持 Linux 主机
None Network
- 完全隔离容器网络
- 容器内部只能访问环回设备
127.0.0.1
创建自定义网络
语法: docker network create --driver
Bridge Network
# 创建名为 test_net 的桥接网络
docker create network --driver bridge test_net
# 创建容器并运行 | 在后台运行 将内部的3000端口映射到外部 使用名为test_net的网络 容器名为cont_name 使用镜像getting-started
docker run -dp 3000:3000 --network test_net --name cont_name getting-started
Host Network
# 创建名为 test_net 的主机网络
docker create network --driver host test_net
# 创建容器并运行 | 在后台运行 使用名为test_net的网络 容器名为cont_name 使用镜像getting-started
# 由于 Host Network 不存在网络隔离,所以不需要端口映射
docker run -d --network test_net --name cont_name getting-started
None Network
# 创建容器并运行 | 在后台运行 使用名为none的网络 容器名为cont_name 使用镜像getting-started
# Docker 启动时会创建默认的 bridge host none 网络
docker run -d --network none --name cont_name getting-started
Docker CLI
Docker CLI是Docker的命令行工具,它提供了一组命令,可以用来管理Docker容器、镜像、网络和卷等
本章节只介绍一些常用的命令
镜像操作 docker image command
docker image build [OPTIONS] [PATH]
: 使用当前目录的 Dockerfile 构建镜像,可以使用-t
参数向镜像添加标记- 可以简写为
docker build
- 一些常用 Flag:
-t
: 为镜像添加标签
- PATH: Dockerfile 所在目录的路径
- 可以简写为
docker image rm
: 移除镜像docker image prune
: 移除最近未使用的镜像docker image ls
: 列出本地所有镜像docker image pull
: 从 Repository 中拉取镜像docker image push
: 将本地镜像推送到 Repositorydocker search
: 在 Repository 中搜索镜像
容器操作 docker container command
docker container create
从镜像创建 Docker 容器- 可以简写为
docker create
- 一些常用 Flag:
-p
: 创建端口映射--mount
-v
--tmpfs
: 挂载存储设备--network
: 设置容器网络--name
: 设置容器名称--tag
: 设置容器标签
- 可以简写为
docker container run
: 从镜像创建 Docker 容器并运行- 等价于
docker create
+docker start
- 一些常用 Flag:
-d
: detach 在后台运行容器
- 等价于
docker container rm
: 删除容器docker container start
: 启动容器docker container stop
: 使用SIGTERM
停止容器docker container ls
: 列举出所有运行中的容器- 等价于
docker ps
- 一些常用 Flag:
-a
: 列举出所有容器,包括未运行的容器
- 等价于
docker container attach
: 连接容器的 stdout 与 stdindocker container kill
: 使用SIGKILL
强制停止容器
卷操作 docker volume command
docker volume create
: 创建卷docker volume rm
: 移除卷docker volume ls
: 列举所有卷
网络操作 docker network command
docker network create [OPTIONS] NAME
: 创建网络- 一些常用的 Flag:
--driver string
: 设置驱动,详见上一章节
- 一些常用的 Flag:
docker network rm
: 移除网络docker network ls
: 列举所有网络docker network connect NETWORK CONTAINER
: 将容器连接到网络docker network disconnect NETWORK CONTAINER
: 将容器从网络断开
查看日志 docker logs [OPTIONS] container
docker logs
命令用于查看 Docker容器的日志输出。它可以显示容器的标准输出和标准错误输出,以及任何其他日志消息。默认情况下,日志输出显示最近的日志,但可以使用参数来指定要查看的日志数量或时间范围
使用docker logs命令可以查看Docker容器的日志输出。命令的基本语法如下所示:
docker logs [OPTIONS] CONTAINER
其中,OPTIONS
是可选参数,CONTAINER
是要查看日志的容器名称或ID。
下面是一些常用的选项:
--follow
或-f
:持续输出日志,类似于tail -f
命令。--tail
:指定要输出的日志行数,默认为所有日志。--since
和--until
:指定要输出的日志的时间范围。--timestamps
或-t
:显示每个日志条目的时间戳。
以下是一些示例:
# 查看名为 my-container 的容器的所有日志
docker logs my-container
# 持续输出名为 my-container 的容器的日志
docker logs -f my-container
# 查看名为 my-container 的容器最后 10 行日志
docker logs --tail 10 my-container
# 查看名为 my-container 的容器从 2023-10-08 00:00:00 开始的所有日志
docker logs --since "2023-10-08 00:00:00" my-container
# 查看名为 my-container 的容器从 2023-10-08 00:00:00 到 2023-10-09 00:00:00 的所有日志
docker logs --since "2023-10-08 00:00:00" --until "2023-10-09 00:00:00" my-container
# 查看名为 my-container 的容器的所有日志,并显示时间戳
docker logs -t my-container
总结
Docker 的命令具有一定的结构,记住每一部分的类型可以更快地联想出大部分命令
不考虑简洁写法,Docker 的命令具有以下语法:docker 模块 命令 [选项] 操作对象
模块部分,本文涉及到了:
- image
- container
- volume
- network
命令部分,大多数模块都有一些具有相同含义的命令,比如:
- create 创建
- rm 删除
- prune 删除最近未使用的
- ls 列举实例
- ls -a 列举出所有实例
选项部分是可选的,他们的语法有:
- 单横线后的内容,每一个字母代表一个指令。如
-dp
代表-d
与-p
的结合 - 双横线代表完整单词,双横线后的整个单词代表指令名称。如
--detach
--publish
操作对象部分,每一条命令操作的对象是不同的,如果不知道,可以使用 docker xxx command help
查看使用方法
Dockerfile
语法
# 备注
指令(大写) 参数
基础镜像 FROM
FROM
指令会初始化一个 新的构建阶段
,并为后续指令 设置基本映像
,一个有效的 Dockerfile 必须以FROM指令开始
- FROM 指令前方只能有 ARG 指令
- 一个 Dockerfile 中可以有多个 FROM,每个 FROM 指令开启一个新的构建
- 可以使用
AS
为本次构建添加别名,方便在后续构建中使用本次构建 - 如果未指定标签和版本,默认使用
latest
环境变量 ENV & ARG
可以使用 ENV
和 ARG
来设置环境变量,使用这两个指令设置的环境变量具有不同的 生存期
如图,使用 ARG
设置的环境变量从定义它的那一行开始生效,直到镜像被构建完成时可用。而使用 ENV
设置的环境变量在 构建期
与 生产环境
中都可以访问
在 Dockerfile 中定义和使用环境变量:
ARG [=]
ENV
ENV =
构建镜像时传入 ARG:
docker build --build-arg xxxkey=xxxvalue .
运行容器时传入 ENV:
# 直接传入 xxxkey 的值
docker run -e "xxxkey=xxxvalue" image_name
# 从系统环境变量中读取 xxxkey 的值
docker run -e xxxkey image_name
使用 env file 传入 ENV:
docker run --env_file ./env_file image_name
# .env_file
xxxkey=xxxvalue
使用环境变量或构建参数:
FROM alpine
ENV FOO=abcdefg
ENV FOOO = 12345
RUN echo ${FOO} # abcdefg
RUN echo $FOO # abcdefg
RUN echo ${BAR} #
RUN echo ${BAR:-FOOO} # 12345
RUN echo ${FOO:+FOOO} # 12345
从上方的示例中可以发现,可以使用 ${var_name}
或 $var_name
来读取环境变量
环境变量 var_name
不存在时,使用 ${var_name:-alt_var}
可以取到 alt_var
的值
环境变量 var_name
存在时,使用 ${var_name:+alt_var}
可以取到 alt_var
的值
优先级覆盖
-e
参数设置的环境变量具有最高优先级,会覆盖所有其他环境变量。设置工作目录 WORKDIR
WORKDIR
指令可以设置 RUN
, CMD
, ENTRYPOINT
, COPY
, ADD
指令的运行目录
FROM alpine
WORKDIR /app
RUN pwd
WORKDIR dist
RUN xxx
上面的示例中,第三行的 RUN 将打印 /app
,第五行的 RUN 将执行 /app/dist
目录中的 xxx
- 多次使用 WORKDIR 时,后面的指令如果使用了相对路径。会以指令执行前的路径作为参照计算路径。
- 默认情况下,如果没有显式指定 WORKDIR,默认值为
/
添加文件 ADD & COPY
构建镜像时,可以使用 ADD
, COPY
指令将主机文件系统中的文件复制到镜像的文件系统中。此外,ADD
指令还支持下载远程文件、解压缩文件,而 COPY
指令仅支持复制本地文件。一般情况下,使用 COPY
进行简单的文件复制操作
COPY 和 ADD 指令使用 WORKDIR 作为运行目录
ADD [OPTIONS]
COPY [OPTIONS]
其中,source 为上一次已经构建好的镜像的路径。如果不存在上一次构建,source 以本地 Dockerfile 的路径为基础计算相对路径
FROM nginx
COPY dist/ . # 将 dist 目录中的内容复制到 WORKDIR
ADD dist/ . # 同上
COPY nginx.conf /etc/nginx/nginx.conf # 将当前目录的 nginx.conf 复制到镜像内的 /etc/xxxxx
COPY /home/xxx / # 绝对路径,将 /home/xxx 复制到镜像内的根目录
ADD https://github.com/moby/buildkit.git#v0.10.1 /buildkit # clone git 仓库到 /buildkit
COPY --link
--link
会将你复制的文件放在一个空目录中,并将此目录转换为一个独立的层,并链接到上一阶段的构建中
FROM alpine
COPY --link /foo /bar
# 以上内容等价于以下内容
FROM alpine
FROM scratch
COPY /foo /bar
这样做的意义:COPY --link 将文件复制到一个独立的层中,并与之前的层合并。当之前的层发生变化需要重新构建时,无需重新复制文件构建
运行命令 RUN & SHELL & CMD & ENTRYPOINT
Dockerfile 中的 RUN、CMD 和 ENTRYPOINT 是三个常用的指令,它们的作用分别如下:
RUN 指令用于在 Docker 镜像构建过程中执行命令,并在当前镜像的新一层中生成一个新的镜像。例如,可以使用 RUN 指令安装软件包、更新系统、下载文件等。
每个 RUN 指令都会在新的镜像层中生成一个新的镜像
CMD 指令用于定义容器启动时默认运行的命令。当使用
docker run
命令启动容器时,如果没有指定要运行的命令,则会自动执行 CMD 指令中定义的命令。CMD 指令可以被docker run
命令行参数覆盖ENTRYPOINT 指令也用于定义容器启动时默认运行的命令,但它与 CMD 指令不同的是,ENTRYPOINT 指令定义的命令不会被
docker run
命令行参数覆盖- 如
docker run image_name -d -a -b
将会把镜像名后的所有参数-d -a -b
作为参数传递给 ENTRYPOINT
- 如
SHELL
SHELL 命令用于指定在 Dockerfile 中执行命令时所使用的 Shell 程序
默认情况下,Docker 在 Linux 系统上使用 /bin/sh
作为默认的 Shell 程序,在 Windows 系统上使用 cmd.exe
某些情况下,可能需要使用不同的 Shell 程序来执行命令,例如需要使用 Bash 脚本语法等。此时,可以使用 SHELL 指令来指定所需的 Shell 程序。例如,可以使用以下指令来指定使用 Bash 程序:
SHELL ["/bin/bash", "-c"]
CMD or ENTRYPOINT ?
如果容器的主要功能是运行一个应用程序或服务,并且这个应用程序或服务是容器的主要进程,那么应该使用 ENTRYPOINT 指令来定义容器的主程序或服务
如果容器的主要功能是提供一些支持性质的命令行工具或脚本,并且这些工具或脚本不是容器的主要进程,那么应该使用 CMD 指令来定义这些工具或脚本
如果需要在容器启动时动态指定参数或选项,那么应该使用 CMD 指令。CMD 指令可以被
docker run
命令行参数覆盖,从而可以在启动容器时动态传递参数或选项
ENTRYPOINT 和 CMD 指令可以同时存在于同一个 Dockerfile 中。在这种情况下,CMD 指令会作为 ENTRYPOINT 指令的默认参数传递进去
CMD 在一次构建中只能出现一次
Dockerfile 中的 CMD 指令只能出现一次。如果在 Dockerfile 中定义了多个 CMD 指令,则只有最后一个 CMD 指令会生效
这是因为在 Dockerfile 中,每个指令都会创建一个新的镜像层,而 CMD 指令定义了容器启动时要执行的命令,因此只需要在镜像中定义一次即可。
如果需要在容器启动时执行多个命令,则可以使用 shell 脚本或者使用 ENTRYPOINT 指令来实现。
单行执行多条命令
由于 Dockerfile 中的每条执行都会生成一个新的 Layer,为了避免生成过多的层,可以在一行中执行多条命令
FROM centos
RUN yum -y install wget
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
&& tar -xvf redis.tar.gz
暴露容器端口 EXPOSE
EXPOSE
指令用于声明容器运行时所监听的容器内部网络端口。它不会将容器内暴露的端口映射到主机上,你需要使用 -p
--publish
来发布端口,或使用 host network
- 未指定网络协议时,默认为 tcp
EXPOSE 8080
EXPOSE 8001/tcp
EXPOSE 8002/udp
docker run -dp 3000:8080 xxx # 运行容器并将容器内部的 8080 端口映射到主机 3000 端口
镜像标签 LABEL
可以使用 LABEL
指令向镜像添加标签,使用 docker image inspect image_name
来查看镜像的标签
LABEL key1=value1 key2=value2
容器编排
容器编排是指自动化地部署、管理和扩展容器化应用程序的过程。在容器编排中,多个容器可以组合成一个应用程序,并通过编排工具进行管理和部署
容器编排工具可以自动化地完成容器的部署、扩展、负载均衡、服务发现等任务,从而使得容器化应用程序更加易于管理和维护
我的项目中,容器编排由
SRE人员
进行配置和维护,前端开发人员只需要将项目打包为正确的镜像
Docker Swarm
Docker Swarm 是 Docker 官方提供的 容器编排工具
,它可以将多个 Docker 主机组合成一个虚拟的 Docker 主机集群
,从而实现容器的 高可用性
和 负载均衡
好像凉了
Docker Compose
Docker Compose 是一个用于 定义和运行
多个 Docker 容器的工具,它可以通过一个 YAML 文件
来定义容器之间
的 依赖关系
和 运行参数
,从而方便地 管理和部署
多个容器化应用程序
Kubernetes
Kubernetes(k8s)是一个开源的容器编排平台,它可以 自动化地部署
、扩展
和 管理
容器化应用程序。k8s 提供了丰富的功能和组件,比如 自动负载均衡
、自动扩展
、服务发现
等,可以帮助用户更加高效地管理容器化应用程序
适用场景
Docker Swarm 适用于 小规模
的容器部署,它可以快速地将多个 Docker 主机组合成一个虚拟的 Docker 主机集群
,从而实现容器的 高可用性
和 负载均衡
Docker Compose 适用于 本地开发
和 测试环境
下的容器编排,它可以通过一个 YAML 文件来定义容器之间的依赖关系和运行参数,从而方便地管理和部署多个容器化应用程序。Docker Compose 的优点是易于使用和部署,适合开发人员在 本地环境
中进行容器编排
Kubernetes 适用于 大规模
的容器部署,它可以 自动化地部署
、扩展
和 管理
容器化应用程序。k8s 的优点是高度可定制和可扩展,适合 大型团队
和 复杂应用场景
下使用。
总的来说,Docker Swarm 适合小规模容器部署,Docker Compose 适合本地开发和测试环境下的容器编排,而 k8s 适合大规模容器部署和复杂应用场景下的容器编排。