【Docker 系列】docker 学习九,Compose 内容编排官网初步体验

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Docker 系列】docker 学习九,Compose 内容编排官网初步体验

【Docker 系列】docker 学习九,Compose 内容编排官网初步体验

我们前面的文章学习了 docker ,为什么还要 Compose 呢?Compose到底是个啥玩意?

Docker Compose 可以来轻松的高效的管理容器,定义运行多个容器

咱们一起来看看官方的介绍 docs

Compose 是什么

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

讲了三个点:

  • Compose 可以定义和运行多个容器
  • 需要使用给到 YAML 配置文件
  • 单个命令就可以创建和启动所有的服务

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Docker Compose 可以运行在所有的环境中

Using Compose is basically a three-step process:

1、Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

2、Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

3、Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.

三个步骤:

  • 需要定义好 Dockerfile ,保证它在任何环境都能运行
  • 在 docker-compose.yml  文件中定义好 services,那么这个 yml 文件如何写呢?services 咋定义呢
  • 使用docker-compose binary启动项目

总结上述官方说明:

Docker Compose 用于批量容器编排

如果一个项目中的多个微服务(几十个或者几百个),我们都一个一个的使用 docker run是不是很傻?而且对于运维来说也是一个非常不友好的事情,优化这样的问题,我们有了 Docker Compose

Compose 在 Docker 中默认就有吗?

Docker 中默认是没有 Compose 的,Compose 是 Docker 官方的开源项目,我们使用 Compose  ,是需要自己另外安装的

Compose 的 yml 文件如何编写?

一起来看看官方文档的 yml 是怎样的结构:

A docker-compose.yml looks like this:


version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
  • services

指定服务

  • volumes

指定挂载卷

通过官方文档的上述说明,我们可以知道 Compose 有这么 2 个重要的概念:

  • services 服务,就是容器和相关的应用
  • 项目,就是一组关联的容器

Compose 安装

Docker Compose install

1、咱们选择在 linux 下面安装 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

安装成功后在我们的 linux 目录 /usr/local/bin/会有 docker-compose 程序

2、 给程序 docker-compose  加上可执行的权限


sudo chmod +x /usr/local/bin/docker-compose

3、安装成功,查看 docker-compose 的版本,看到如下信息即为成功

# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

Compose 官方案例体验

Docker Compose gettingstarted

咱们安装好了 docker-compose ,我们一起来体验一下官方的 例子,先会使用,再来研究

准备环境和代码

1、创建 compose 测试目录,自己可以在任意目录下执行如下指令


mkdir composetest
cd composetest

2、编写 app.py 文件

app.py


import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

该 py 文件的功能就是,注册了一个路由为 /,我们访问服务器的/时,程序会去读取 redis 的计数器,来确认这个网站是访问了第几次了

3、创建一个文件 requirements.txt,用于之后的安装

requirements.txt


flask
redis

创建 DockerFile 文件

写 Dockerfile 文件

Dockerfile

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

Dockerfile 文件中的含义是:

  • 基于 python:3.7-alpine 构建镜像
  • 设置工作目录为 /code
  • 设置 FLASK_APP 环境变量
  • 设置 FLASK_RUN_HOST 环境变量
  • 运行 apk add --no-cache gcc musl-dev linux-headers指令
  • 拷贝文件requirements.txt到容器中
  • 运行 pip 安装 requirements.txt 中的组件
  • 暴露 5000 端口
  • 拷贝 . 到 .
  • 执行 flask run 命令

定义 Compose 文件(yml文件)

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

这个 compose 文件定义了 2 个服务

  • web 服务,暴露的是 5000 端口
  • redis

构建和运行我们的 Compose

运行指令前,我们来查看一下我们的 compose 测试目录都有些啥了:

image.png

开始构建

docker-compose up

shell

复制代码

#docker-compose up

image.png

可以看到执行指令 docker-compose up之后, Compose 也是在一层一层的执行,并且我们可以看到 compose 是最先建立了一个自定义网络

Creating network "composetest_default"with the default driver

image.png

看到这里,我们发现 Compose 会自动帮我们创建 redis 容器和 web 容器

Creating composetest_web_1   ... done
Creating composetest_redis_1 ... done

image.png

最后,我们看到 Compose 帮我们将 redis 和 web 启动起来了,程序正常运行,

咱们在宿主机使用 curl 命令,来请求一下这个 web 服务

curl localhost:5000

image.png

