美文网首页
【Docker 系列】docker 学习九,Compose 内容

【Docker 系列】docker 学习九,Compose 内容

作者: 阿兵云原生 | 来源:发表于2021-12-03 22:33 被阅读0次

    我们前面的文章学习了 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 Dockerfileso it can be reproduced anywhere.

    2、Define the services that make up your app in docker-compose.ymlso 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

    开始构建

    docker-compose up

    #docker-compose up
    
    image

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

    Creating network "composetest_default" with the default driver
    
    image

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

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

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

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

    curl localhost:5000
    
    image

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

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

    image

    查看一下网络

    docker network ls

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

    image

    疑问?

    细心的朋友发现了,我们的容器名字为什么是 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
    # 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

    好了,本次就到这里

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

    我是小魔童哪吒,欢迎点赞关注收藏,下次见~

    相关文章

      网友评论

          本文标题:【Docker 系列】docker 学习九,Compose 内容

          本文链接:https://www.haomeiwen.com/subject/ltnmxrtx.html