15-容器镜像构建和编排
1. 由Dockerfile构建镜像
1.1. 过程
Image:静态的压缩包
Container:运行的容器,轻量级的虚拟机
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 - 知乎
.dockerignore
文件- 容器只运行单个应用
- 解耦,未来可以单独对一个应用进行升级/重启/…
- 将多个RUN指令合并为一个
- 原因:减少镜像分层
- 基础镜像的标签不要用latest
- 建议使用固定的版本,使得镜像可预知
- 每个RUN指令的最后删除多余文件
- 原因:否则,虽然在下一个RUN删掉,上一层的文件还在(写时复制,上一层不可修改)
- 选择合适的基础镜像(alpine版本最好)
- 轻量级
- 设置WORKDIR和 CMD
- 合理安排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博客
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 进行许可。
评论