[云原生]Docker-compose:一站式多容器应用部署神器

目录

引言

一、Docker Compose 简介

(一)基本信息

(二)核心特性

(三)文件格式

二、Docker Compose 环境安装

(一)准备安装包

(二)添加执行权限

三、 Docker Compose操作

(一)配置常用字段

(二)常用命令

(三)文件结构

(四)生成nginx镜像及容器

1.准备安装包与配置文件

2.编写Dockerfile文件

3.编写docker-compose.yml文件

4.执行命令生成镜像

5.查看并访问镜像

四、多容器编排

(一)down删除

(二)编排多个容器

1.nginx配置

2.tomcat配置

3.编写docker-comppose.yml文件

4.执行命令生成镜像与容器

5.查看结果


引言

在当今的云原生时代,Docker已经成为应用程序容器化的代名词,它让我们能够将应用及其依赖打包进轻量级、可移植的容器中。然而,随着微服务架构的流行,单个应用往往由多个相互依赖的服务组成,管理这些服务及其配置变得日益复杂。为了解决这一挑战,Docker推出了Docker Compose——一个用于定义和运行多容器Docker应用的工具,它让复杂的多服务应用部署变得简单而高效。

一、Docker Compose 简介

(一)基本信息

Docker Compose 是 Docker 官方提供的一种工具,用于在一个 YAML 文件中定义和配置多个 Docker 容器应用服务,进而实现多容器应用的快速部署和管理。通过 Docker Compose,您可以更方便地定义服务间的依赖关系、网络和卷等,使得在开发和生产环境中部署复杂应用变得简单高效。

(二)核心特性

服务定义:在 docker-compose.yml 文件中,每个服务被定义为一个独立的实体,包含镜像、环境变量、端口映射、挂载卷等配置,使得应用架构清晰明了。

环境无关性:Compose 允许你在任何环境中一致地部署应用,无论是开发、测试还是生产环境,确保了环境的一致性。

一键启动:使用 docker-compose up 命令,可以依据 docker-compose.yml 文件中的定义,一次性启动所有服务及其依赖,大大减少了手动启动容器的复杂性。

编排管理:Docker Compose 能够自动处理服务间的依赖关系,确保服务按照正确的顺序启动和关闭,支持服务的重启、停止、重建等操作。

网络与数据管理:自动创建并管理网络,使得服务间通信变得简单,同时支持数据卷的定义,保证数据的持久化存储。

动态更新:当服务配置发生变化时,通过 docker-compose up --force-recreate 可以重新创建服务,只有配置有变动的服务会被重新创建,保证了资源的有效利用。

可扩展性:Compose 支持变量注入,允许根据不同的环境变量动态调整配置,使得应用在不同环境下灵活部署

(三)文件格式

Docker Compse工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)

YAML文件格式注意事项

  • 大小写敏感:YAML 对大小写敏感。
  • 缩进:使用空格进行缩进,不能使用 Tab 键。缩进代表层级关系,通常开头缩进2个空格。
  • 数据结构:支持三种主要的数据结构:对象(映射)、数组(序列)和纯量(字符串、数字、布尔值等)。
  • 注释:使用 # 符号进行单行注释。
  • 字符串:通常不需要引号包围,但含有特殊字符或空白字符时需要使用引号
  • 符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠
  • 如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思

二、Docker Compose 环境安装

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose

(一)准备安装包

使用curl命令下载,或者在github官网进行下载

curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

(二)添加执行权限

[root@docker ~]#cd  /usr/local/bin
[root@docker bin]#chmod +x docker-compose 
[root@docker bin]#ls
docker-compose
[root@docker bin]#docker-compose --version
docker-compose version 1.25.0-rc4, build 8f3c9c58

三、 Docker Compose操作

(一)配置常用字段

