Dockerfile与docker-compose容器编排(Docker系列第3章,共3章)

ops/2024/9/18 20:49:05/ 标签: docker, 容器, 运维, 服务器, linux, 云计算

温馨提示

  • 不同的组件需要不同的docker配置(例如容器卷,端口,环境变量等),使用你懂得工具看hub.docker.com官方手册。
  • 不要死记硬背,因为这种东西不是天天要写,过段时间就忘了,很容易引起挫败感。
  • Dockerfile或者Docker-compose的编写,可以安装一些编辑器插件辅助编写。
  • 非官方中文文档镜像地址:https://dockerdocs.cn

Dockerfile

  • 官方文档:https://docs.docker.com/reference/dockerfile/#dockerfile-reference
  • 极简概括:用于构建Docker镜像的文本文件,包含一些指令,用于描述如何构建和配置容器,类比Linux的sh文件。
  • 适用场景:能够使用docker的地方,并且需要复杂的构建,都可以用Dockerfile。
  • 优点:
    • 降低部署成本:使用Dockerfile可以将应用程序、运行时环境和依赖项打包到一个容器镜像中,使得容器部署简单化。
    • 方便版本控制:Dockerfile是文本文件,可以与应用程序的源代码一起进行版本控制。
    • 自动化构建: Dockerfile可以与持续集成和持续交付 (CI/CD) 流程集成,实现自动化构建、测试和部署。
    • 灵活定制: Dockerfile允许DevOps自定义镜像的构建过程,可以根据具体的需求添加、删除或修改指令,实现灵活的定制。
  • 缺点:
    • 学习成本:Dockerfile有自己的语法,需要额外学习。

编写规则

  • 每条保留字(内置关键字)指令都必须为大写字母,后面至少跟随一个参数值。
  • #表示注释
  • 每条指令都会创建一个新的镜像层并对镜像进行提交,(docker会执行类似docker commit的操作,提交一个新的镜像层,然后并运行为一个新的容器,反复以上循环,直到所有命令执行完成)。
  • Dockerfile,D一定要大写。
  • 同一个保留字可使用多次。

保留字说明

  • FROM: 指定基础镜像,用于构建当前镜像的基础。例如 FROM ubuntu:latest 表示基于 Ubuntu 镜像构建,第一个指令必须是它。
  • MAINTAINER (已废弃): 用于指定维护者信息,一般是邮件,但已在 Docker 1.13 版本中废弃,建议使用 LABEL 指令来代替。
  • LABEL: 添加元数据到镜像,通常用于指定镜像的描述信息、版本号、维护者等。
  • RUN: 在镜像构建过程(docker build的时机)中执行命令,用于安装软件包、设置环境变量等,有两种运行方式,一种是shell原生风格,一种是exec风格(RUN [“参数1”, “参数2”, “参数3”])。
  • CMD: 指定容器启动后(docker run的时机)立即要执行的默认命令。如果 Dockerfile 中存在多个 CMD 指令,只有最后一个 CMD 会生效,支持shell和exec(这是防止空格产生的歧义)风格的指令,在命令行情况下,docker run命令,若与CMD执行的有冲突,则docker run会覆盖CMD中的指令。
  • EXPOSE: 声明容器运行时监听的端口,但并不映射到宿主机端口,就是个摆设。
  • ENV: 设置环境变量,可以在后续的指令中使用。例如 ENV key val,使用$KEY进行引用。也可以写成key=val。
  • ADD: 将文件、目录、URL 等资源复制到容器中。与 COPY 类似,但 ADD 具有解压功能,可以自动解压压缩文件。语法:add 宿主机路径 容器路径
  • COPY: 将本地文件复制到容器中。建议在只需要复制文件而不需要额外处理的情况下使用。
  • ENTRYPOINT: 类似CMD,但与CMD不同的是,指定的命令不会被 Dockerfile 后续的参数覆盖,而是作为参数的执行。当ENTRYPOINT遇见CMD时,CMD的含义就发生了变化,CMD变成了作为ENTRYPOINT的参数值,也就是说ENTRYPOINT为key,CMD为val,在命令行情况下,想要覆盖原本的ENTRYPOINT,需要在命令行添加–entrypoint=原entrypoint 覆盖命令。
  • VOLUME: 容器卷,垃圾玩意配置了死活不生效。
  • USER: 指定运行容器时使用的用户名,默认是root。
  • WORKDIR: 登录进容器后,默认进入的目录,如果下方有COPY、ADD、RUN、CMD、ENTRYPOINT指令,并且参数写的是相对路径,那么WORKDIR参数会影响他们的参考系。
  • ARG: 定义构建参数,用于在构建时传递变量。在构建时通过 --build-arg 参数传递。
  • ONBUILD: 定义触发器指令,用于在构建派生镜像时触发一些操作。
  • STOPSIGNAL: 指定容器停止时发送的信号,默认为SIGTERM。

