如何使用 Docker-Compose 组合项目

以下的内容主要是简单记录以下docker-compose的使用,具体的内容可以看《深入浅出Docker》这本书

除了编写许多命令之外,还有一种更简单的方法来管理多容器项目,该工具被称为 Docker Compose。

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

尽管 Compose 可在所有环境中使用,但它更专注于开发和测试。完全不建议在生产环境上使用 Compose。

Docker Compose仍然是一个需要在Docker主机上进行安装的外部Python工具。使用它时,首先编写定义多容器(多服务)应用的YAML文件,然后将其交由docker-compose命令处理,Docker Compose就会基于Docker引擎API完成应用的部署。

使用Docker Compose部署应用——详解

● 安装Docker Compose。
● Compose文件。
● 使用Docker Compose部署应用。
● 使用Docker Compose管理应用。

在Linux上安装Docker Compose

在Linux上安装Docker Compose分为两步。

首先使用curl命令下载二进制文件,然后使用chmod命令将其置为可运行。

Docker Compose在Linux上的使用,同样需要先安装有Docker引擎。

如下命令会下载1.18.0版本的Docker Compose到/usr/bin/local。请在GitHub上查找想安装的版本,并替换URL中的1.18.0。
在这里插入图片描述
下载docker-compose二进制文件后,使用如下命令使其可执行。
在这里插入图片描述
检查安装情况以及版本
在这里插入图片描述
Compose文件
Docker Compose默认使用文件名docker-compose.yml。当然,用户也可以使用-f参数指定具体文件。

如下是一个简单的Compose文件的示例,它定义了一个包含两个服务(web-fe和redis)的小型Flask应用。这是一个能够对访问者进行计数并将其保存到Redis的简单的Web服务。本书中将其命名为counter-app,并将其作为后续章节的示例应用程序。

version:3.5
services:
  web-fe:
    build:
    comand: python app. py
    ports:
     - target: 5000
      published: 5000
    networks :
     - counter-net
    volumes :
     - type: volume
       source: counter-vol
       target: /code
redis:
  image: "redis:alpine"
  networks:
    counter-net:
networks:
 counter-net:
volumes:
 counter-vol:

粗略观察文件的基本结构,首先可以注意到,它包含4个一级key:version、services、networks、volumes。

version是必须指定的,而且总是位于文件的第一行。它定义了Compose文件格式(主要是API)的版本。建议使用最新版本。

注意,version并非定义Docker Compose或Docker引擎的版本号。如果希望了解关于Docker引擎、Docker Compose以及Compose文件之间的版本兼容性信息,请搜索“Compose file versions and upgrading”。

本章中Compose文件将使用版本3及以上的版本

services用于定义不同的应用服务。上边的例子定义了两个服务:一个名为web-fe的Web前端服务以及一个名为redis的内存数据库服务。Docker Compose会将每个服务部署在各自的容器中。networks用于指引Docker创建新的网络。默认情况下,Docker Compose会创建bridge网络。这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用driver属性来指定不同的网络类型。下面的代码可以用来创建一个名为over-net的Overlay网络,允许独立的容器(standalone container)连接(attachable)到该网络上。

networks用于指引Docker创建新的网络。默认情况下,Docker Compose会创建bridge网络。这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用driver属性来指定不同的网络类型。

下面的代码可以用来创建一个名为over-net的Overlay网络,允许独立的容器(standalone container)连接(attachable)到该网络上。

networks :
  over-net:
  driver: overlay
  attachable: true

volumes用于指引Docker来创建新的卷。

分析示例中的Compose文件

上面例子中的 Compose 文件使用的是 v3.5 版本的格式,定义了两个服务,一个名为counter-net的网络和一个名为counter-vol的卷。更多的信息在services中,下面仔细分析一下。Compose文件中的services部分定义了两个二级key:web-fe和redis。它们各自定义了一个应用程序服务。需要明确的是,Docker Compose会将每个服务部署为一个容器,并且会使用key作为容器名字的一部分。本例中定义了两个key:web-fe和redis。因此Docker Compose会部署两个容器,一个容器的名字中会包含web-fe,而另一个会包含redis。

