【Docker 开发者学习篇】Docker Compose 编排微服务

2020/03/12

Docker 开发者学习篇】Docker Compose 编排微服务

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。

使用Dockerfile(或Maven)构建镜像,然后使用docker命令操作容器,例如docker run、docker kill等。实际场景应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例。如果每个微服务都要手动启停,那么效率之低、维护量之大可想而知。

Docker Compose 简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

其代码目前在 https://github.com/docker/compose 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装 Compose

1. 通过以下命令自动下载并安装适应系统版本的Compose:

sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.为安装脚本添加执行权限:

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

3.测试 Compose 是否安装成功

docker-compose --version

Docker-compose 基本使用

使用Compose大致有3个步骤:

  • 使用Dockerfile(或其他方式)定义应用程序环境,以便在任何地方重现该环境。
  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的 环境中一起运行。
  • 运行docker-composeup命令,启动并运行整个应用程序。

在上一个章节 sentinel 文件下, 通过 Dockerfile 运行容器,再次升级,如下

新建目录 sentinel ,创建名为 Dockerfile 的文件,并将下载的 jar 包放入该文件夹。

[root@localhost home]# mkdir sentinel
[root@localhost home]# cd sentinel
[root@localhost sentinel]# touch Dockerfile

Dockerfile 中添加以下内容:

# 基于 openjdk 镜像
FROM openjdk:8-alpine
# 作者信息
MAINTAINER  mtcarpenter<dreamlixc@163.com>
# 复制文件到容器,
ADD sentinel-dashboard.jar app.jar
# 启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

sentinel 文件下 创建 docker-compose.yml,在其中添加如下内容:

version: '3'
services:
  sentinel: # 指定服务器名称
    build: . # 指定Docker 所在路径
    ports:
      - "8080:8080"  # 指定端口映射,类似 docker run -p

在docker-compose.yml所在路径执行以下命令:

docker-compose up # docker-compose up -d 后台运行

运行成功 访问 ip:8080 ,出现 sentinel 控制台。

docker-compose.yml 模板文件常用命令说明

docker-compose.yml是Compose的默认模板文件。该文件有多种格式,例如Version 1file format、Version 2 file format、Version 2.1 file format、Version 3 file format等。其中,Version 1 file format将逐步被弃用,Version 2.x及Version 3.x基本兼容。

build:配置构建时的选项,Compose会利用它自动构建镜像。build的值可以是一个路径

version: '3'
services:
  sentinel: # 指定服务器名称
    build: . # 指定Docker 所在路径

也可以是一个对象

version: "3"
services:
  sentinel:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod
  • context:上下文路径。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。

command:覆盖容器启动后默认执行的命令

command: bundle  exec  thin -p  3000

也可以是一个list,类似Dockerfile中的CMD指令,格式如下:

command: ["bundle", "exec", "thin", "-p", "3000"]

expose:暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机。

expose:
 - "3000"
 - "8080"

注意:不建议使用该指令。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

image:指定镜像名称或镜像ID,如果本地不存在该镜像,Compose会尝试下载该镜像。

  redis:
    image: "redis:alpine"

dokcer-compose 命令

docker-compose命令也有很多选项。下面来详细探讨docker-compose的常用命令。

build

构建或重新构建服务。服务被构建后将以project_service的形式标记,例如 composetest_db 。

help

查看指定命令的帮助文档,该命令非常实用。docker-compose所有命令的帮助文档都可通过该命令查看。

示例:

[root@localhost sentinel]#docker-compose help command
[root@localhost sentinel]#docker-compose help build # 查看build 相关命令

kill

通过发送SIGKILL信号停止指定服务的容器。

示例:

[root@localhost sentinel]#docker-compose kill sentinel

logs

查看服务的日志输出。

示例:

[root@localhost sentinel]#docker-compose logs

port

打印绑定的公共端口。

示例:

[root@localhost sentinel]# docker-compose port sentinel 8080
0.0.0.0:8080

这样就可输出sentinel服务8080端口所绑定的公共端口。

ps

列出所有容器。

示例:

[root@localhost sentinel]# docker-compose ps
       Name                Command         State           Ports
-------------------------------------------------------------------------
sentinel_sentinel_1   java -jar /app.jar   Up      0.0.0.0:8080->8080/tcp
[root@localhost sentinel]# docker-compose ps sentinel

pull

下载服务镜像。

rm

rm:删除指定服务的容器。

示例:

[root@localhost sentinel]# docker-compose rm sentinel

run

在一个服务上执行一个命令。

示例:

[root@localhost sentinel]# docker-compose run web bash

这样即可启动一个web服务,同时执行bash命令。

start

启动指定服务已存在的容器。

示例:

[root@localhost sentinel]# docker-compose start sentinel

stop

停止已运行的容器。

示例:

[root@localhost sentinel]# docker-compose stop sentinel

停止后,可使用docker-compose start再次启动这些容器。

up

构建、创建、重新创建、启动,连接服务的相关容器。所有连接的服务都会启动,除非它们已经运行。 docker-compose up命令会聚合所有容器的输出,当命令退出时,所有容器都会停止。 使用docker-compose up-d可在后台启动并运行所有容器。

选项:

  • -d 在后台运行服务容器。
  • --no-color 不使用颜色来区分不同的服务的控制台输出。
  • --no-deps 不启动服务所链接的容器。
  • --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
  • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
  • --no-build 不自动构建缺失的服务镜像。
  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

文章参考

  • https://docs.docker.com/compose/compose-file/

  • https://www.runoob.com/docker/docker-compose.html

代码示例

更多系列文章请访问下面查看仓库:


微信扫描二维码,关注一个有故事的程序员

(转载本站文章请注明作者和出处 山间木匠-mtcarpenter

Post Directory

扫码关注公众号:山间木匠
发送 290992
即可立即永久解锁本站全部文章