为什么应用docker-compose

咱们学会了应用 dockerfile 构建 docker 镜像,看起来曾经可能满足咱们的日常需要了,无论须要什么环境,在 dockerfile 里逐渐构建,而后 build、run,就 ok 了,也满足了咱们docker 隔离性、疾速部署的要求,为什么还须要docker-compose呢?

咱们来看一个网站开发最常见的场景:咱们要有数据库,网站利用,nginx,互相配合才是残缺的环境。是的,咱们齐全能够以 ubuntu 为根底镜像,把这些一股脑全装进去,而后运行。然而这样有很多毛病,比方咱们每次都要从新装 mysql 而不是间接利用 mysql 官网的根底镜像,降级保护不不便;如果咱们的利用要扩大也很难,因为每个利用都连贯的本人外部的数据库,无奈共享数据;事实上,这种形式是典型的虚拟机的应用形式,不是 docker 的正确打开方式

docker 是轻量化的应用程序,docker 官网举荐每个 docker 容器中只运行一个过程,那么就是说,咱们须要别离为咱们的利用、数据库、nginx 创立独自的 docker 容器,而后别离启动它。设想一下,构建好 docker 之后,每次启动咱们的网站,都要至多 docker run 三次,是不是很繁琐?而且此时这几个 docker 是扩散独立的,很不方便管理。既然这几个 docker 都是为了同一个网站服务,是不是应该把它们放到一起?这就引出了 docker-compose 我的项目。

什么是docker-compose

docker-compose是 docker 官网的开源我的项目,应用 python 编写,实现上调用了 Docker 服务的 API 进行容器治理。其官网定义为为 「定义和运行多个 Docker 容器的利用(Defining and running multi-container Docker applications)),其实就是下面所讲的性能。

装置Docker-Compose

Docker Compose是一个用来定义和运行简单利用的Docker工具,一个应用Docker容器的利用,通常由多个容器组成。应用Docker Compose不再须要应用shell脚本来启动容器。

Compose 通过一个配置文件来治理多个Docker容器,在配置文件中,所有的容器通过services来定义,而后应用docker-compose脚本来启动,进行和重启利用,和利用中的服务以及所有依赖服务的容器,非常适合组合应用多个容器进行开发的场景。

查找最新版的docker-compose
到 https://github.com/docker/compose/releases/ 地址查找最新的docker-compose版本

装置docker-compose
下载最新版的docker-compose文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
测试装置后果
docker-compose --version

docker-compose概述

相似 docker 的Dockerfile文件,docker-compose应用 YAML 文件对容器进行治理。
相干概念
对于 docker-compose 有两个根本的概念:
  • 服务(service):一个利用容器,即 docker 容器,比方之前所说的mysql 容器、nginx 容器
  • 我的项目(project):由一组关联的利用容器组成的一个残缺业务单元,比方下面所讲的由 mysql、web app、nginx 容器组成的网站。docker-compose 面向我的项目进行治理。
YAML 文件格式
  1. 大小写敏感,缩进示意示意层级关系
  2. 缩进空格数不重要,雷同层级左侧对齐即可。(不容许应用 tab 缩进!)
  3. 由冒号分隔的键值对示意对象;一组连词线结尾的行,形成一个数组;字符串默认不应用引号
Compose和Docker兼容性
Docker Engine 与docker-compose version 之间的有以下关系
compose文件格式版本docker版本
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
31.13.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
21.10.0+
11.9.1.+

根本应用

接下来咱们应用 docker-compose 构建咱们的微服务以及mysql,并逐渐解说其应用。
筹备工作
在我的项目文件夹下创立 docker-compose.yml文件
cd /usr/local/docker-learn/ && touch docker-compose.yml && ll

