当前位置: 首页 > news >正文

Docekrfile和docker compose编写指南及注意事项

Dockerfile

基础语法

我们通过编写dockerfile,将每一层要做的事情使用语法固定下来,之后运行指令就可以通过docker来制作自己的镜像了。

构建镜像的指令:docker build /path -t imageName:tag

注意,docker build后的path必须是dockerfile文件所在的目录。

制作镜像的过程中的输出信息挺详细的,如果我们编写的dockerfile文件有误,可以直接通过输出判断,并对dockerfile文件进行更改。

指令

说明

示例

FROM

指定基础镜像

FROM centos:6

ENV

设置环境变量,可在后面指令使用

ENV key value

COPY

拷贝本地文件到镜像的指定目录

COPY ./xx.jar /tmp/app.jar

RUN

执行Linux的shell命令,一般是安装过程的命令

RUN yum install gcc

EXPOSE

指定容器运行时监听的端口,是给镜像使用者看的

EXPOSE 8080

ENTRYPOINT

镜像中应用的启动命令,容器运行时调用

ENTRYPOINT java -jar xx.jar

dockerfile编写模板

Go程序Dockerfile模板【两阶段构建】

# 构建:使用golang:1.21版本
FROM golang:1.21 as build# 容器环境变量添加 容器内部的环境变量 key value的形式
ENV GO111MODULE=on \GOPROXY=https://goproxy.cn,direct \CGO_ENABLED=0 \GOOS=linux \GOARCH=amd64#移动到工作目录,没有该目录会自动创建
WORKDIR /go/release# 把全部文件复制到/go/release目录
COPY . .# 编译: 把main.go编译为可执行的二进制文件, 并命名为app
RUN go build -o dijiexiaApp# 运行: 使用scratch作为基础镜像
FROM alpine as prod# 在build阶段, 复制时区配置到镜像的/etc/localtime
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /etc/localtime# 在build阶段, 复制./app目录下的可执行二进制文件到当前目录
COPY --from=build /go/release/dijiexiaApp /# 在build阶段, 复制yaml配置文件到当前目录, 此处需要注意调用该配置文件时使用的相对路径, main.go在当前目录下执行
# 一些配置文件不需要在容器内部进行创建,回来直接挂载到容器外部即可,
COPY --from=build /go/release/conf /conf
COPY --from=build /go/release/app/casbin/model.conf /app/casbin/EXPOSE 8000
EXPOSE 8001# 启动服务 CMD是运行镜像时,执行的命令
ENTRYPOINT ["./dijiexiaApp","./conf/develop.yaml"]

Java程序Dockerfile模板

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

docker compose

一般我们的项目通常包含多个容器,比如业务项目容器、MySQL容器、Redis容器、RabbitMQ容器。如果我们仍然采用手动部署的方式,是比较麻烦的。我们需要逐个将容器启动,并且需要记录容器的启动顺序,因为容器之间可能存在依赖的关系。复杂一点的话,我们还需要将各个容器加入到一个网络中,方便通过容器名进行通信。而通过Docker Compose可以帮助我们实现多个相互关联容器的快速部署。

docekr-compose.yaml文件的编写语法大致和通过命令启动容器的格式一致,以下是它们之间的关系

docker run 参数

docker compose 指令

说明

--name

container_name

容器名称

-p

ports

端口映射

-e

environment

环境变量

-v

volumes

数据卷配置

--network

networks

网络

 docker-compose编写模板

version: "1.1"services:mysql:image: mysqlcontainer_name: diJieXiaMysqlports:- "3710:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- /opt/dijiexia_mysql/conf:/etc/mysql/conf.d #目录挂载MySQL的配置文件- /opt/dijiexia_mysql/data:/var/lib/mysql #目录挂载MySQL的数据-  /opt/dijiexia_mysql/init:/docker-entrypoint-initdb.d #初始化数据库脚本挂载点,MySQL容器首次启动时,会自动执行.sh,.sql文件networks:- diJieXiaredis:image: rediscontainer_name: diJieXiaRedisports:- "3711:6379"command: ["redis-server", "--requirepass", "123456"]networks:- diJieXia#通过重新构建镜像的方式获取Go镜像,相当于docker build .dijiexia:build:context: .dockerfile: Dockerfilecontainer_name: diJieXiaProjectports:- "8001:8001"- "8000:8000"networks:- diJieXiadepends_on:- mysql- redisnginx:image: nginxcontainer_name: diJieXiaNginxports:- "3712:80"volumes:- /opt/dijiexia_front/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #将nginx的配置文件nginx.conf挂载出来- /opt/dijiexia_front/nginx/conf.d:/etc/nginx/conf.d #挂载nginx的配置文件夹,通过在nginx.conf中的设置,会自动读取给目录下以.conf结尾的文件- /opt/dijiexia_front/nginx/html:/usr/share/nginx/html #将加载静态页面的目录挂载出来networks:- diJieXia
networks:diJieXia:name: diJieXia111