web-fe的服务定义中,包含如下指令。
● build:.指定Docker基于当前目录(.)下Dockerfile中定义的指令来构建一个新镜像。该镜像会被用于启动该服务的容器。
● command:python app.py指定Docker在容器中执行名为app.py的Python脚本作为主程序。因此镜像中必须包含app.py文件以及Python,这一点在Dockerfile中可以得到满足。
● ports:指定Docker将容器内(-target)的5000端口映射到主机(published)的5000端口。这意味着发送到Docker主机5000端口的流量会被转发到容器的5000端口。容器中的应用监听端口5000。
● networks:使得Docker可以将服务连接到指定的网络上。这个网络应该是已经存在的,或者是在networks一级key中定义的网络。对于Overlay网络来说,它还需要定义一个attachable标志,这样独立的容器才可以连接上它(这时Docker Compose会部署独立的容器而不是Docker服务)。
● volumes:指定Docker将counter-vol卷(source:)挂载到容器内的/code(target:)。counter-vol卷应该是已存在的,或者是在文件下方的volumes一级key中定义的。

综上,Docker Compose会调用Docker来为web-fe服务部署一个独立的容器。该容器基于与Compose文件位于同一目录下的Dockerfile构建的镜像。基于该镜像启动的容器会运行app.py作为其主程序,将5000端口暴露给宿主机,连接到counter-net网络上,并挂载一个卷到/code。

redis服务的定义相对比较简单。
● image: redis:alpine使得Docker可以基于redis:alpine镜像启动一个独立的名为redis的容器。这个镜像会被从Docker Hub上拉取下来。
● networks:配置redis容器连接到counter-net网络。由于两个服务都连接到counter-net网络,因此它们可以通过名称解析到对方的地址。了解这一点很重要,本例中上层应用被配置为通过名称与Redis服务通信。

使用Docker Compose部署应用

Compose 文件中定义的应用。可以从原书作者的GitHub主页中的counter-app下载所需的文件。。该目录包含所需的所有文件,可以作为构建上下文。Docker Compose会使用目录名(counter-app)作为项目名称,这一点在后续的操作中会看到,Docker Compose 会将所有的资源名称中加上前缀counter-app_。

介绍这几个文件。● app.py是应用程序代码(一个Python Flask应用)。
● docker-compose.yml是Compose文件,其中定义了Docker如何部署应用。
● Dockerfile定义了如何构建web-fe服务所使用的镜像。
● requirements.txt列出了应用所依赖的Python包。请根据需要自行查看文件内容。app.py显然是应用的核心文件,而docker-compose.yml文件将应用的所有组件组织起来。下面使用Docker Compose将应用启动起来。以下所有的命令都是运行在counter-app目录下的。

$ docker compose up &

常用的启动一个Compose应用(通过Compose文件定义的多容器应用称为“Compose应用”)的方式就是docker-compose up命令。它会构建所需的镜像,创建网络和卷,并启动容器。

默认情况下,docker-compose up会查找名为docker-compose.yml或docker-compose.yaml的Compose文件。如果Compose文件是其他文件名,则需要通过-f参数来指定。如下命令会基于名为prod-equus-bass.yml的Compose文件部署应用。

$ docker compose —f prod equus—bass. yml up

使用-d参数在后台启动应用也是常见的用法

前面的示例命令在前台启动应用(没有使用-d参数),但是使用了&将终端窗口返回。这种用法不太正规,所有的日志还是会直接输出到我们后续可能会用的终端窗口上

这样应用就构建并启动起来了,可以直接使用docker命令来查看Docker Compose创建的镜像、容器、网络和卷。
在这里插入图片描述
可以看到有3个在部署过程中构建或拉取的镜像。

counterapp_web-fe:latest镜像源自docker-compose.yml文件中的build: .指令。该指令让Docker基于当前目录下的Dockerfile来构建一个新的镜像。该镜像基于python:3.4-alpine构建,其中包含Python Flask Web应用的程序代码。

在这里插入图片描述

如下命令列出了两个容器。每个容器的名称都以项目名称(所在目录名称)为前缀。此外,它们还都以一个数字为后缀用于标识容器实例序号——因为Docker Compose允许扩缩容。

在这里插入图片描述
counterapp_web-fe容器中运行的是应用的Web前端。其中执行的是app.py,并且被映射到了Docker主机的5000端口,稍后会进行连接。

如下的网络和卷列表显示了名为counterapp_counter-net的网络和名为counterapp_counter-vol的卷。

在这里插入图片描述
应用部署成功后,可以用Docker主机的浏览器连接5000端口来查看应用的运行效果

使用Docker Compose部署应用——命令
● 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应用。它会删除容器和网络,但是不会删除卷和镜像。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值