关于golang:Docker-系列docker-学习九Compose-内容编排官网初步体验

34次阅读

共计 5572 个字符,预计需要花费 14 分钟才能阅读完成。

【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 测试目录都有些啥了:

开始构建

docker-compose up

#docker-compose up

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

Creating network "composetest_default" with the default driver

看到这里,咱们发现 Compose 会主动帮咱们创立 redis 容器和 web 容器

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

最初,咱们看到 Compose 帮咱们将 redis 和 web 启动起来了,程序失常运行,

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

curl localhost:5000

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

查看一下镜像
应用 docker images 查看一下镜像,发现多了 composetest_web,python,redis alpine 版本,这些也都是 compose 主动为咱们做的,十分不便

查看一下网络

docker network ls

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

疑难?

仔细的敌人发现了,咱们的容器名字为什么是 composetest_web_1,和 composetest_redis_1

这个是 Docker Compose 外面的一种规定,便于标识对应的正本

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

文件名_服务名_num

多个服务器集群的时候,这个 num 的作用就体现进去的,num 标识第几个正本

网络规定

多个容器只有是在一个局域网内,就能够相互 ping 通,互相通信,通过域名拜访

例如 mysql 集群外面的服务,咱们就能够拜访 mysql:3306,compose 就会给咱们拜访到 mysql:3306 这个服务

咱们能够查看下面的 docker compose 给咱们新建的自定义网络

docker network ls

# 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

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

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

正文完
 0