Docker-Compose编排与部署(lnmp实例)

news2024/11/16 7:30:21

第四阶段

时  间:2023年8月3日

参加人:全班人员

内  容:

Docker-Compose编排与部署

目录

一、Docker Compose

(一)概述

(二)Compose适用于所有环境:

(三)docker-compose官方文档:

(四)Compose的优点:

(五)编排和部署

二、Compose原理

三、Compose应用案例

(一)安装docker-ce(Linux安装Docker)

(二)安装docker-compose

(三)docker-compose用法

(四)docker-compose 常用选项:

(五)docker-compose常用命令:

四、yaml简介

五、安装docker compose部署lnmp

(一)目录结构:

(二)编写compose文件:


一、Docker Compose

(一)概述

        Docker Compose 的前身是 Fig,它是一个定义及运行多个 Docker 容器的工具。

        可以使用YAML文件来配置应用程序的服务。

        然后,使用单个命令,您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系(link, 网络容器 -net-from 或数据容器 -volume-from)按先后顺序启动所定义的容器。

        Compose 是 Docker 的服务编排工具,主要用来构建基于 Docker 的复杂应用,Compose 通过一个配置文件来管理多个 Docker 容器,非常适合组合使用多个容器进行开发的场景。

(二)Compose适用于所有环境:

生产,开发,测试以及CI工作流程。使用Compose基本上是一个三步过程:

        使用Dockerfile定义应用程序的环境,以便在任何地方进行复制。

        在docker-compose.yml中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。

        运行docker-compose开始并运行整个应用程序。

(三)docker-compose官方文档:

Docker Compose overview | Docker Documentation

 

        docker-compose 是用来做docker 的多容器控制,有了 docker-compose 你可以把所有繁复的 docker 操作全都用一条命令自动化完成。

        从上图可以看到,这位compose非常开心的把N多个容器抓在一起,根据自己的心情来编排部署。

        Docker对于运维或开发者来说,Docker最大的优点在于它提供了一种全新的发布机制。这种发布机制,指的是我们使用Docker镜像作为统一的软件制品载体,使用Docker容器提供独立的软件运行上下文环境,使用Docker Hub提供镜像统一协作,最重要的是该机制使用Dockerfile定义容器内部行为和容器关键属性来支撑软件运行。

        Dockerfile作为整个机制的核心。在Dockerfile中不但能够定义使用者在容器中需要进行的操作,而且能够定义容器中运行软件需要的配置,于是软件开发和运维终于能够在一个配置文件上达成统一。

        运维人员使用同一个Dockerfile能在不同的场合下“重现”与开发者环境中一模一样的运行单元(Docker容器)出来。

(四)Compose的优点:

先来了解一下我们平时是怎么样使用docker的?把它进行拆分一下:

        1、docker search 镜像,是不是先查找一个镜像;

        2、docker run -itd 镜像名称 ,然后在运行这个镜像;

        3、然后如果你要在运行第二个镜像、第三个镜像.....等等,你是不是又要docker search、docker run运行。

        上面“ docker run -itd 镜像名称 ”这只是最小的动作,如果你要映射硬盘,设置nat网络或者映射端口等等。就要做更多的 docker 操作,这显然是非常没有效率的,况且如果你要大规模部署,是不是觉得就很麻烦了。

        但是我们写在docker-compose里面就很好了。你只需要写好后只运行一句:

docker-compose up -d

(五)编排和部署

        编排,即orchestration,它根据被部署的对象之间的耦合关系,以及被部署对象环境的依赖,制定部署流程中各个动作的执行顺序,部署过程所需要的依赖文件的存储位置和获取方式,以及如何验证部署成功。这些信息都会在编排工具中以指定的格式(比如配置文件或者特定的代码)来要求运维人员定义并保存起来,从而保证这个流程能够随时在全新的环境中可靠有序地重现出来。

        部署,即deployment,它是指按照编排所指定的内容和流程 ,在目标机器上执行编排指定环境初始化,存放指定的依赖和文件,运行指定的部署动作,最终按照编排中的规则来确认联署成功。