果然 ok,官方的 compose 体验 no problem ,nice

查看一下镜像使用 docker images 查看一下镜像,发现多了 composetest_web,python,redis alpine 版本 ,这些也都是 compose 自动为我们做的,非常方便

image.png

查看一下网络

docker network ls

compose 构建的时候,一开始就会为我们创建一个网络

image.png

疑问?

细心的朋友发现了,我们的容器名字为什么是 composetest_web_1 , 和 composetest_redis_1

这个是 Docker Compose 里面的一种规则,便于标识对应的副本

例如,compose 里面对于容器会是这样的命名:

文件名_服务名_num

多个服务器集群的时候,这个 num 的作用就体现出来的,num 标识第几个副本

网络规则

多个容器只要是在一个局域网内,就可以互相 ping 通,相互通信,通过域名访问

例如 mysql 集群里面的服务,我们就可以访问 mysql:3306 , compose 就会给我们访问到 mysql:3306 这个服务

我们可以查看上面的 docker compose 给我们新建的自定义网络

docker network ls

image.png


# docker network inspect composetest_default
  ...
        "Containers": {
            "25b5814cfded10e00d2e59a8e17fcba670232bce135fdabd558b7c0530d011a4": {
                "Name": "composetest_web_1",
                "EndpointID": "cb131464ea9112403f851b14a37fa5c67b023f2ce28a1e85c409e3f284f78db4",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "e7fedce77d3759fefde5bef84c759a5c59e033a6f48850e5930825bfc8a8444c": {
                "Name": "composetest_redis_1",
                "EndpointID": "3af891f7d52cba7ec75eb01533af1d5dae4dcd0d8bf4c55e6b342075f971be22",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
       ...

发现上面的例子, web 服务和 redis 服务,是在同一个网络下的,所有可以相互通信

停止 compose

咱们可以使用 ctrl + c 停止 compose

也可以通过 docker-compose down停止 compose

停止 compose ,那么 compose 里面涉及的服务,全部都会停止掉

# docker-compose down
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done
Removing composetest_web_1   ... done
Removing composetest_redis_1 ... done
Removing network composetest_default
• 停止 composetest_web_1
• 停止 composetest_redis_1
• 删除 composetest_web_1
• 删除 composetest_redis_1
• 移除自定义网络 composetest_default

小结

  • 咱们使用 docker 镜像,通过 docker run 命令可以创建并启动容器
  • DockerFile 可以构建镜像,也就是将服务打包
  • docker-compose 可以启动项目,进行多个微服务的编排和在环境里面一键部署
  • Docker 网络,自定义网络

参考资料:

docker docs


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
130 77
|
5天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
57 24
|
7天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
70 6
|
1月前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
1月前
|
NoSQL Redis Docker
【赵渝强老师】使用Docker Compose管理容器
Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。
|
7月前
|
存储 机器学习/深度学习 中间件
快速上手 Elasticsearch:Docker Compose 部署详解
本文介绍了如何使用Docker Compose快速搭建Elasticsearch学习环境。Elasticsearch是一款用于实时搜索和分析的分布式中间件,适用于多种场景,如搜索、日志分析、机器学习等。首先,创建docker网络,拉取最新版8.12.2镜像。接着,编写docker-compose.yml文件,配置单节点集群,设置端口映射、内存限制及数据卷挂载。然后,创建并配置数据卷目录,允许远程访问和跨域。最后,启动服务并验证,通过浏览器访问确认服务运行正常。本文为初学者提供了一个简便的Elasticsearch部署方法。
881 4
快速上手 Elasticsearch:Docker Compose 部署详解
|
7月前
|
存储 数据可视化 数据安全/隐私保护
使用 Docker Compose 部署 Docker Registry
【1月更文挑战第2天】 在内网环境中,我们期望能够在本地共享镜像。为了解决这一问题,Docker Registry成为了我们的救星。Docker Registry是一个用于存储和管理Docker镜像的开源工具。通过在本地部署Docker Registry,您可以轻松地构建、存储和分享自己的Docker镜像。
425 3
使用 Docker Compose 部署 Docker Registry
|
7月前
|
Java Docker 微服务
如何使用Docker和Docker Compose部署微服务
【2月更文挑战第12天】
759 0
|
1月前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
56 1
|
1月前
|
前端开发 开发者 Docker
深入探索Docker Compose:简化多容器应用的部署
深入探索Docker Compose:简化多容器应用的部署
66 0