简单的depends_on存在的问题:

在本版本的docker-compose.yaml文件的模板中,会有一个问题:我们的Go程序会启动失败,原因是因为Go程序所依赖的MySQL容器和Redis容器没有完全启动成功,导致Go程序获取MySQL或Redis连接的时候失败。

虽然在yaml中,我们在yaml文件中设置了depends_on,让MySQL容器、Redis容器先于GO业务程序启动。但是可能存在我们的MySQL容器和Redis容器还未启动完毕,而我们的Go程序已经启动了,从而导致我们的Go程序启动失败。理想情况下是MySQL和Redis容器启动完毕并且保证可用后,我们的Go程序才开始启动。因此,在启动Go程序之前,需要对MySQL和Redis做健康检查,确保MySQL和Redis已经启动成功了。如果MySQL或Redis启动失败了,我们还需要将启动失败的容器进行重启或者选择忽略。

为此,DockerCompose提供了两种机制

condition说明:

为此,Docker中提供了一种长定义的模式,方便我们对容器编排的过程做更加精准的设置。

  • condition: service_started
  • condition: service_healthy
  • condition: service_completed_successfully

如果condition设置为service_started,只表示在该容器在所有依赖服务后启动,不保证依赖容器的可用性。

如果condition设置为service_healthy,表示等待依赖服务的健康状态后在启动相关服务。其中健康状态通常是在同期中运行健康检查命令或脚本来确定的。例如,检查HTTP响应或数据连接等。

如果condition设置为service_completed_successfully,表示依赖服务成功完成后(即退出状态码为0),才会启动相关服务,通常用于数据库迁移、初始化脚本等。

required说明:

在长定义语法中,required字段用于指定依赖服务是否是必需的。它控制了当依赖服务未启动或不可用时的行为。

  • 当 required 设置为 true(默认值),如果依赖服务未启动或不可用,Compose 将阻止启动相关的服务,并显示警告信息。

  • 当 required 设置为 false,Compose 仍会显示警告信息,但不会阻止启动相关的服务。相当于它是可选的,即使依赖服务未启动或不可用,相关服务仍会尝试启动。

version: "1.1"services:mysql:image: mysqlcontainer_name: diJieXiaMysqlports:- "3710:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- /opt/dijiexia_mysql/conf:/etc/mysql/conf.d #目录挂载MySQL的配置文件- /opt/dijiexia_mysql/data:/var/lib/mysql #目录挂载MySQL的数据- /opt/dijiexia_mysql/init:/docker-entrypoint-initdb.d #初始化数据库脚本挂载点,MySQL容器首次启动时,会自动执行.sh,.sql文件healthcheck:test: [ "CMD","mysqladmin","ping","-h","localhost" ]interval: 30stimeout: 3sretries: 3networks:- diJieXiaredis:image: rediscontainer_name: diJieXiaRedisports:- "3711:6379"volumes:- /opt/dijiexia_redis/conf/redis.conf:/usr/local/etc/redis/redis.conf- /opt/dijiexia_redis/data:/datacommand: [ "redis-server", "--requirepass", "123456" ]healthcheck:test: [ "CMD","redis-cli","ping" ]interval: 30stimeout: 3sretries: 3networks:- diJieXia#通过重新构建镜像的方式获取Go镜像,相当于docker build .dijiexia:build:context: .dockerfile: Dockerfilecontainer_name: diJieXiaProjectports:- "8001:8001"- "8000:8000"networks:- diJieXiavolumes:- ./conf:/confcommand:- RUN apk add --no-cache curlhealthcheck:test: [ "CMD","curl","-f","http://localhost:8000/api/v1/admin/captcha" ]interval: 30stimeout: 5sretries: 3depends_on:mysql:condition: service_healthyrequired: trueredis:condition: service_healthyrequired: truenginx:image: nginxcontainer_name: diJieXiaNginxports:- "3712:80"volumes:- /opt/dijiexia_front/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #将nginx的配置文件nginx.conf挂载出来- /opt/dijiexia_front/nginx/conf.d:/etc/nginx/conf.d #挂载nginx的配置文件夹,通过在nginx.conf中的设置,会自动读取给目录下以.conf结尾的文件- /opt/dijiexia_front/nginx/html:/usr/share/nginx/html #将加载静态页面的目录挂载出来depends_on:dijiexia:condition: service_healthyrequired: falsenetworks:- diJieXianetworks:diJieXia:name: diJieXia111
volumes:diJieXiaRedisConf: { }diJieXiaRedisData: { }