字段描述
build指定 Dockerfile 文件名
dockerfile构建镜像上下文路径
context可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image指定镜像
command执行命令,覆盖容器启动后默认执行的命令
container_name指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment添加环境变量
networks添加自定义网络,引用顶级networks下条目
network_mode设置容器的网络模式,如 host,bridge,...
ports暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname容器主机名
sysctls在容器内设置内核参数
links    连接到另外一个容器,- 服务名称[:服务别名]
privileged    用来给容器root权限,注意是不安全的,true表示开启,false关闭
restart

设置重启策略,no,always,nounless-st-failure,oped

        no,默认策略,在容器退出时不重启容器。
        on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
        on-failure:3,在容器非正常退出时重启容器,最多重启3次。
        always,在容器退出时总是重启容器。
        unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker

                                    守护进程启动时就已经停止了

depends_on

depends_on标签用于解决容器的依赖、启动先后的问题

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出

(二)常用命令

字段 描述
-f, --file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME 指定项目名称,默认使用目录名称
-d 在后台运行
build重新构建服务
ps列出容器
up创建和启动容器  
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示容器进程
logs查看容器输出
down删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

(三)文件结构

[root@docker compose]#pwd
/data/compose
[root@docker compose]#tree
.
├── docker-compose.yml           #创建模板脚本
├── html                         #站点目录
│   └── index.html               #自定义站点文件
└── nginx
    ├── Dockerfile               #创建容器脚本
    ├── nginx-1.18.0.tar.gz      #复制源码包
    └── nginx.conf               #自定义配置文件,也可使用默认文件

(四)生成nginx镜像及容器

1.准备安装包与配置文件

2.编写Dockerfile文件

FROM centos:7
#指定基础镜像为CentOS 7。
 
MAINTAINER this is nginx image <nginx>
#声明镜像作者及联系信息
 
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx
#通过yum包管理器安装编译Nginx所需的依赖包
#创建一个名为nginx的系统用户,并禁止其登录shell
 
ADD nginx-1.18.0.tar.gz /usr/local
#将名为nginx-1.18.0.tar.gz的Nginx源代码压缩包解压到容器内的/usr/local目录下。
 
WORKDIR /usr/local/nginx-1.18.0
#设置工作目录为解压后的Nginx源代码目录。
 
RUN ./configure ... ;make -j4 && make install
#在Nginx源代码目录下执行配置、编译和安装操作。编译使用了4个线程(-j 4)以提高速度。
 
ENV PATH /usr/local/nginx/sbin:$PATH
#设置环境变量PATH,将Nginx的sbin目录加入到PATH中,使得在容器内可以直接执行Nginx的命令。
 
EXPOSE 80 和 EXPOSE 443
#分别声明容器运行时将公开80端口(HTTP)和443端口(HTTPS),表示Nginx将在这些端口上提供服务。
 
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
#设置容器启动时默认执行的命令,即启动Nginx服务器,并指定运行在前台模式(防止容器启动后立即退出)
#通过-g "daemon off;"参数禁用了Nginx的守护进程模式
#这意味着当启动容器时,Nginx将以非守护进程形式运行,并且容器的生命周期与Nginx服务绑定在一起。

3.编写docker-compose.yml文件

[root@docker compose]#vim  docker-compose.yml 
[root@docker compose]#cat  docker-compose.yml 
version: "3"
#指定了该文件遵循的Docker Compose配置文件格式版本为3。这个版本支持多网络、配置覆盖等高级特性
services:                                  #开始定义服务
  nginx:                                   #定义服务名称
    container_name: nginx                  #定义容器名称
    hostname: nginx                        #定义内部主机名
    build:                                 #构建服务的镜像方式
      context: ./nginx                     #定义生成镜像的路径为当前目录下的nginx目录
      dockerfile: Dockerfile               #Dockerfile的相对路径
    ports:
      - 10000:80                           #将宿主机的10000端口映射到容器的80端口
      - 10001:443                          #将宿主机的10001端口映射到容器的443端口
    networks:                              #定义容器网络部分
      vae:                                 #定义容器加入的网络
        ipv4_address: 172.30.0.10          #定义容器IP地址为172.30.0.10
    volumes:                               #定义容器的挂载目录
      - ./html:/usr/local/nginx/html       #将当前目录下的html目录,挂载到nginx的站点目录