运行Dockerfile

在Dockerfile所在的目录,执行(最后有个空格和点):
docker build -t 镜像名:tag .

Dockerfile简单实操

假设需要在新的centos上安装ifconfig和vim,启动容器后,进入根目录,并添加/test:/test的容器数据卷(Dockerfile添加不生效,试了20次+)

编辑一个Dockerfile
vim /test/DockfileFROM centos:latest
LABEL maintainer="zs@163.com"ENV test_dir /test#2021 年 12 月 31 日停止更新并停止维护,需要将镜像从 mirror.centos.org 更改为 vault.centos.org
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#yum clean all 是为了节省空间
RUN yum makecache && yum -y install net-tools &&  yum -y install vim && yum clean allWORKDIR $test_dir
RUN echo ----------Success------------
# 选择默认的shell为bash shell
CMD ["/bin/bash"]保存退出后,运行Dockerfile
cd /test
docker build -t zs_centos:0.0.1 .然后运行容器,并添加容器docker run -it -v /test:/test --privileged=true 7611bfc76047 /bin/bash

dockercompose_73">docker-compose

  • 官方文档:https://docs.docker.com/compose/reference
  • 极简概括:使用一个docker-compose.yml文件来配置多个容器的启动关闭和加载顺序,实现集群化统一管理的docker官方工具。
  • 适用场景:多容器部署。对于小公司或个人几乎用不到,10个任意规模的公司,用docker的有3个,用容器编排可能就1个,并不是所有的公司都有分布式、微服务、或集群。
  • 两个重要概念:
    • 项目:项目是Docker Compose管理的一个单元,它由一个或多个服务组成,一个docker-compose.yml管理一个项目。
    • 服务:一个或多个容器组成一个服务,服务是个模糊的概念,可以理解为一个或多个容器对外提供一种解决方案。
    • 辅助记忆:一个docker-compose.yml管一个项目,一个项目管多个服务,一个服务管单个或多个容器
  • 优点:
    • 简化多容器部署流程。
    • 对多个容器实现统一管理。
  • 缺点:
    • 学习成本大:DockerCompose有自己的语法,增加学习成本,可以照着官方文档的docker run命令去实现。
    • 局限性:大规模复杂化的部署,可能需要更复杂的编排工具,或者更加精细化个性化的配置,这需要更复杂的编排计划。
    • 不支持跨主机:对于需要跨多个主机进行部署和管理的场景,可能需要使用其它容器编排工具,如 Kubernetes(K8S)。
  • 安装:
curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composeln -s /usr/local/bin/docker-compose /usr/bin/docker-composedocker-compose --version

dockercomposeyml_99">docker-compose.yml保留字

https://docs.docker.com/compose/compose-file/compose-file-v3/

  • version:定义Docker Compose文件的版本。例如,version: '3’表示使用Docker Compose的第3个版本。
  • services:定义各种服务的配置。每个服务可以包括镜像、端口映射、环境变量等信息。
  • networks:定义网络配置,包括网络驱动、IP范围等,相当于docker run --network
  • volumes:定义存储卷的配置,用于持久化数据。
  • build:参数跟路径,用于构建镜像,可以指定Dockerfile的路径去构建镜像。
  • image:指定使用的镜像名称。
  • ports:定义端口映射,将容器内部的端口映射到宿主机上。
  • environment:设置容器的环境变量,相当于docker run -e。
  • depends_on:参数值为依赖的服务名,定义服务之间的依赖关系,确保一个服务在另一个服务启动之后再启动,但不会等待前面的服务完全启动就绪后在启动。
  • volumes_from:从其他服务或容器挂载存储卷。
  • links:链接到其他服务。
  • restart:定义容器跟随docker引擎的重启,相当于docker run --restart=always
  • network_mode:指定容器使用的网络模式。
  • ports:定义容器端口映射。
  • external_links:链接到外部容器
  • command:覆盖容器启动后默认执行的命令。
  • entrypoint:覆盖容器的默认入口点。
  • env_file:从文件加载环境变量,通过env文件来替代environment,env文件更加私密,防止信息泄露。
  • expose:暴露端口,不进行端口映射,只是标示容器监听的端口。
  • labels:为容器设置元数据。
  • logging:配置日志记录选项。
  • container_name:指定容器的名称,相当于docker run --name
  • devices:允许容器使用宿主机的设备。
  • dns:自定义DNS服务器
  • dns_search:DNS搜索域名配置。
  • tmpfs:挂载临时文件系统。
  • cap_add, cap_drop:添加或删除容器的内核能力。
  • security_opt:自定义容器的安全选项。
  • user:指定容器内的命令以何种用户身份运行。
  • working_dir:设置容器内的工作目录。
  • domainname:容器的域名。
  • hostname:容器的主机名。
  • ipc:设置容器的IPC模式。
  • mac_address:为容器指定MAC地址。
  • privileged:指定容器是否在特权模式下运行。
  • read_only:设置容器的文件系统为只读。
  • shm_size:设置共享内存大小。
  • stdin_open, tty:保持标准输入开放,并分配一个伪终端。
  • extends:继承另一个服务的配置。
  • external:声明外部资源,如网络或卷。
  • extra_hosts:添加额外的 hosts 条目到容器的 /etc/hosts 文件中。
  • healthcheck:定义容器的健康检查配置。
  • isolation:指定容器的隔离技术。
  • logging:配置单个服务的日志记录选项。
  • network_mode:指定容器使用的网络模式。
  • pid:指定容器的PID模式。
  • platform:指定在哪个平台上运行容器
  • ports:定义端口映射,将容器内部的端口映射到宿主机上。
  • secrets:从 Docker Swarm 中的 secret 中注入密钥。
  • stop_grace_period:指定停止容器前的等待时间。
  • sysctls:自定义容器的内核参数。
  • ulimits:设置容器的资源限制。
  • volume_driver:指定使用的卷驱动程序。
  • stop_signal:指定停止容器时发送的信号。
  • tty:分配一个伪终端。
  • restart:定义容器重启策略。
  • scale:指定服务的副本数量。
  • deploy:在 Docker Swarm 中定义部署选项。
  • configs:从 Docker Swarm 中的 config 中注入配置文件。

