前端也可以学习的Docker

前言

最近在写的项目中使用 Docker & Kubernetes & Nginx & Nacos & Koa 实现了前端应用的容器化、容器编排、反向代理、负载均衡集群、BFF 层开发,总结一下 docker 相关的知识,其它部分有时间再总结

本文从使用者角度介绍了 Docker EngineDocker CLIDockerfile 相关内容并使用了官方文档中的示例进行技术演示。最后对 Docker Compose, Kubernetes 等容器编排技术进行了简单的介绍

建议阅读顺序:

  1. Docker 入门 - 基本概念
  2. Docker 入门 - 尝试一下示例
  3. Docker Engine、Docker CLI、Dockerfile
  4. 再次理解示例,尝试打包一个项目镜像并运行
  5. 了解容器编排

Docker 入门

基本概念

首先,介绍三个基本概念:

  • image - 镜像 容器中的内容由镜像提供,镜像必须包含运行应用程序所需的 依赖项配置脚本二进制文件 等。镜像还包含容器的其他配置,如 环境变量、要运行的 默认命令其他元数据
  • container - 容器 容器是在主机上运行的沙盒进程,它与在该主机上运行的所有其他进程隔离
  • repository - 仓库 仓库是一个存储和分发 Docker 镜像的服务,类似于代码版本控制系统中的代码仓库。可以类比 npmjs, npmmirror 这类平台

用面向对象中类和实例的概念举个例子,image 可以类比为 classcontainer 可以类比为 instance,我们可以用一个 image 来 "实例化" 多个 container

repository 可以类比为 https://registry.npmmirror.com 这类的镜像仓库,你可以在 registry 中获取 image 并使用

层 Layer

Docker Layer 是指 Docker 镜像中的一个可读写的文件系统层。每个 Docker 镜像由多个Layer组成,每个Layer都包含了文件系统中的一部分内容

当Docker容器启动时,它会在 最上层 创建一个 可写 的Layer,所有的修改都会被保存在这个可写Layer中。这种机制使得Docker容器可以快速启动和停止,并且可以共享相同的文件系统内容,从而节省了磁盘空间

sql 复制代码
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

将项目容器化

  1. 拉取一个示例项目(一个使用 React 开发的 TodoList)

    shell 复制代码
    cd ~/username
    git clone https://github.com/docker/getting-started-app.git
    cd getting-started-app
  2. 创建一个 Dockerfile 文件

    shell 复制代码
    touch Dockerfile
  3. 编辑 Dockerfile,写入以下内容

    shell 复制代码
    # 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 接口

  4. 使用 Dockerfile 创建镜像

    shell 复制代码
    docker build -t getting-started .

    这条命令中,-ttag 的缩写,用于为镜像添加一个标签 最后的 . 参数,用于指定 Dockerfile 的路径,这里的路径是当前目录

  5. 使用镜像创建容器并运行

    shell 复制代码
    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 rundocker create 时,可以使用 --mount-v--tmpfs 运行参数来开启数据持久化功能

--mount-v --tmpfs 相比,语法更为显式、暴露了更多的参数。-v --tmpfs 可以看做内置了一些参数的 --mount

--mount

语法:--mount key=value,key2=value2... 使用逗号分隔的键值对