编写配置文件
先在 docker-compose.yml 文件里增加如下代码,构建咱们的我的项目
version: '2'   services:    mysql:        image: mysql:5.7.33        hostname: mysql        container_name: mysql        restart: always        networks:            - learn-docker-network        volumes:            - "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"            - "/tmp/data/mysql:/var/lib/mysql"        environment:            MYSQL_ROOT_PASSWORD: 'root'    nacos:        image: nacos/nacos-server        hostname: nacos        container_name: nacos        restart: always        ports:            - "8848:8848"        networks:            - learn-docker-network        environment:            MODE: 'standalone'            JVM_XMS: '128m'            JVM_XMX: '128m'        learn-docker-web:        image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT        restart: always        networks:            - learn-docker-network        depends_on:            - nacos            - mysql        volumes:            - "/tmp/data/logs:/logs"    learn-docker-storage:        image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT        restart: always        networks:            - learn-docker-network        depends_on:            - nacos            - mysql        volumes:            - "/tmp/data/logs:/logs"    learn-docker-gateway:        image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT        restart: always        ports:            - "8888:8888"        networks:            - learn-docker-network        depends_on:            - nacos            - mysql        volumes:            - "/tmp/data/logs:/logs"networks:    learn-docker-network:        driver: bridge
运行测试
在我的项目的文件中执行docker-compose up -d命令就能够启动了
docker-compose up -d

微服务拜访测试
通过网关地址拜访测试微服务
curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool

参数解释(手册)

version
指定 docker-compose.yml 文件的写法格局

docker-compose.yml的version版本号应该和docker的版本进行匹配,如果不匹配可能呈现问题。

services
示意多个容器的汇合
服务对象

docker-compose.yml治理是以服务为单位治理的,一个services上面能够有多个服务,mysql,app都代表一个服务

image

image是指定服务的镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

hostname
配置容器的host名称,在容器的hosts文件中退出了映射

container_name

配置启动后的容器名称和docker的--name xxx成果是一样的

restart

restart参数可能使咱们在重启docker时,主动启动相干容器,和docker的--restart成果统一

Docker容器的重启策略如下

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,然而不思考在Docker守护过程启动时就曾经进行了的容器
ports
映射端口的标签,对外裸露的端口定义,和 expose 对应,和docker的-p成果统一
depends_on

这个是依赖配置的选项,意思是如果 服务启动是如果有依赖于其余服务的,先启动被依赖的服务,启动实现后在启动该服务

networks
配置容器所应用的网络
volumes
挂载一个目录或者一个已存在的数据卷容器,和docker -v成果统一
environment
配置环境变量,和docker的 -e成果统一

常用命令

docker-compose up
用于部署一个 Compose 利用

默认状况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件

,用户也能够应用 -f 指定其余文件名。通常状况下,会应用 -d 参数令利用在后盾启动。

docker-compose stop
进行 Compose 利用相干的所有容器,但不会删除它们。

被进行的利用能够很容易地通过 docker-compose restart 命令重新启动。

如果带有服务命则进行该服务 ,否则进行所有服务

docker-compose rm
用于删除已进行的 Compose 利用。

它会删除容器和网络,然而不会删除卷和镜像。

如果带有服务命则删除该服务 ,否则删除所有服务

docker-compose restart
重启已进行的 Compose 利用。

如果用户在进行该利用后对其进行了变更,那么变更的内容不会反映在重启后的利用中,这时须要重新部署利用使变更失效。

docker-compose ps
用于列出 Compose 利用中的各个容器。

输入内容包含以后状态、容器运行的命令以及网络端口。

docker-compose down
进行并删除运行中的 Compose 利用。

它会删除容器和网络,然而不会删除卷和镜像。

扩缩容

nacos查看集群状况
咱们能够查看nacos,查看当服务器集群的一个部署状况

扩容节点

咱们当初对learn-docker-storage节点进行扩容

语法格局:docker-compose up -d --scale 服务名=节点数

docker-compose up -d --scale learn-docker-storage=2

启动后查看nacos节点信息

缩容节点
和扩容一样指定节点数量就能够的
docker-compose up -d --scale learn-docker-storage=1

进行后后查看nacos节点信息

本文由传智教育博学谷 - 狂野架构师教研团队公布,转载请注明出处!

如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源