networks:                                  #添加自定义网络
  vae:                                     #网络名称为vae
    driver: bridge                         #定义网络类型为bridge
    ipam:                                  #IP地址管理配置
      config:
        - subnet: 172.30.0.0/16            #指定网络的子网掩码,用于自动分配或静态指定IP

4.执行命令生成镜像

[root@docker compose]#docker-compose -f docker-compose.yml up -d

-f    #指定需要加载的文件,如果不指定 -f,Docker Compose 默认查找同名文件
up    #创建与启动容器
-d    #以守护进程(detached)模式运行服务。命令会立即返回,而服务则在后台继续运行。
      #如果不加 -d,Docker Compose 会在当前终端会话中输出服务的日志

5.查看并访问镜像

四、多容器编排

可以通过Docker Compose进行多个容器编排,同时生成多个镜像与容器,让复杂的多服务应用部署变得简单而高效

(一)down删除

使用down选项,会停止并删除docker-compose.yml生成的所有容器,镜像等

删除镜像需要添加--rmi参数

删除数据卷:如果你想同时删除与服务关联的数据卷,可以使用 -v 或 --volumes 参数

指定镜像删除策略:如果你想在停止服务的同时删除镜像,可以使用 --rmi 参数。
它接受 'all' 或 'local' 作为值。例如,删除所有由当前服务使用的镜像

(二)编排多个容器

同时编辑生成nginx与tomcat两个容器,并直接做到动静分离

1.nginx配置

首先自定义nginx的配置文件

修改nginx的docker文件,使用ADD指令,将自定义的nginx文件复制到nginx服务的配置文件目录下,覆盖原配置文件,或者在docker-compose.yml文件中通过volumes指令,将配置文件挂载到容器当中,在此选择挂载的方式,将nginx.conf文件,挂载到nginx的配置文件目录下,实现持久化

其它信息与上述生成nginx镜像配置保持不变

2.tomcat配置

2.1 准备软件包

2.2 创建访问页面

2.3 编写Dockerfile文件


FROM centos:7
#表示新镜像是基于CentOS 7的基础镜像构建。
 
MAINTAINER this is tomcat <tomcat>
#指定镜像的作者和联系方式
 
ADD jdk-8u291-linux-x64.tar.gz /usr/local/:
#将本地名为jdk-8u291-linux-x64.tar.gz的Java开发工具包压缩包解压到容器内的/usr/local/目录下。
 
WORKDIR /usr/local/
#设置工作目录为/usr/local/。
 
RUN mv jdk1.8.0_291 /usr/local/java:
#将解压后的Java目录重命名为/usr/local/java,作为Java安装路径。
 
环境变量设置:
ENV JAVA_HOME /usr/local/java
#设置Java主目录环境变量。
ENV JRE_HOME ${JAVA_HOME}/jre
#设置Java运行时环境(JRE)目录环境变量。
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
#设置类路径环境变量,包含当前目录和其他Java库目录。
ENV PATH $JAVA_HOME/bin:$PATH
#把Java的bin目录添加到系统的PATH环境变量中,以便全局执行Java命令。
 
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
#将Apache Tomcat 9.0.16的tar.gz压缩包解压至/usr/local/目录。
 
WORKDIR /usr/local/
#再次确认工作目录为/usr/local/。
 
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
#将解压后的Tomcat文件夹重命名为/usr/local/tomcat,作为Tomcat的安装路径。
 
EXPOSE 8080、EXPOSE 8009 和 EXPOSE 8005:
#分别声明容器运行时需要对外开放的端口:
#8080(HTTP服务)、8009(AJP协议,通常用于反向代理)和8005(Tomcat的shutdown端口)。
 
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
#运行Tomcat的catalina.sh脚本并指定run命令,这将以非守护进程模式启动Tomcat。

3.编写docker-comppose.yml文件

