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

小白到运维工程师自学之路 第六十五集 (docker-compose)

一、概述

Docker Compose 的前身是 Fig,它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系(link, 网络容器 -net-from 或数据容器 -volume-from)按先后顺序启动所定义的容器。

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

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

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

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

3、运行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

三、原理

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来编排部署LNMP服务来更好的理解它。

四、编排部署 (需要安装docker-ce)

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

 

mkdir compose_lnmp/
cd compose_lnmp/
需要提前准备配置文件tar包
tree

 

vim docker-compose.yml    编写yml文件
version: '3'
services:nginx:hostname: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 80:80networks:- lnmpvolumes:- ./wwwroot:/usr/local/nginx/htmlphp:hostname: phpbuild:context: ./phpdockerfile: Dockerfileports:- 9000:9000networks:- lnmpvolumes:- ./wwwroot:/usr/local/nginx/htmlmysql:hostname: mysqlimage: mysql:5.6ports:- 3306:3306networks:- lnmpvolumes:- ./mysql/conf:/etc/mysql/conf.d- ./mysql/data:/var/lib/mysqlcommand: --character-set-server=utf8environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: wordpressMYSQL_USER: userMYSQL_PASSWORD: user123networks:lnmp:

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;

3、networks:

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

 

docker-compose -f docker-compose.yml up -d
docker-compose ps

 安装过程太长了(最后只要出现了这些字段就ok了)

 测试(能直接访问php就成功了)

 以上就是docker-compos的基础操作

如有错误欢迎各位大佬批评指正,我们共同进步

http://www.lryc.cn/news/108265.html

相关文章:

  • 量子机器学习
  • WEB集群——tomcat
  • Vulnhub: blogger:1靶机
  • 老版MFC工程迁移到VC2019编译EXE太大的问题
  • Curve深陷安全事件,OKLink如何破局
  • 2023华数杯数学建模思路A题B题C题模型代码分析
  • el-table合并单元格
  • html5设置不缓存
  • kotlin 的函数参数
  • 谈谈 Kafka 的幂等性 Producer
  • Doris(三)-集群部署3个FE+3个BE
  • js沙箱逃逸
  • 振弦传感器信号转换器应用山体滑坡安全监测
  • Moonbeam新增强大的互操作性功能至波卡生态
  • 考研408 | 【计算机网络】概述
  • 一道名题-(csp 儒略日)的心得与技巧
  • 单元测试之- mock工具mockito
  • 03 线程间共享数据
  • 题目:2264.找到一个数字的 K 美丽度
  • 分布式ID性能评测:CosId VS 美团 Leaf
  • MySQL数据库安装(二)
  • 通过MySQL删除Hive元数据信息
  • 在电脑如何翻译文件名称并同时保存原文件名和新文件名称
  • Modbus协议简介与常用测试指令说明
  • EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?
  • kubernetes 集群利用 efk 收集容器日志
  • 安防视频监控汇聚平台EasyCVR在移动端火狐浏览器中云台显示的优化
  • selenium官文文档阅读总结(day 3)
  • 【pandas百炼成钢】数据预览与预处理
  • 怎么查到企业的供应商和客户?