支持的配置项:

  • type: 挂载的类型(值为 volume, bind, tmpfs
  • src: 挂载源(适用于 volumesbind mounts 挂载方式)
    • volumes: 使用具名卷时 source 为卷的名字;使用匿名卷时,忽略该参数
    • bind mounts: 挂载的路径
  • target: 要挂载到容器中的路径
  • readonly: 是否为只读挂载(适用于 volumesbind 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 <target>

网络连接

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 <driver_type> <network_name>

Bridge Network

shell 复制代码
# 创建名为 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

shell 复制代码
# 创建名为 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

shell 复制代码
# 创建容器并运行 | 在后台运行 使用名为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 <NAME:TAG>: 从 Repository 中拉取镜像
  • docker image push <NAME:TAG>: 将本地镜像推送到 Repository
  • docker search <NAME>: 在 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 <NAME:TAG>: 启动容器
  • docker container stop: 使用 SIGTERM 停止容器
  • docker container ls: 列举出所有运行中的容器
    • 等价于 docker ps
    • 一些常用 Flag:
      • -a: 列举出所有容器,包括未运行的容器
  • docker container attach <NAME:TAG>: 连接容器的 stdout 与 stdin
  • docker container kill: 使用 SIGKILL 强制停止容器

卷操作 docker volume command

  • docker volume create <NAME>: 创建卷
  • docker volume rm <NAME>: 移除卷
  • docker volume ls: 列举所有卷

网络操作 docker network command

  • docker network create [OPTIONS] NAME: 创建网络
    • 一些常用的 Flag:
      • --driver string: 设置驱动,详见上一章节
  • docker network rm <NAME>: 移除网络
  • docker network ls: 列举所有网络
  • docker network connect NETWORK CONTAINER: 将容器连接到网络
  • docker network disconnect NETWORK CONTAINER: 将容器从网络断开

查看日志 docker logs [OPTIONS] container

docker logs 命令用于查看 Docker容器的日志输出。它可以显示容器的标准输出和标准错误输出,以及任何其他日志消息。默认情况下,日志输出显示最近的日志,但可以使用参数来指定要查看的日志数量或时间范围

使用docker logs命令可以查看Docker容器的日志输出。命令的基本语法如下所示:

css 复制代码
docker logs [OPTIONS] CONTAINER

其中,OPTIONS是可选参数,CONTAINER是要查看日志的容器名称或ID。

下面是一些常用的选项:

  • --follow-f:持续输出日志,类似于tail -f命令。
  • --tail:指定要输出的日志行数,默认为所有日志。
  • --since--until:指定要输出的日志的时间范围。
  • --timestamps-t:显示每个日志条目的时间戳。

以下是一些示例:

perl 复制代码
# 查看名为 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

语法

bash 复制代码
# 备注
指令(大写) 参数 

基础镜像 FROM

FROM 指令会初始化一个 新的构建阶段,并为后续指令 设置基本映像,一个有效的 Dockerfile 必须以FROM指令开始

  • FROM 指令前方只能有 ARG 指令
  • 一个 Dockerfile 中可以有多个 FROM,每个 FROM 指令开启一个新的构建
  • 可以使用 AS 为本次构建添加别名,方便在后续构建中使用本次构建
  • 如果未指定标签和版本,默认使用 latest

环境变量 ENV & ARG

可以使用 ENVARG 来设置环境变量,使用这两个指令设置的环境变量具有不同的 生存期 如图,使用 ARG 设置的环境变量从定义它的那一行开始生效,直到镜像被构建完成时可用。而使用 ENV 设置的环境变量在 构建期生产环境 中都可以访问

在 Dockerfile 中定义和使用环境变量:

xml 复制代码
ARG <name>[=<default value>]
ENV <key> <value>
ENV <key>=<value>

构建镜像时传入 ARG:

shell 复制代码
docker build --build-arg xxxkey=xxxvalue .

运行容器时传入 ENV:

shell 复制代码
# 直接传入 xxxkey 的值
docker run -e "xxxkey=xxxvalue" image_name
# 从系统环境变量中读取 xxxkey 的值
docker run -e xxxkey image_name

使用 env file 传入 ENV:

shell 复制代码
docker run --env_file ./env_file image_name
ini 复制代码
# .env_file
xxxkey=xxxvalue

使用环境变量或构建参数:

shell 复制代码
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 的值

优先级覆盖

  1. 在容器运行时使用 -e 参数设置的环境变量具有最高优先级,会覆盖所有其他环境变量。
  2. 在 Dockerfile 中使用 ENV 指令设置的环境变量会被写入镜像中,但是可以在运行容器时使用 -e 参数进行覆盖。
  3. 在 Dockerfile 中使用 ARG 指令设置的环境变量只在构建镜像时有效,不会被写入镜像中,也不能在容器运行时使用 -e 参数进行覆盖。
  4. 在容器启动命令中使用 --env-file 参数指定的环境变量文件中的变量会覆盖 Dockerfile 中设置的同名变量,但是会被 -e 参数设置的同名变量覆盖。
  5. 在容器启动命令中使用 --env 参数指定的环境变量会被 -e 参数设置的同名变量覆盖。

设置工作目录 WORKDIR

WORKDIR 指令可以设置 RUN, CMD, ENTRYPOINT, COPY , ADD 指令的运行目录

bash 复制代码
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 作为运行目录

xml 复制代码
ADD <source> <destination> [OPTIONS]
COPY <source> <destination> [OPTIONS]

其中,source 为上一次已经构建好的镜像的路径。如果不存在上一次构建,source 以本地 Dockerfile 的路径为基础计算相对路径

shell 复制代码
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

--link 会将你复制的文件放在一个空目录中,并将此目录转换为一个独立的层,并链接到上一阶段的构建中

bash 复制代码
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 程序:

css 复制代码
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,为了避免生成过多的层,可以在一行中执行多条命令

sql 复制代码
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
yaml 复制代码
EXPOSE 8080
EXPOSE 8001/tcp
EXPOSE 8002/udp
shell 复制代码
docker run -dp 3000:8080 xxx # 运行容器并将容器内部的 8080 端口映射到主机 3000 端口

镜像标签 LABEL

可以使用 LABEL 指令向镜像添加标签,使用 docker image inspect image_name 来查看镜像的标签

ini 复制代码
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 适合大规模容器部署和复杂应用场景下的容器编排。

相关推荐
用你的胜利博我一笑吧6 分钟前
supermap iclient3d for cesium中entity使用
前端·javascript·vue.js·3d·cesium·supermap
初心魏26 分钟前
Uniapp 跨域
前端·数据库·uni-app
学会沉淀。39 分钟前
Vue3快速入门+axios的异步请求(基础使用)
前端·javascript·vue.js
机器人迈克猫1 小时前
Django_Vue3_ElementUI_Release_003_前端Vue3项目初始化
前端·elementui·django
小于负无穷1 小时前
Webpack:现代前端项目的强大打包工具
前端·javascript·webpack·typescript·node.js
Sam90291 小时前
【Webpack--011】配置开发和生产模式的webpack.config.js
前端·javascript·webpack
喵喵酱仔__1 小时前
css设置overflow:hiden行内元素会发生偏移的现象
前端·javascript·css
sujiao6661 小时前
Webpack
前端·webpack·node.js
茶卡盐佑星_1 小时前
vue中webpack的主要功能
前端·vue.js·webpack
今天不加班*1 小时前
生动好看的css卡片样式
前端·javascript·css