version: "3"
services:
  nginx:
    container_name: nginx
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 10000:80
      - 10001:443
    networks:
      vae:
        ipv4_address: 172.30.0.10
    volumes:
      - ./html:/usr/local/nginx/html
      - ./nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
#将当前目录下的nginx目录下的nginx.conf挂载到/usr/local/nginx/conf/nginx.conf下,完成文件覆盖
  tomcat:                                  #定义服务名称
    container_name: tomcat                 #定义容器名称
    hostname: tomcat                       #定义内部主机名
    build:                                 #构建服务的镜像方式
      context: ./tomcat                    #定义生成镜像的路径为当前目录下的nginx目录
      dockerfile: Dockerfile               #Dockerfile的相对路径
    ports:
      - 8080:8080                          #将宿主机的8080端口映射到容器的8080端口
      - 8005:8005                          #将宿主机的8005端口映射到容器的8005端口
      - 8009:8009                          #将宿主机的8009端口映射到容器的8009端口
    networks:                              #定义容器网络部分
      vae:                                 #定义容器加入的网络
        ipv4_address: 172.30.0.20    #定义容器IP地址为172.30.0.20,与nginx代理地址一致
    volumes:
      - ./tomcat/index.jsp:/usr/local/tomcat/webapps/ROOT/index.jsp
#将当前目录下的tomcat目录下的index.jsp挂载到/usr/local/tomcat/webapps/ROOT/index.jsp下,完成文件覆盖
networks:
  vae:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16

4.执行命令生成镜像与容器

[root@docker compose]#docker-compose -f docker-compose.yml up -d

5.查看结果

使用curl或者浏览器访问,查看是否达到动静分离的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/593585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Meachines][Hard]Napper

Main $ nmap -p- -sC -sV 10.10.11.240 --min-rate 1000 $ curl http://10.10.11.240 $ gobuster dir -u "https://app.napper.htb" -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -k 博客 $ ffuf -c -w /usr/share/se…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层&#xff1a;构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章&#xff1a;模板语法基础 Django模板语法介绍 Django模…

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台&#xff0c;旨在处理大规模数据的存储和处理。它提供了分布式文件系统&#xff08;HDFS&#xff09;和分布式计算框架&#xff08;MapReduce&#xff09;&#xff0c;使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

【Java基础】15.脚本、编译、注解

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 文章目录 系列文章目录15.脚本、编译、注解15.1 Java的脚本机制15.1.1 获取脚本引擎15.1.2 脚本计算与绑定15.1.3 重定向输入和输出15.1.4 调用脚本的函数和方法15.1.5 编…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错&#xff0c;如何知道是 哪个 symbols 不对呢&#xff1f; 今天探索到下面的方法&#xff1a; 1、点击导航上方 最右侧的按钮&#xff0c;查看历史报错 2、选中报错信息&#xff0c;右键选择 Expand All Transcripts 在出现的详细信息面…

【ARM Cortex-M3指南】4:存储器系统

文章目录 四、存储器系统4.1 存储器系统特性概述4.2 存储器映射4.3 存储器访问属性4.4 默认的存储器访问权限4.5 位段操作4.5.1 位段操作的优势4.5.2 不同数据宽度的位段操作4.5.3 C程序实现位段操作 4.6 非对称传输4.7 排他访问4.8 端模式 四、存储器系统 4.1 存储器系统特性…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例&#xff1a;系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

【计算机科学速成课】笔记二

笔记一 文章目录 7.CPU阶段一&#xff1a;取指令阶段阶段二&#xff1a;解码阶段阶段三&#xff1a;执行阶段 8.指令和程序9.高级CPU设计——流水线与缓存 7.CPU CPU也叫中央处理器&#xff0c;下面我们要用ALU&#xff08;输入二进制&#xff0c;会执行计算&#xff09;、两种…

倪海厦(二)研究任何学问(东西)批判去看

大家好今天我们接着研究&#xff0c;倪海厦是如何思考问题的: 研究任何学问&#xff08;东西&#xff09;&#xff0c;批判去看&#xff0c;假设--验证--结果。以果决其行&#xff01;&#xff01;&#xff01;放空自己。学而后思&#xff0c;思学并进。 今天这一篇呢&#xf…