这么来解释吧,编排是一个指挥家,他的大脑里存储了整个乐曲的演奏流程,对于每一个小节每一段音乐的演奏方式、开始、结束他都了然于胸;部署就是整个乐队,他们严格按照指挥家的意图用乐器来完成乐谱的执行,在需要时开始演奏,又在适当的时机停止演奏。最终,两者通过协作就能把每一位演奏者独立的演奏通过组合、重叠、衔接来形成高品位的交响乐。

二、Compose原理

        docker-compose的调用过程扁平的像一张纸,仅用一张简单的模块图就足够解释明白,如下图所示:

        首先,用户执行的docker-compose up -d指令调用了命令行中的启动方法。功能很简单明了,一个docker-compose.yml定义了一个docker-compose的project,docker-compose操作提供的命令行参数则作为这个project的启动参数交由project模块去处理。

        其次,如果当前宿主机已经存在与该应用对应的容器,docker-compose将进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose就会执行service模块的容器重启方法,否则就将直接启动已有容器。

        这两种操作的区别在于前者会停止旧的容器,创建启动新的容器,并把旧容器移除掉。在这个过程中创建容器的各项定义参数都是从docker-compose up 指令和docker-compose.yml中传入的。

        接下来,启动容器的方法也很简洁,这个方法中完成了一个Docker容器启动所需的主要参数的封装,并在container模块执行启动。该方法所支持的参数我想大多数朋友过是有所了解的。

        最后,container模块会调用docker-py客户端执行向Docker daemon发起创建容器的POST请求,再往后就是Docker处理的范畴了,相信看过我这篇文章 Docker:架构拆解请的朋友就明白了。

三、Compose应用案例

        为了能够说明compose如何实现上述编排与部署的原理,下面和大家分享一个通过compose来编排部署LNMP服务来更好的理解它。

(一)安装docker-ce(Linux安装Docker

CentOS系统下安装Docker可以有两种方式:

一种是使用curl获得Docker的安装脚本进行安装,

另一种是使用YUM仓库来安装Docker。主要注意的是目前Docker只能支持64位系统。

1、安装前准备:

[root@huyang1 ~]# iptables -F

[root@huyang1 ~]# setenforce 0

[root@huyang1 ~]# systemctl stop firewalld

保证可以访问互联网

[root@huyang1 ~]# ping www.baidu.com

[root@huyang1 ~]# ls /etc/yum.repos.d/

[root@huyang1 yum.repos.d]# yum clean all && yum makecache fast

2、安装docker-ce

[root@huyang1 ~]# wget -O

/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@huyang1 ~]# yum -y install yum-utils

device-mapper-persistent-data lvm2

[root@huyang1 ~]# yum-config-manager --add-repo

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@huyang1 ~]# ls /etc/yum.repos.d/

[root@huyang1 ~]# yum -y install docker-ce

[root@huyang1 ~]# docker version  查看版本

[root@huyang1 ~]# systemctl start docker

[root@huyang1 ~]# systemctl enable docker

3、阿里云镜像加速器

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

[root@huyang1 ~]# cat << END > /etc/docker/daemon.json

{   "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]

}

END

[root@huyang1 ~]# systemctl daemon-reload

[root@huyang1 ~]# systemctl restart docker

[root@huyang1 ~]# docker version

(二)安装docker-compose

下载最新版本安装,下载时间可能比较长