dockercompose__161">docker-compose 常用操作命令

#docker-compose xxx 后面跟参数的,一般是服务器id,或者其它内置指令。
docker-compose -h                   # 查看帮助
docker-compose up                   #启动所有docker-compose服务
docker-compose up-d                 #启动所有docker-compose服务并后台运行
docker-compose up 服务名            #启动指定docker-compose服务
docker-compose down                 #停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id  #进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id/bin/bash
docker-compose ps                   #展示当前docker-compose编排过的运行的所有容器
docker-compose top                  #展示当前docker-compose编排过的容器进程
docker-compose logs 服务id          #查看容器输出日志 -f为动态实时输出
docker-compose config               #检查配置
docker-compose config -q            #检查配置,有问题才有输出
docker-compose restart              #重启服务
docker-compose start                #启动服务
docker-compose stop                 #停止服务
docker-compose pause 服务id         #暂停状态中的服务
docker-compose unpause 服务id       #恢复处于暂停状态中的服务

dockercomposeyml_181">docker-compose.yml简单实操

记得把中文注释去了。

//docker-compose版本号,这个和docker引擎版本关联,https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-and-docker-compatibility-matrix
version: "3.8"
//定义多个服务
services://服务起个名zs_nginx://镜像image: nginx:latest//相当于docker run -p参数ports:- "80:80"//容器volumes:- /test:/usr/share/nginx/html//服务起个名zs_mysql://镜像image: mysql:latest//相当于docker run -p参数ports:- "3306:3306"//环境变量,相当于docker run -eenvironment://或者写成MYSQL_ROOT_PASSWORD:ROOT- "MYSQL_ROOT_PASSWORD=root"保存并退出docker-compose up -ddocker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
65b8ea2596c9   mysql:latest   "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   test-zs_mysql-1
8de18d446714   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp                      test-zs_nginx-1

http://www.ppmy.cn/ops/6968.html

相关文章

【大模型应用极简开发入门(1)】LLM概述:LLM在AI中所处位置、NLP技术的演变、Transformer与GPT、以及GPT模型文本生成逻辑

文章目录 一. AI中大语言模型的位置与技术发展1. 从AI到Transformer2. NLP:自然语言处理3. LLM大型语言模型:NLP的一种特定技术3.1. LLM定义3.2. LLM的技术发展3.2.1. n-gram模型3.2.2. RNN与LSTM 二. Transformer在LLM中脱颖而出1. Transformer架构能力…

HarmonyOS开发实战:【亲子拼图游戏】

概述 本篇Codelab是基于TS扩展的声明式开发范式编程语言编写的一个分布式益智拼图游戏,可以两台设备同时开启一局拼图游戏,每次点击九宫格内的图片,都会同步更新两台设备的图片位置。效果图如下: 说明: 本示例涉及使…

高风险IP的来源及其影响

随着互联网的发展,网络安全问题越来越引人关注。其中,高风险IP的来源成为了研究和讨论的焦点之一。高风险IP指的是那些经常涉及到网络攻击、恶意软件传播以及其他不良行为的IP地址。它们的存在不仅对个人和组织的网络安全构成威胁,还可能给整…

WebAPI

错误回收 try{undefined[1]}catch (e){console.log(e)} throw关键词处理的是报错 错误类型: EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError try{throw 1}catch (e){console.log(e)}1会被e接收 try{[][1][1]}catch (e){console.log(e)}f…