医疗器械软件相关的追溯关系

在医疗器械软件开发过程中&#xff0c;追溯性是确保产品质量和安全性的关键步骤之一。追溯性要求各个阶段的需求、设计、实现和测试之间能够清晰、连贯地关联起来&#xff0c;以便在整个开发周期中进行有效的跟踪和管理。IEC62304中明确输出的内容要有对应的追溯性&#xff0c;…

golang学习笔记(内存模型和分配机制)

操作系统的存储管理 虚拟内存管理 虚拟内存是一种内存管理技术&#xff0c;它允许操作系统为每个进程提供一个比实际物理内存更大的地址空间。这个地址空间被称为虚拟地址空间&#xff0c;而实际的物理内存则被称为物理地址空间。使用虚拟内存有以下几点好处&#xff1a; 内…

docker系列8:容器卷挂载(上)

目录 传送门 从安装redis说起 什么是容器卷挂载 操作系统的挂载 日志文件一般是"首恶元凶" 挂载命令 容器卷挂载 卷挂载命令 启动时挂载 查看挂载卷信息 容器卷管理 查看卷列表 创建容器卷 具名挂载与匿名挂载 具名挂载 传送门 docker系列1&#xff…

了解并学会使用反射

目录 一、反射的应用场景&#xff08;简单了解&#xff09; 二、反射的定义 三、关于反射的四个重要的类 四、反射的使用 1.Class获取一个class对象的方式 方式一&#xff1a;forName&#xff08;&#xff09;&#xff1a; 方式二&#xff1a;封装类.Class&#xff1a; …

天风证券:水电燃气价格上涨,能推动通胀么?

水电燃气价格上涨对PPI的影响更大&#xff0c;6%的平均价格上涨能够拉动CPI和PPI分别上涨0.3个和0.7个百分点。 近期&#xff0c;国内多地上调水电燃气价格 燃气价格上涨主要针对居民端。目前燃气价格实行居民用气价格限价波动非民用气市场化定价的双轨制&#xff0c;这使得居…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”&#xff08;Everything is a file&#xff09;&#xff0c;即将设备、文件等都当作“文件”处理。 “文件”主要类型有&#xff1a;目录&#xff08;即文件夹&#xff09;&#xff0c;链接文档&#xff08;即快捷方式…

【Linux线程】

目录 线程是操作系统的一个执行流并发编程进程并发的优劣基于线程的并发编程Linux当中的线程 线程的创建使用pthread_createpthread_join对线程进行等待pthread_exit和pthread_cancelpthread_detach线程分离注意事项 原生线程库&#xff0c;详谈Linux的线程pthread库管理线程 线…

云端部署Stirling PDF:构建个人App的API调用指南(附Python源码)

今天发现一个Github的开源项目&#xff0c;Stirling PDF&#xff0c;项目地址如下&#xff1a;https://gitcode.com/Stirling-Tools/Stirling-PDFhttps://gitcode.com/Stirling-Tools/Stirling-PDF?utm_sourceartical_gitcode目前CSDN上已经有好几个up主都介绍了这个项目&…

cocos=》 预乘、混合(黑边、白色)

简介 预乘&#xff0c;指的是在数据提交给GPU之前&#xff0c;就对纹理的RGB分量与alpha值进行计算。 预乘计算 结果颜色 源颜色值 目标颜色值 * (1 - 源 alpha 值) result source.RGB dest.RGB * (1 - source.A); 对应的颜色混合函数设置为 gl.blendFunc(gl.ONE, gl.…

英语复习之英语形近词总结

最近在练习英语口语&#xff0c;有很好的练习场景&#xff0c;和数字人对练&#xff0c;还能纠错&#xff0c;不过开口的基础需要单词量的支撑以及语法的熟悉&#xff0c;因为英语的语法太简单了&#xff0c;没啥需要复习和注意的&#xff0c;音标发音的问题也可以后期再纠正&a…