[root@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

[root@compose ~]# chmod +x

/usr/local/bin/docker-compose

[root@compose ~]# docker-compose --version

(三)docker-compose用法

docker-compose  [-f <arg>...] [options] [COMMAND] [ARGS...]

(四)docker-compose 常用选项:

--verbose 输出更多调试信息。

--version 打印版本并退出。

-f, --file FILE 使用特定的 compose 模板文件,默认为docker-compose.yml。

-p, --project-name NAME 指定项目名称,默认使用目录名称。

(五)docker-compose常用命令:

build  构建或重建服务

kill    杀掉容器

logs   显示容器的输出内容

port   打印绑定的开放端口

ps    显示容器

pull   拉取服务镜像

restart  重启服务

rm   删除停止的容器

run   运行一个一次性命令

scale  设置服务的容器数目

exec  切换到容器内

start  开启服务

stop  停止服务

up   创建并启动容器

其实这些常用命令用docker的命令功能是一样的。

四、yaml简介

        YAML是一种标记语言,可读性很强。类似于XML数据描述语言,语法比XML简单的多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分割,数组用括号括起来,hash用花括号括起来。

YAML文件格式注意事项:

        在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);

        通常开头缩进2个空格;

        字符的后面缩进1个空格,比如冒号、逗号、横杆;

        支持#注释;

        允许在文件中加入选择性的空行,以增加可读性;

docker-compose中YAML常用的字段:

五、安装docker compose部署lnmp

(一)目录结构:

[root@compose ~]# mkdir compose_lnmp/

[root@compose ~]# cd compose_lnmp/

[root@compose compose_lnmp]# tree

(二)编写compose文件:

[root@compose compose_lnmp]# cat docker-compose.yml

配置如下:

version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    ports:
      - 9000:9000
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: user123

networks:
  lnmp:

        可以看到一份标准配置文件应该包含 version、services、networks 三大部分,共有三级标签,每一级都是缩进两个空格。

下面来详细说明一下里面的内容:

(一)version: '3'  这是定义compose的版本号为version 3,可以参考官方文档详细了解具体有哪些版本 Overview | Docker Documentation

(二)services:

nginx:这是services下面的二级标签,名字用户自己定义,它将是服务运行后的名称;
  hostname: nginx 这是定义容器的主机名,将写入到/etc/hostname中;

build:

context: ./nginx 指定nginx服务的上下文路径;

dockerfile:Dockerfile 指定通过上面指定路径中的Dockerilfe来构建;

ports:

 - 80:80 端口映射没什么好说的;

networks:

 -lnmp 指定的网络环境
volumes:把宿主机的/wwwroot目录绑定到容器中的/usr/local/nginx/html目录;

php:这个二级标签服务和下面的内容跟nginx差不多;

mysql:这个二级标签服务也和nginx、php差不多,唯一不同的是多了个images标签、还有定义了些环境变量。

image: mysql:5.6 它是通过mysql:5.6镜像来构建mysql服务器,前面nginx、php都指定了上下文通过Dockerfile来构建的。

environment:

   MYSQL_ROOT_PASSWORD:定义root用户密码变量为123456;

   MYSQL_DATABASE:定义了数据变量为wordpress;

   MYSQL_USER:定义了普通用户变量为user;

   MYSQL_PASSWORD:定义了普通用户密码变量为user123;

(三)networks:

   lnmp: 相当于执行docker network create lnmp命令了;

最后来运行docker-compose命令来启动:

[root@localhost ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7

[root@localhost ~]# docker images centos:7

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

[root@localhost compose_lnmp]# docker-compose ps

验证LNMP环境 

客户端使用浏览器验证 docker-compose 创建的 lnmp 环境

 

PS:如果访问报 Access denined.,手动进入 nginx 容器添加读权限。

        docker-compose解决的问题局限在“编排”二字,甚至连“部署”范畴都涉足甚少,而在一个能够服务于大众的云平台中,编排与部署也仅仅是其中的一个组成部分而已。

来一起分析一下它的局限制会有哪些:

        docker-compse是面向单宿主机部署的,这是一种部署能力的欠缺。在更多的场合下,管理员需要面对大量物理服务器(或者虚拟机),这时如果要实现基于docker-compose的容器自动化编排与部署,管理员就得借助成熟的自动化运维工具(ansible、puppet、chef、saltstack)来负责管理多个目标主机,将docker-compose所需的所有资源(配置文件、用户代码)交给目标主机,然后在目标主机上执行docker-compose指令。

        同样网络和存储也比较棘手,Docker不能提供跨宿主机的网络,完全面向Docker daemon的docker-compose当然也不支持。这意味着管理员必须部署一套类似于Open vSwich的独立网络工具,而且管理员还需要完成集成工作。当好不容易把容器编排都安排妥当之后,又会发现容器还处在内网环境中,于是负载均衡、服务发现等一堆问题就面临而来了,这些问题很快能消耗掉工程师所有的耐心。

        那么,是否有一种能够提供完善的面向服务器集群的Docker编排和部署方案呢?Docker官方给出的答案是Compose同Machine和Swarm联动,其实还有大家近期经常听到了kubernetes(k8s)。

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

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

相关文章

数据结构基础4:带头指针双向。

一.基本概念&#xff1a; 一.基本结构&#xff1a; 1.逻辑结构&#xff1a; 二.结构体的基本组成。 和单链表非常大的区别就是函数不需要传二级指针&#xff0c;因为头不存有效数据。头节点不需要改变。 二.功能接口的实现 0.创建一个新的节点 //创建新的节点ListNode* buy…

【C++】BSTree 模拟笔记

文章目录 概念插入和删除非递归实现中的问题递归中的引用简化相关OJ复习直达 概念 由下面二叉搜索树的性质可以知道&#xff0c;中序遍历它便可以得到一个升序序列&#xff0c;查找效率高&#xff0c;小于往左找&#xff0c;大于往右走。最多查找高度次&#xff0c;走到到空&am…

黑马头条 各种踩坑合集 从0到1 欢迎留言提问

《黑马头条》SpringBootSpringCloud Nacos等企业级微服务架构项目_黑马头条项目_软工菜鸡的博客-CSDN博客 Day01 用他的 centos镜像 自动集成了 nacos 所有的配置 大部分都要改mysql密码啥的&#xff1b; 启动他的项目&#xff0c;有些时候要启动 redis 容器&#xff1b;镜像里…

超详细|ChatGPT论文润色教程

本文讲述使用中科大开源ChatGPT论文辅助工具&#xff0c;对论文进行润色 祝看到本教程的小伙伴们都完成论文&#xff0c;顺利毕业。 可以加QQ群交流&#xff0c;一群&#xff1a; 123589938 第一章 介绍 今天给大家分享一款非常不错的ChatGPT论文辅助工具&#xff0c;使用了专…

谁是全球最小ARM MCU?

先是从百度上查找的&#xff0c;找了半天&#xff0c;也找到了一部分。 大小基本在一二毫米左右&#xff0c;外设有多有少&#xff0c;但是好多都买不到货。 而且有些特别小众&#xff0c;开发环境压根没接触过。 然后去外面找了一下&#xff0c;竟然有好几个提到了HC32L110&am…

Ubuntu20.04安装踩坑记录---千万不要随便使用sudo rm -rf命令!!!

趁着从服务器下载之前备份内容的这段时间&#xff0c;写一下这阶段安装系统和配置深度学习环境的踩坑路程。作为一周之内重装7次系统的我是懂得怎么把系统搞崩溃的&#xff0c;这不必须记录一下&#xff01;&#xff01;&#xff01; 系统 ubuntu20.04 硬件 dell…

(树) 剑指 Offer 33. 二叉搜索树的后序遍历序列 ——【Leetcode每日一题】

❓剑指 Offer 33. 二叉搜索树的后序遍历序列 难度&#xff1a;中等 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1…

调用feign返回错误的数据

bug描述&#xff1a; 在一个请求方法中会调用到feign去获取其他的数据。 List<Demo> list aaaFeignApi.getData(personSelectGetParam);在调用的时候&#xff0c;打断点到feign的地方&#xff0c;数据是存在的&#xff0c;并且有15条。但是返回到上面代码的时候数据就…

0139 数据链路层1

目录 3.数据链路层 3.1数据链路层的功能 3.2组帧 3.3差错控制 3.4流量控制与可靠传输机制 3.5介质访问控制 部分习题 3.数据链路层 3.1数据链路层的功能 3.2组帧 3.3差错控制 3.4流量控制与可靠传输机制 3.5介质访问控制 部分习题 1.数据链路层协议的功能不包括&…

webpack基础知识二:说说webpack的构建流程?

一、运行流程 webpack 的运行流程是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会广播事件&#xff0c;插件只需要监听它所关心的事件&#xff0c;就能加入到这条webpack机制中&#xff0c;去改变webpack的运作&#xff0c;使得整个系统扩展…

[C++项目] Boost文档 站内搜索引擎(3): 建立文档及其关键字的正排 倒排索引、jieba库的安装与使用...

之前的两篇文章: 第一篇文章介绍了本项目的背景, 获取了Boost库文档 &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…第二篇文章 分析实现了parser模块. 此模块的作用是 对所有文档html文件, 进行清理并汇总 &#x1fae6;[C项目] …

【JS】浏览器不同窗口、标签页或 iframe之间的通讯 - 技术的尽头是魔术

效果 左上↖地址: http://127.0.0.1:5500/index.html 左下↙地址: http://127.0.0.1:5500/index.html?hidden 右上↗地址: http://127.0.0.1:5500/index.html?hidden 右下↘地址: http://127.0.0.1:5500/index.html?hidden index.html <!DOCTYPE html> <html>…

【antd之tabs踩坑篇】Tabs有items时切换不起作用

<TabsdefaultActiveKey"1"tabPosition{mode}style{{ height: 220 }}items{new Array(30).fill(null).map((_, i) > {const id String(i);return {label: Tab-${id},key: id,disabled: i 28,children: Content of tab ${id},};})}/>官网上如果tabs有很多it…

jmeter使用:解决压测时获取token问题

在执行压测过程中&#xff0c;首先要执行登录接口来获取token。如果并发数比较大只需要一个用户的登录token&#xff0c;可以使用setup线程组。如果是模拟多个用户登录获取token&#xff0c;需要使用仅一次控制器。 一、添加setup thread group前置线程 1.在并发量比较高的情况…

代码随想录算法训练营day53

文章目录 Day53 最长公共子序列题目思路代码 不相交的线题目思路代码 最大子序和题目思路代码 Day53 最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度…

最新AWVS 支持Windows/Linux

最新AWVS15.7.230603143 支持Windows/Linux 现只需要运行bat、sh脚本就可以一键破解。 修改hosts文件&#xff08;C:\Windows\System32\drivers\etc\hosts&#xff09; 127.0.0.1 updates.acunetix.com127.0.0.1 erp.acunetix.com127.0.0.1 bxss.me127.0.0.1 te…

【Linux命令200例】whereis用于搜索以及定位二进制文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

网站是如何进行访问的?在浏览器地址栏输入网址并回车的一瞬间到页面能够展示回来,经历了什么?

这个问题是检验web和计网学习程度的经典问题。 网站访问流程&#xff1a; 1.域名->ip地址 1) 在输入完一个域名之后&#xff0c;首先是检查浏览器自身的DNS缓存是否有相应IP地址映射&#xff0c;如果没有对应的解析记录&#xff0c;浏览器会查找本机的hosts配置文件&…

【Clion 2】使用技巧

一、TODO: 说明&#xff1a; 有时需要标记部分代码以供将来参考&#xff1a; 优化和改进的领域、可能的更改、要讨论的问题等等。 支持&#xff1a; TODO和FIXME小写和大写。这些模式可以在任何受支持的文件类型的行注释和块注释内使用。 创建TODO项 在要添加注释的代码行中…

数据中心这个隐藏技巧,你一定要掌握!

在数字化时代&#xff0c;数据中心成为现代社会不可或缺的基础设施&#xff0c;它们承载着海量数据的存储、处理和传输&#xff0c;为各行各业的运营提供着坚实的支持。 然而&#xff0c;数据中心的稳定性和可靠性对于确保持续性运营至关重要。在数据中心中&#xff0c;蓄电池系…