前端也可以学习的Docker

2023年 10月 9日 81.8k 0

前言

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

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

建议阅读顺序:

  • Docker 入门 - 基本概念
  • Docker 入门 - 尝试一下示例
  • Docker Engine、Docker CLI、Dockerfile
  • 再次理解示例,尝试打包一个项目镜像并运行
  • 了解容器编排
  • 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容器可以快速启动和停止,并且可以共享相同的文件系统内容,从而节省了磁盘空间

    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 .
    

    这条命令中,-ttag 的缩写,用于为镜像添加一个标签
    最后的 . 参数,用于指定 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 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

    网络连接

    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 : 将本地镜像推送到 Repository
    • docker 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 与 stdin
    • docker 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: 设置驱动,详见上一章节
    • 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

    可以使用 ENVARG 来设置环境变量,使用这两个指令设置的环境变量具有不同的 生存期
    image
    如图,使用 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 参数设置的环境变量具有最高优先级,会覆盖所有其他环境变量。
  • 在 Dockerfile 中使用 ENV 指令设置的环境变量会被写入镜像中,但是可以在运行容器时使用 -e 参数进行覆盖。
  • 在 Dockerfile 中使用 ARG 指令设置的环境变量只在构建镜像时有效,不会被写入镜像中,也不能在容器运行时使用 -e 参数进行覆盖。
  • 在容器启动命令中使用 --env-file 参数指定的环境变量文件中的变量会覆盖 Dockerfile 中设置的同名变量,但是会被 -e 参数设置的同名变量覆盖。
  • 在容器启动命令中使用 --env 参数指定的环境变量会被 -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 适合大规模容器部署和复杂应用场景下的容器编排。

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论