一.Docker Compose

1.作用:

简单来说是快速部署需要多个容器联合配合的应用

通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。

2.本质是个工具:

Docker Compose是一个需要在Docker主机上进行安装的外部Python工具。

二.工作流程:

注:

  • Docker Compose使用YAML文件来定义多服务的应用。

  • Docker Compose默认使用文件名docker-compose.yml 。可以使用-f 参数指定具体文件。

  • 首先编写定义多容器(多服务)应用的YAML文件

  • 然后将其交由docker-compose命令处理

  • 最后Docker Compose就会基于Docker引擎API完成应用的部署。

三.Compose文件

1.主干内容(一级Key)

**version:**总是位于文件的第一行,用来定义Compose文件格式(主要是API)的版本。

tip:version 并非定义Docker Compose或Docker引擎的版本号。

services:用于定义不同的应用服务,在他下面定义需要的应用服务(例如下面的就包裹了web-feredis两个)

  • 这会将每个服务部署在各自的容器中

**networks:**用于指引Docker创建新的网络

  • 默认情况下,Docker Compose会创建bridge 网络

  • 可以使用driver 属性来指定不同的网络类型(见下图)

    创建一个名为over-net 的Overlay网络,允许独立的容器(非托管容器)(standalone container)连接(attachable )到该网络上。

    networks:
      over-net:  <---网络的名字
      driver: overlay  <---网络的类型
      attachable: true <---暂时认为是让非托管容器连接到网络的设置
    

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


2.细说Compose文件(二级Key)

1,Docker Compose会将每个服务部署为一个容器,并且会使用key作为容器名字的一部分

  • key就是services下的二级标签,就是下面示例中的web-feredis
  • 因此Docker Compose会部署两个容器,一个容器的名字中会包含web-fe ,而另一个会包含redis 。

2,定义不同服务为同一网络名称,使它们连接到同一网络下,这样它们就可以通过名称解析到对方的地址,从而实现不同容器间的通信。(服务定义的网络都必须是已存在的,主干中设置好的)

  • 细看下面的web-feredis两个应用,它们的网络名称都定义为counter-net,因此它们可以互相通信。

        networks:
          - counter-net
    

示例Compose文件:

定义了两个服务,一个名为counter-net 的网络和一个名为counter-vol 的卷。

version: "3.5"
services:
  web-fe:
    build: .
    command: 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:

3.细说服务定义

以web-fe服务定义为例

**build:**指定Docker基于当前目录(. )下Dockerfile中定义的指令来构建一个新镜像。该镜像会被用于启动该服务的容器。

**command:**指定Docker在容器中执行名为app.py 的Python脚本作为主程序。因此镜像中必须包含app.py文件以及Python,这一点在Dockerfile中可以得到满足。

**ports:**端口映射参数;指定Docker将容器内(-target )的5000端口映射到主机(published )的5000端口。

**networks:**使得Docker可以将服务连接到指定的网络上(指定网络必须是已存在的)

**volumes:**指定Docker将counter-vol 卷(source: )挂载到容器内的/code (target: )

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

四.使用Docker Compose部署应用

  • 通过Compose文件定义的多容器应用称为“Compose应用”

1.启动命令

启动docker-compose应用的命令:docker-compose up

  • 默认情况下,会查找名为docker-compose.yml 或docker-compose.yaml 的Compose文件

  • 如果Compose文件是其他文件名,则需要通过-f 参数来指定。

    docker-compose -f demo.yml up
    
  • 使用-d 参数在后台启动应用也是常见的用法

    docker-compose up -d
    
  • 使用&参数可以将所有的日志直接输出到终端窗口

2.容器为以目录名称为前缀

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

例如下面的输出(此compose应用以counter-app为目录)

容器的名字:目录名 + 服务名 + 数字后缀

$ docker container ls
ID    COMMAND            STATUS     PORTS                    NAMES
12..  "python app.py"    Up 2 min   0.0.0.0:5000->5000/tcp   counterapp_web-fe_1
57..  "docker-entry.."   Up 2 min   6379/tcp                 counterapp_redis_1
最后修改:2023 年 11 月 26 日
如果觉得我的文章对你有用,请随意赞赏