Docker-compose单机容器集群编排

传统的容器管理:Dockerfile文件 -> 手动执行 docker build 一个个镜像的构建 -> 手动执行 docker run 一个个容器的创建和启动

容器编排管理:Dockerfile文件 -> 在docker-compose.yml配置模板文件里定义容器启动参数和依赖关系 -> 执行docker-compose命令指定配置模板文件,根据模板文件的配置一键完成所有镜像的构建和容器的创建启动

一、Compose概述

1、Compose的相关概念

Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、容器端口映射等情况写在一个配置文件里,执行docker-compose up命令就像执行脚本一样,一个一个的安装并部署容器。

本质上就是在yaml格式的docker-compose配置模板文件里定义一个或多个服务及其容器的启动参数和依赖关系,并使用docker-compose命令根据配置模板文件中的参数来启动和管理容器。

 2、docker-compose的作用

docker镜像管理的问题 
  1. 需要多次使用Dockerfile Build Image或者DockerHub拉取Image;

  2. 需要创建多个Container,多次编写启动命令;

  3. Container互相依赖,如何进行管理和编排;

当我们服务数量增多的时候,上面三个问题就会更加的被放大,如果这三个问题不解决,其实从虚拟机到容器化除了机器减少一些浪费以外,好像没有更多的变化。Docker有没有什么好的方法,可以让我们通过一个配置就搞定容器编排和运行呢?这个时候Docker Compose就站出来了。

Docker Compose的解决方案
  1. 提供工具用于定义和运行多个docker容器应用;
  2. 使用yaml文件来配置应用服务(docker-compse.yml);
  3. 可以通过一个简单的命令docker-compse up可以按照依赖关系启动所有服务;
  4. 可以通过一个简单的命令docker-compose down停止所有服务;
  5. 当一个服务需要的时候,可以很简单地通过--scale进行扩容;

3、Compose的特征 

1、多容器管理

Compose 可以通过一个单一的 YAML 文件来定义和管理多个容器。这个文件中描述了所有的服务、网络和存储卷,使得应用的部署和管理变得简单且一致。

 2、环境隔离

Compose 可以在不同的环境中运行相同的应用配置,比如开发、测试和生产环境。通过使用不同的 Compose 文件或覆盖文件,可以轻松切换环境。

3、网络配置

Compose 可以轻松地配置服务之间的网络连接。每个服务可以自动连接到一个默认的网络,或者连接到用户定义的网络。这使得服务之间的通信变得简单和直观。

4、数据卷管理

Compose 支持定义数据卷,并在多个服务之间共享数据卷。这使得持久化数据的管理更加方便,并且可以确保数据在容器重启或重新创建时不会丢失。

5、服务扩展

可以通过简单的命令扩展服务的实例数量。例如,可以通过 docker-compose up --scale web=3 命令来扩展 web 服务的实例数量为 3 个,以便进行负载均衡和高可用部署。

6、与 Docker 集成

Compose 与 Docker 深度集成,可以使用 Docker 的所有特性和功能。通过 Compose,可以方便地管理容器的生命周期、监控容器状态、查看日志和调试容器。

7、一致的开发环境

Compose 可以帮助开发者在本地创建一个与生产环境一致的开发环境。这样,开发者可以在本地测试和调试代码,确保在生产环境中能够正常运行。

4、docker-compose的三大概念:

  • 项目project
  • 服务service
  • 容器container

项目project -> 包含一个或多个服务service -> 包含容器container的镜像、端口映射、数据卷、环境变量、依赖关系等启动参数

  • 默认使用项目的目录名作为project的项目名,也支持使用 -p 或 --project-name 选项指定项目名称。
     
  • 项目目录里要包含一个docker-compose配置模板文件,默认为docker-compose.yml,也支持使用 -f 或 --file 选项指定项目的配置模板文件。
  • 在配置模板文件里要包含一个或多个服务及其容器的配置,每个服务要包含容器的名称、镜像、映射端口、数据卷、网络模式、依赖关系等容器的启动参数。 

5、Docker Compose 常用命令

image      使用本地镜像或从仓库拉取镜像创建容器
build使用dockerfile现场构建镜像创建容器
context指定dockerfile文件所在的目录路径
dockerfile指定dockerfile文件名
command设置容器的启动命令,会覆盖镜像中的CMD指令
container_name  设置容器名   --name 
environment设置环境变量  -e  -env  
networks  设置容器使用的自定义网络和IP  --ip
network_mode设置容器的网络模式  --network
ports设置容器端口映射  -p
volumes设置数据卷挂载   -v
volumes_from设置数据卷容器挂载,版本3不支持  --volumes-from
hostname  设置容器主机名   -h  --hostname
sysctls  设置容器的内核参数  --sysctl
links     设置容器互联   --link
privileged设置容器拥有root权限  --privileged
restart  设置容器重启策略   --restart
depends_on  设置容器的依赖关系

二、compose 部署

 1. Docker Compose 环境安装

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

#下载
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version

2、YAML 文件格式及编写注意事项

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json 数据描述语言,语法比 json 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。