当我再次使用docker compose up -d 运行的时候,会发现先启动MySQL、Redis容器,等到30秒之后,进行一次健康检测,发现MySQL和Redis都处于健康状态,之后才启动Project容器,等到Project容器健康检测后,最后启动Nginx容器。

通过condition和required参数,我们可以更加精准地控制容器编排的顺序。

相关文章:

Docekrfile和docker compose编写指南及注意事项

Dockerfile 基础语法 我们通过编写dockerfile,将每一层要做的事情使用语法固定下来,之后运行指令就可以通过docker来制作自己的镜像了。 构建镜像的指令:docker build /path -t imageName:tag 注意,docker build后的path必须是dockerfile…...

VITS源码解读6-训练推理

1. train.py 1.1 大体流程 执行main函数,调用多线程和run函数执行run函数,加载日志、数据集、模型、模型优化器for循环迭代数据batch,每次执行train_and_evaluate函数,训练模型 这里需要注意,源码中加载数据集用的分…...

力扣 简单 104.二叉树的最大深度

文章目录 题目介绍解法 题目介绍 解法 如果知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为max(l,r)1,而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用递归的方法来计算二叉树的最大深度。具体而言&#xff…...

单片机长短按简单实现

单片机长短按简单实现 目录 单片机长短按简单实现1 原理2 示例代码2.1 按键实现 3 测试log4 其他实现方式 1 原理 按键检测和处理的步骤如下: 1:定时扫描按键(使用定时器定时扫描,也可以用软件延时或者系统心跳之类的方式&#…...

如何用好通义灵码企业知识库问答能力?

通义灵码企业版:通义灵码企业标准版快速入门_智能编码助手_AI编程_智能编码助手通义灵码(Lingma)-阿里云帮助中心 通义灵码提供了基于企业知识库的问答检索增强的能力,在开发者使用通义灵码 IDE 插件时,可以结合企业知识库内上传的文档、文件…...

C语言自定义类型:联合体

目录 前言一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的⼀个练习 总结 前言 前面我讲到C语言中的自定义结构——结构体,其实C语言中的自定义结构不只有结构体,还有枚举和联合体&am…...

【JavaEE】——线程池大总结

阿华代码,不是逆风,就是我疯, 你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 引入:问题引入 一:解决方案 1:方案一——协程/纤程 (1…...

编程中为什么使用0和1表示状态

前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 我们看到很多项目都使用0和1表示某些状态信息,具体含义取决于上下文。以下是一些常见的用法: 布尔值&#x…...

C++入门基础知识90(实例)——实例15【求两数的最大公约数】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于求两数的最大公约数的相关内容&#xff…...

自动化办公-Python-os模块的使用

os.path 模块的使用 在指定文件路径时,由于操作系统的差异,直接使用硬编码的路径可能会导致程序在不同平台上无法正常运行。为了解决这个问题,Python 提供了 os.path 模块,它包含了一系列用于路径操作的函数,可以帮助您…...

无人机之数据处理技术篇

一、数据采集 无人机通过搭载的各种传感器和设备,如GPS、加速度计、陀螺仪、磁力计、激光雷达(LiDAR)、高光谱相机(Hyperspectral)、多光谱相机(Multispectral)以及普通相机等,实时采集飞行过程中的各种数据。这些数据包括无人机的位置、速度、高度、姿态…...

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文|部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…...

c++(AVL树及其实现)

一、AVL树的概念 AVL树是最先发明的自平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右子树都是AV树,且左右子树的高度差的绝对值不超过1。AVL树是⼀颗高度平衡搜索⼆叉树, 通过控制高度差去控…...

Cesium GIS项目关于湖泊识别与提取的实现

1. 引言 项目背景 随着遥感技术的发展,地理信息系统的应用越来越广泛。本项目旨在开发一个基于Cesium的地理信息系统,利用深度学习技术自动识别并显示湖泊的位置。 目标与意义 通过自动化处理大量遥感影像数据,提高湖泊监测的效率和准确性,为水资源管理和环境保护提供支…...

两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html

两个圆形 一个z里面一个z外面&#xff0c;z里面的大&#xff0c;颜色不同 html <!DOCTYPE html> <html> <head> <style> .outer-circle {width: 150px;height: 150px;border-radius: 50%;background-color: #ff9999; /* 外圆的颜色 */position: relat…...

【Power Query】M函数-table

M函数-table 添加列&#xff08;AddColumn&#xff09;&#xff1a;条件语句&#xff08;If..then..else&#xff09;&#xff1a;容错语句&#xff08;try..otherwise&#xff09;&#xff1a; 排序&#xff08;ReorderColumns&#xff09;&#xff1a;筛选&#xff08;Selec…...

uni-app 封装websocket 心跳检测,开箱即用

class websocketUtils {constructor(url, needbeat, options {}) {this.needbeat needbeat;this.url url;this.options options;this.ws null;this.heartbeatInterval options.heartbeatInterval || 10000; // 心跳间隔&#xff0c;默认为10秒 this.reconnectInterval …...

ASP.NET Core8.0学习笔记(十九)——EF Core DbSet

一、DbSet概述 1.DbSet提供了通过DbContext对表进行查询操作的路径。DbSet对应的属性名称将默认映射为实体T的表名。 2.使用DbSet<T>进行查询的方法&#xff1a; (1)直接在DbContext中创建对应的DbSet<T>属性 (2)使用DbSet DbContext.Set<T>方法操作数据表。…...

Android Camera 预览角度和拍照保存图片角度相关

–基于Android R(11) 关于Camera Camera Framework 的架构 Android Camera Framework 是一个分层架构&#xff0c;由以下组件组成&#xff1a; HAL&#xff08;硬件抽象层&#xff09;: HAL 抽象底层相机硬件,提供与不同设备相机进行交互的标准接口.CameraService : Camera…...

新手如何使用Qt——方法使用

前言 那么这篇文章其实是我在使用Qt的过程当中呢&#xff0c;我发现在Qt使用过程中&#xff0c;在我理解信号和槽这个概念后&#xff0c;在编写槽函数数的时候&#xff0c;发现了自身存在的问题&#xff0c;我的难点是在于当我在编写槽函数的时候&#xff0c;我知道这个槽函数是…...

友元运算符重载函数

目录 1.定义友元运算符重载函数的语法形式 2.双目运算符重载 3.单目运算符重载 1.定义友元运算符重载函数的语法形式 &#xff08;1&#xff09;在类的内部&#xff0c;定义友元运算符重载函数的格式如下&#xff1a; friend 函数类型 operator 运算符&#xff08;形参表&a…...

从0开始实现es6 promise类

主要由基础实现和静态类的实现两部分组成。 1 基础实现&#xff08;不含静态类&#xff09; 1.1 使用类实现完成构造函数 实现代码如下&#xff0c;构造函数传入一个回调函数&#xff0c;定义resolve和reject函数&#xff0c;将两个函数作为参数执行回调函数。 // 1. 使用类实…...

XML 编码

XML 编码 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它由万维网联盟&#xff08;W3C&#xff09;开发&#xff0c;旨在提供一种标准的方式来结构化、存储和传输数据。XML的设计目标是既易于人类阅读&#xff0c;也易于机器解析。 XML的…...

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机&#xff0c;旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法&#xff0c;能够自动识别和分析家中宠物的行为&#xff0c;并提供定制化的护理建议。 SiiPet相机的核心功…...

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435相机和MediaPipe的手部姿态检测&#xff0c;进一步简单实现手部姿态与机器人末端的重定向&#xff0c;获取手部的6D坐标&#xff08;包括位置和姿态&#xff09;。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&…...

js中防抖 debounce 节流 throttle 原理 从0手动实现

1 防抖 高频触发事件时&#xff0c;执行损耗高的操作&#xff0c;连续触发过程中&#xff0c;只执行最后一次。 高频事件&#xff1a;input scroll resize等。损耗高&#xff1a;网络请求、dom操作。 实现防抖步骤&#xff1a;1.在回调函数中判断timer是否存在&#xff0c;存在…...

AIGC: 10 AI转文服务器的搭建过程记录

上图是台风席卷城市&#xff0c;现在企业的服务基本都是混合部署&#xff0c;云计算厂商的机房往往可以提供比较好的保护&#xff0c;一般在地下&#xff0c;扛多少级地震&#xff0c;扛多少级台风&#xff0c;而自建机房&#xff0c;往往写字楼经常停电&#xff0c;网络运营上…...

性能测试1初步使用Jmeter

当你看到这边文章的时候&#xff0c;详细你已经知道啥是性能测试&#xff0c;以及也听说过Jmeter了&#xff0c;所以不过多介绍&#xff0c;这里&#xff0c;只是帮助你快速的使用Jmeter来测试接口。 1获取安装包 官网下载地址&#xff1a;https://jmeter.apache.org/downloa…...

OpenGL ES 绘制一个三角形(2)

OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统&#xff0c;使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里&#xff0c;三角形是一个基础图形&#xff0c;其他的图形都可以使用三角形拼接而成&#xff0c;所以我们就的案例就基于这个开始。 在Android系统中…...

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…...