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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 记录一下在Hyper-v中动态磁盘在Ubuntu中不完全用到的问题(扩展根目录)
  • 41 QOS技术(服务质量)
  • <数据集>光伏板缺陷检测数据集<目标检测>
  • 双非一本嵌入式方向怎么学?
  • 逻辑门的题目怎么做?
  • 探索.NET内存之海:垃圾回收的艺术与实践
  • MongoDB教程(九):java集成mongoDB
  • 4. docker镜像、Dockerfile
  • 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍
  • 设计模式第一天|了解设计模式、设计模式七大原则
  • HTML+JS+CSS计算练习
  • Go语言并发编程-Context上下文
  • 开始构建我们自己的大语言模型:数据处理部分
  • 「豆包Marscode体验官」 | 云端 IDE 启动 Rust 体验
  • <数据集>木材缺陷检测数据集<目标检测>
  • 【Leetcode】101. 对称二叉树
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript 基础知识 - 入门篇(一)
  • Laravel 菜鸟晋级之路
  • Python - 闭包Closure
  • quasar-framework cnodejs社区
  • Spark学习笔记之相关记录
  • Spring-boot 启动时碰到的错误
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端相关框架总和
  • 强力优化Rancher k8s中国区的使用体验
  • 深入浏览器事件循环的本质
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信小程序开发问题汇总
  • 为视图添加丝滑的水波纹
  • nb
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • MyCAT水平分库
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #pragma multi_compile #pragma shader_feature
  • #每天一道面试题# 什么是MySQL的回表查询
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (day 12)JavaScript学习笔记(数组3)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (javaweb)Http协议
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (八十八)VFL语言初步 - 实现布局
  • (二)WCF的Binding模型
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十六)Flask之蓝图
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)