(1)使用 YAML 时需要注意事项

●大小写敏感
●通过缩进表示层级关系
●不支持制表符 tab 键缩进,只能使用空格缩进
●缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
●用 # 号注释
●符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠 - 
●如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思

(2)yaml文件格式

yaml格式文件: 文件名以 .yaml .yml 为后缀,用空格缩进表示字段的层级关系,特点:可读性高,易于管理。

#一级字段
key1: value1              #一个key只有一个值,值的类型为 纯量
key2: 
- value1                        #一个key有多个值的纵向格式,值的类型为 列表
- value2
key3: ["value1", "value2"]      #一个key有多个值的横向格式,值的类型为 数组
key4:#二级字段subkey1: value1               #用 空格缩进 表示字段的层级关系,同一层字段要靠左对齐subkey2:value2subkey3:                      #key的值也是键值对,值的类型为 对象#三级字段sskey1: value1sskey2: value2

三、Docker-compose 搭建LNMP

1、准备依赖文件

2、配置nginx的Dockerfile文件 

mkdir lnmp
cd lnmp
mkdir nginx mysql phpvim /opt/lnmp/nginx/Dockerfile
FROM centos:7
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
ADD nginx-1.22.0.tar.gz /usr/local/src/
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.22.0
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
COPY nginx.conf /usr/local/nginx/conf/
ADD wordpress-6.4.2-zh_CN.tar.gz /usr/local/nginx/html
RUN chmod -R 777 /usr/local/nginx/html
EXPOSE 80
VOLUME ["/usr/local/nginx/html/"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

3、配置mysql的Dockerfile

vim /opt/lnmp/mysql/Dockerfile
FROM centos:7
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j 4 && make install
COPY my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql && chown mysql:mysql /etc/my.cnf
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data && cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ && systemctl enable mysqld
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
VOLUME ["/usr/local/mysql"]
ENTRYPOINT ["/usr/sbin/init"]

4、部署php的Dockerfile

vim /opt/lnmp/php/Dockerfile
FROM centos:7
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel && useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j 4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
COPY php.ini /usr/local/php/lib
COPY php-fpm.conf /usr/local/php/etc/
COPY www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT ["/usr/local/php/sbin/php-fpm","-F"]

5、编辑yml文件 

cd /opt
mkdir compose
cd compose/
mkdir lnmp-compose
cd lnmp-compose/
touch docker-compose.yml
mkdir nginx mysql php
cd nginx
将所需要的软件包移到该目录下
/opt/compose/lnmp-compose
vim docker-compose.yml
version: "3"
services:web:build:context: ./nginx/dockerfile: Dockerfilecontainer_name: nginxports:- 80:80volumes:- ./nginx/html:/usr/local/nginx/htmlnetworks:mynetwork:ipv4_address: 172.18.0.10db:image: mysql:lnmpcontainer_name: mysqlprivileged: truevolumes:- db-data:/usr/local/mysqlnetworks:mynetwork:ipv4_address: 172.18.0.20php:image: php:lnnmpcontainer_name: phpports:- 9000:9000volumes:- db-data:/usr/local/mysql- ./nginx/html:/usr/local/nginx/htmlnetworks:mynetwork:ipv4_address: 172.18.0.30depends_on:- web- db
networks:mynetwork:driver: bridgeipam:config:- subnet: 172.18.0.0/16volumes:db-data:docker-compose -f docker-compose.yml up -d

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团队高效地使用 Git 进行协同开发

1. 确定工作流程 选择一种合适的 Git 工作流程,如 Git Flow、GitHub Flow 或 GitLab Flow。这里我们以 Git Flow 为例: main 分支:用于生产环境的稳定版本。develop 分支:用于整合所有开发者的功能分支,进行集成测试…

集合的扩展性:通过设计模式增强集合功能

引言 在软件开发中,集合是管理数据集合的常用数据结构。Java集合框架提供了丰富的集合类,但有时这些集合类可能无法满足特定需求。幸运的是,我们可以通过设计模式扩展集合的功能,使其更加强大和灵活。本文将探讨如何通过装饰者模式等设计模式扩展集合的功能,并提供详细的…

使用[Flags]和按位操作符优化C#枚举处理

在C#开发中,我们经常会遇到需要检查多个枚举值的情况。为了使代码更加简洁和可读,我们可以利用[Flags]特性和按位操作符来简化枚举值的比较 public enum EnumShapeType {None 0,PointType,LineType,CircleType,BoxType,RectangleType,SphereType,CutFe…

Android EDLA项目 5G热点打开失败分析

Android EDLA项目 5G热点打开失败分析 文章目录 一、前言二、EDLA 打开5G热点的分析和实现1、现象(1) 已原生Settings设置打开5G热点(关闭拓展性开关)(2)设置band2,channel36 的5G热点信息打开热…

PlantUML-UML 绘图工具安装、Graphviz安装、本地使用/在线使用、语法、图示案例

文章目录 前言本地安装vscode安装插件下载安装Graphviz配置Graphviz环境变量测试 在线使用演示PlantUML语法总结活动图(新语法)时序图类图用例图其他图 更多相关内容可查看 前言 本篇提供两种使用方式分别为 在线使用地址1:https://www.pla…

在安卓手机上原生运行docker

前言 之前的文章(香橙派5plus上跑云手机方案一 redroid(带硬件加速))在Ubuntu的docker里运行安卓,这里说下怎么在安卓手机下运行docker,测试也可以跑Ubuntu。 想在手机上运行docker想的不是一天两天了,其实很久之前就有这个想法了&#xff…

Docker网络模式和Cgroup资源限制

目录 1、Docker网络 (1)Docker网络实现原理 查看容器的输出和日志信息 2、Docker 的网络模式 查看docker列表 (1)网络模式详解 1)host模式 2)container模式 3)none模式 4)br…