Android多线程:Handler runOnUiThread 异步消息处理机制

目录 一,Android中的多线程问题 1.模拟耗时工作 2.Android开启子线程 二,在子线程中更新UI 1.异步消息处理机制 Handler 2.使用runOnUiThread更新UI 一,Android中的多线程问题 Android用户界面是与用户交互的接口,对于用户的…

MySQL的内外连接

📟作者主页:慢热的陕西人 🌴专栏链接:MySQL 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容主要介绍了MySQL中的内外连接 文章目录 MySQL的内外连接…

模拟器无法ADB链接的所有情况及解决方案

前言: adb(Android Debug Bridge)安卓调试桥,简单可以理解为外部连接安卓内部的一个接口,走的是tcp协议。 但是在模拟器上面经常会遇到连不上adb,在此收集一下各种情况,想起来或者遇到了就更新…

搞定这些python自动化测试面试题与答案汇总,offer拿到手软!

1、什么项目适合做自动化测试? 关键字:不变的、重复的、规范的 1)任务测试明确,需求不会频繁变动 2)项目周期要足够长 3)自动化测试脚本可重复使用,比如:比较频繁的回归测试 4&…

【Python】如何在Ubuntu上设置Python脚本开机自启

你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 🎵 王力宏《你不知道的事》 前置要求 确保你的Ub…

云轴科技ZStack智慧教育云计算解决方案入选中国信通院《高质量数字化转型技术解决方案集》

近日,中国信通院“铸基计划”《高质量数字化转型技术解决方案(2023年度)》(以下简称“方案集”)发布,云轴科技ZStack智慧教育云计算解决方案入选《高质量数字化转型技术解决方案集》。 为促进数字化转型相…

学习 Rust 的第四天:基本编程概念学习

嘿,大家好! 欢迎来到 Rust 学习的第四天,我参考的是 Steve Klabnik 的《Rust 编程语言》一书。昨天我们做了一个 [猜数字游戏](https://blog.csdn.net/Tory2/article/details/137764707?spm1001.2014.3001.5501),今天我们将深入…

CentOS的常用命令

1. 系统信息查询与管理 查看系统基本信息 hostnamectl:显示主机名、操作系统版本、内核版本、架构等信息。 hostnamectl uname:显示系统内核与硬件信息。 uname -a # 显示全部信息 lsb_release:显示LSB(Linux Standard Base&am…

【微信小程序】解决分页this.setData数据量太大的限制问题

1、原始方法,每请求一页都拿到之前的数据concat一下后整体再setData loadData() {let that thislet data {}data.page this.data.pagedata.size this.data.sizefindAll(data).then(res > {if (res.data.code 1) {this.setData({dataList: this.data.dataLi…

MVCC(多版本并发控制)

MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种并发控制方法,用于解决数据库中多个事务同时执行时可能产生的数据一致性问题。MVCC 在数据库中通过维护多个数据版本(记录历史版本)来提供高…

数据结构——排序

1 插入排序 插入排序&#xff1a;将待排序的值插入到前面已排序的序列中&#xff0c;直到所有元素都已经插入。 1.1 直接插入排序 //直接插入排序 for(j1;j<size;j) {tmpa[j];for(kj-1;k>0&&a[k]>tmp;k--)a[k1]a[k];a[k1]tmp; } 时间复杂度分析 最好情况&a…

23种设计模式之抽象工厂

简单工厂和工厂方法 关注 产品等级 抽象工厂 关注 产品族 对于比较稳定的产品&#xff0c;抽象工厂更有效率&#xff08;一个工厂生产很多产品族&#xff09; 抽象工厂代码例子加深理解

Go 之常用并发学习

在 Go语言实战 中看到有些并发相关的例子&#xff0c;讲解得也比较详细&#xff0c;于是乎写来加深下印象。 无缓冲通道 无缓冲通道在接收前没有能力保存任何值。我自己找了书上的示例来加深一下印象。 模拟网球比赛 package mainimport ("fmt""math/rand&q…

如何利用MySQL建立覆盖原表的索引优化查询性能

MySQL数据库中&#xff0c;建立合适的索引对于提高查询性能至关重要。然而&#xff0c;在某些情况下&#xff0c;我们可能需要进一步优化查询性能&#xff0c;而覆盖索引&#xff08;Covering Index&#xff09;就是一种有效的方法。本文将介绍什么是覆盖索引以及如何在MySQL中…

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

安宝特方案 | AR工业解决方案系列-工厂督查

在工业4.0时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正全面重塑传统工业生产&#xff0c;在工厂监督领域&#xff0c;其应用不仅大幅提升了生产效率、监测准确性和规范执行程度&#xff0c;而且为整体生产力带来了质的飞跃。 01 传统挑战与痛点 在制造业生产流程…