15-容器镜像构建和编排

Charlie

1. 由Dockerfile构建镜像

1.1. 过程

Image:静态的压缩包
Container:运行的容器,轻量级的虚拟机

image.png

1.2. 👍文件指令

  • FROM:指定基础镜像,必须为第一个命令
  • RUN:构建镜像时执行的命令
  • ADD:将本地文件添加到容器中,tar类型文件会自动解压
  • COPY:功能类似ADD,但是不会自动解压文件
  • CMD构建容器后调用,也就是在容器启动时才进行调用
    • 可以被docker run参数覆盖
  • ENTRYPOINT:配置容器,使其可执行化
    • 配合CMD可省去“application”,只使用参数,用于docker run时根据不同参数执行不同功能
    • 很可能是shell脚本
  • LABEL:用于为镜像添加元数据
    • key-value
  • ENV:设置环境变量
  • EXPOSE:指定与外界交互的端口,容器内的端口号,docker run时加-P则会映射一个随机号(宿主机)
  • VOLUME:用于指定持久化目录,docker run时如果没有指定挂载目录,会创建一个volume
  • WORKDIR:工作目录,类似于cd命令
  • USER:指定运行容器时的用户名或 UID
    • 默认root
  • ARG:用于指定传递给构建运行时的变量
  • ONBUILD:用于设置镜像触发器
    • 可以被其他人进一步构建,会触发一些行为

2. Docker build

2.1. 构建命令

  • docker build [OPTIONS] PATH | URL | -

  • 生成镜像:docker build -t <image>:<tag> .

    • 最后一个参数context: .

2.2. 👍最佳实践

  • 如何编写dockerfile: 如何编写最佳的Dockerfile - 知乎

    1. .dockerignore文件
    2. 容器只运行单个应用
      • 解耦,未来可以单独对一个应用进行升级/重启/…
    3. 将多个RUN指令合并为一个
      • 原因:减少镜像分层
    4. 基础镜像的标签不要用latest
      • 建议使用固定的版本,使得镜像可预知
    5. 每个RUN指令的最后删除多余文件
      • 原因:否则,虽然在下一个RUN删掉,上一层的文件还在(写时复制,上一层不可修改)
    6. 选择合适的基础镜像(alpine版本最好)
      • 轻量级
    7. 设置WORKDIR和 CMD
    8. 合理安排COPY和RUN的顺序
      • 把不容易改变的放在前面,充分利用缓存
  • Docker健康检查HEALTHCHECK的使用方法:Docker健康检查HEALTHCHECK的使用方法 - 知乎

2.3. 镜像分层

Dockerfile里每一条命令都会生成一个新的层,重复构建时有cache, 只从修改的层开始重新构建.

  • 写时复制 COW

  • docker history 查看镜像的层

  • 将所有的RUN指令合并为一个

    • Dockerfile中的每个指令都会创建一个新的镜像层
    • 镜像层将被缓存和复用
    • 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
    • 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
    • 镜像层是不可变的,如果我们在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件(只是这个文件在Docker容器中不可见了)

2.4. YAML文件语法

3. Docker compose

服务编排工具

  • Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排
    一个单独的 docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
  • Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理
  • Compose 中有两个重要的概念
    • 服务 (service):一个应用的容器(可能会有多个容器),实际上可以包括若干运行相同镜像的容器实例
    • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义
  • 使用微服务架构的系统一般包含若干个微服务,每个微服务一般部署多个实例。如果每个服务都要手动启停,那么效率低,维护量大

3.1. docker-compose.yml格式

Docker-compose指令详解_docker-compose指定container名字-CSDN博客

Docker三剑客之docker-compose - 知乎

3.2. YAML文件

指定容器名之后只能部署一个,默认情况下为服务名+编号

3.3. ports、expose、links、depends_on

docker-compose的ports、expose、links、depends_on的使用技巧 - 知乎

  • ports
    • 用来把服务端口映射给宿主机
  • expose
    • 用来把服务端口开放给其他服务,客户端服务可以通过links功能访问服务端服务的端口
  • links
    • links的目的是把一个服务的名称在当前服务里面创建一个别名
  • depends_on
    • 当前服务启动之前先要把depends_on指定的服务启动起来才行

3.4. 👍docker-compose常用命令

  • docker-compose ps
    • 和当前compose的yaml文件相关的正在运行的容器
  • docker-compose images
  • docker-compose up
    • 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
    • 如果镜像不存在,会自动构建
  • docker-compose stop
    • 终止整个服务集合
  • docker-compose stop [service]
    • 终止指定的服务 (这有个点就是启动的时候会先启动 depond_on中的容器,关闭 的时候不会影响到 depond_on中的)
  • docker-compose logs -f [services…]
    • 查看容器的输出日志
  • docker-compose build [SERVICE…]
    • 构建镜像,但是不启动容器
  • docker-compose rm nginx
    • 移除指定的容器
  • docker-compose up -d –scale flask=3 organizationservice=2
    • 设置指定服务运行的容器个数
    • scale:横向伸缩

3.5. 为什么要docker-compose

可以方便地在本地调试微服务

3.6. 如何配置日志驱动Docker Logging

  • Logging 驱动是可以插拔的框架
  • Logging 驱动是 Container 用来使用服务来访问 log data 的工具
  • Docker 支持很多种类的 Logging Driver
  • 默认驱动(log-driver): “json-file”,存放到主机目录:/var/lib/docker/containers/[容器ID]-json.log
  • 单个容器的日志配置
    • docker run –log-driver syslog nginx
    • docker run –log-driver json-file –log-opt max-size=50m nginx
  • 更多驱动:fluentd、splunk、awslogs
  • 标题: 15-容器镜像构建和编排
  • 作者: Charlie
  • 创建于 : 2023-12-21 18:12:00
  • 更新于 : 2024-07-05 12:55:04
  • 链接: https://chillcharlie357.github.io/posts/70e6ad8c/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论