SpringCloud教程 | 第十篇: 读取Nacos的配置

1、nacos服务器选用 2、test.yaml这一个DataId配置如下: config:name: aabb222 spring:application:name: testdatasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/hmblogs?useUni…

MongoDB教程(十二):MongoDB数据库索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MongoD…

openGauss学习笔记-311 openGauss 数据迁移-MySQL迁移-MySQL语法兼容性评估工具

文章目录 openGauss学习笔记-311 openGauss 数据迁移-MySQL迁移-MySQL语法兼容性评估工具311.1 代码获取311.2 编译插件311.3 运行311.4 举例311.4.1 case 1:311.4.2 case 2:311.4.3 case 3:311.5 结果311.6 原理openGauss学习笔记-311 openGauss 数据迁移-MySQL迁移-MySQL语法…

【鸿蒙OS】【ArkUI】鸿蒙OS UI布局适配终极攻略

鸿蒙OS UI布局适配终极攻略 像素适配大法,此方法也适合Android ArkUI为开发者提供4种像素单位,框架采用vp为基准数据单位。 vp相当于Android里的dp fp相当于Android里的sp 官方是如何定义的呢,如下图 今天我来教大家如何用PX做到ArkUI的终级适配&…

Leetcode 2011. 执行操作后的变量值

问题描述: 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言: X 和 X 使变量 X 的值 加 1--X 和 X-- 使变量 X 的值 减 1 最初,X 的值是 0 给你一个字符串数组 operations ,这是由操作组成的一个列表,返回执行所有…

慢SQL分析和优化

慢SQL查询优化是一个多方面的过程,涉及SQL语句本身、数据库表结构、索引设计、硬件性能以及数据库配置等多个层面。下面我将详细介绍慢SQL优化的一般步骤: 捕获慢查询 开启慢查询日志:在MySQL中,可以通过设置slow_query_log和lon…

electron 应用的生命周期

Electron应用的生命周期涵盖了从应用启动到关闭的各个阶段,以及在这些阶段中发生的一系列事件。了解这些生命周期事件对于开发Electron应用至关重要,因为它们允许开发者在应用的不同阶段执行特定的操作,如创建窗口、处理文件打开请求、执行清理工作等。以下是对Electron应用…

C++初学者指南-5.标准库(第一部分)--标准库算法介绍

C初学者指南-5.标准库(第一部分)–标准库算法介绍 文章目录 C初学者指南-5.标准库(第一部分)--标准库算法介绍C的标准算法是:第一个示例组织输入范围自定义可调用参数并行执行(C17)迭代器和范围的类别错误消息命名空间std::ranges中的算法 (C20)算法参数图标相关内容…

Unity Editor 小工具集合(持续更新)

1.LOD批量设置 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class LODModelSet : EditorWindow {public GameObject rootObj;public GameObject lowAndMiddleRootObj;public float highLevel, middleLevel, lo…

C++ 库管理工具 vpkg Conan CMake pip

vcpkg 微软开发的跨平台库管理器,支持 Windows、Linux 和 macOS。vcpkg 提供了大量预编译的库,可以轻松集成到 C 项目中。 vcpkg安装配置visualstudio git clone https://github.com/microsoft/vcpkg.git cd vcpkg && bootstrap-vcpkg.batvcp…

树莓派使用蓝牙设置wifi网络

[外链图片转存中…(img-BteK79oW-1721104143862)] 在树莓派使用过程中,很多人都有遇到过这样的问题,经常由于工作场所变化,在无显示器和鼠标的情况下无法方便快捷对树莓派设置wifi网络。 在物联网场景下,成熟的方案是使用蓝牙为设备设置网络,在本教程中,我想向您展示一…

linux 安装 RocketMQ 4.7

安装介绍 Centos 7RocketMQ 4.7JDK 1.8 (安装JDK参考)RocketMQ的官网地址: http://rocketmq.apache.orgGithub地址是 https://github.com/apach e/rocketmq 安装操作 下载RocketMQ RocketMQ运行版本下载地址: Rocketmq-all-4.7.1-bin-release.zip …

httpx,一个网络请求的 Python 新宠儿

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 一个简单的库,也许能够开启我们的智慧之门, 一个普通的方法,也许能在危急时刻挽救我们于水深火热, 一个新颖的思维方式,也许能…