zoukankan      html  css  js  c++  java
  • Docker学习—Compose

    前言

     前面《Docker学习—DockerFile》文中介绍了dockerfile相关的语法,及使用方式;接下来了解docker三剑客之一的 Compose;接下来详细学习。

    一、docker-compose介绍

     Docker-Compose项目是Docker官方的开源项目,主要使用Python编写;用于定义和运行多容器Docker应用程序的工具。使用Compose,可以使用YAML文件来配置应用程序的服务。然后使用一个命令,从配置创建并启动所有服务。

     Compose是一个定位“定义和运行多个Docker容器应用的工具”,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。

     Compose中包含两个重要概念:

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

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

    二、docker-compose安装

     Compose目前已经完全支持Linux、Mac OS和Windows,在安装Compose之前,需要先安装Docker;(本篇主要在window中使用)

     安装成功后命令行中输入:docker compose -h  

     

    三、docker-compose 命令

     安装成功后来看下compose主要包含的命令:

      build              #生成或重建服务
      bundle             #从Compose文件生成Docker bundle
      config             #验证并查看撰写文件
      create             #创建服务
      down               #停止并删除容器、网络、镜像和卷
      events             #从容器接收实时事件
      exec               #在正在运行的容器中执行命令
      help               #获取命令帮助
      images             #显示镜像列表
      kill               #杀死容器
      logs               #查看容器的输出
      pause              #暂停服务
      port               #打印端口绑定的公共端口
      ps                 #显示容器列表
      pull               #拉取服务镜像
      push               #推送服务镜像
      restart            #重新启动服务
      rm                 #移除停止的容器
      run                #运行一次性命令
      scale              #设置服务的容器数
      start              #启动服务
      stop               #暂停服务
      top                #显示正在运行的进程
      unpause            #取消暂停服务
      up                 #创建并启动容器
      version            #显示Docker-Compose版本信息

     对命令有大概印象后,接下来就需要对重点内容(docker-compose.yml)了解;每个命令具体的使用参数在使用是具体介绍

    三、docker-compose.yml编写

     docker-compose.yml已有多个版本:如下

      首先我们先来看一个官方示例docker-compose.yml内容:

    version: "3.8"
    services:
    
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            max_replicas_per_node: 1
            constraints:
              - "node.role==manager"
    
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - "5000:80"
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
          restart_policy:
            condition: on-failure
    
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - "5001:80"
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      worker:
        image: dockersamples/examplevotingapp_worker
        networks:
          - frontend
          - backend
        deploy:
          mode: replicated
          replicas: 1
          labels: [APP=VOTING]
          restart_policy:
            condition: on-failure
            delay: 10s
            max_attempts: 3
            window: 120s
          placement:
            constraints:
              - "node.role==manager"
    
    networks:
      frontend:
      backend:
    
    volumes:
      db-data:

     根据以上示例格式可以看出docker-compose.yml中主要包含以下内容:

    • version: 指定当前docker-compose.yml的版本,版本与Docker Engine版本存在对应关系,如:v3.8对应 Docker Engine 19.03.0+
    • services:服务,可以定义业务需要的一些服务,每个服务可包含服务名称、使用镜像、挂载数据卷、使用的网络、依赖服务等信息
    • networks:应用的网络,可以定义网络名称、使用的网络类型等
    • volumes:数据卷,可以定义数据卷,然后挂载到不同的服务下使用

     接着就来看下相关命令的语法及具体含义

      

    docker-compose.yml命令
    序号 所属 命令 说明
    1 services build 基于Dockerfile,指定Dockerfile所在路径,Compose会利用它自动构建镜像,然后启动服务容器 
    2 cap_add,cap_drop 添加或删除容器功能
    3 command 覆盖容器启动后默认执行的命令
    4 config 使用“每服务配置”配置在每个服务的基础上授予对配置的访问权限。存在两种语法方式:短语法、长语法
    5 cgroup_parent 为容器指定一个可选的父cgroup
    6 container_name 容器名称
    7 depends_on 容器依赖,用于指定服务依赖的其他服务
    8 depoly

    指定与服务的部署和运行相关的配置。这只在使用docker stack deploy部署到一个群时生效,docker compose up和docker compose run将忽略此项。

    9 devices 设备映射列表。
    10 dns 自定义DNS服务器。可以是单个值或列表。
    11 dns_search 自定义DNS搜索域。可以是单个值或列表。
    12 entrypoint 覆盖默认入口点
    13 env_file 从文件添加环境变量。可以是单个值或列表
    14 environment 添加环境变量。可以使用数组或字典。任何布尔值(true、false、yes、no)都需要用引号括起来,以确保它们不会被YML解析器转换为true或false。
    15 expose 暴露端口而不将它们发布到主机-它们只能被链接的服务访问。只能指定内部端口。
    16 external_links 链接到在此范围之外docker-compose.yml甚至在Compose之外开始的容器,尤其是对于提供共享或公共服务的容器。 同时指定容器名称和链接别名()时,请external_links遵循与legacy选项相似的语义。
    17 extra_hosts 添加主机名映射。使用与docker客户端相同的值
    18 healthcheck 配置运行的检查以确定该服务的容器是否“健康”
    19 image 指定要从中启动容器的镜像。可以是存储库/标签或镜像ID
    20 init 在容器内运行一个初始化程序,以转发信号并获取进程。设置此选项可以true为服务启用此功能。 
    21 isolation 指定容器的隔离技术。在Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。
    22 labels 使用Docker标签将元数据添加到容器中。您可以使用数组或字典。
    23 links 链接到另一个服务中的容器。指定服务名称和链接别名("SERVICE:ALIAS"),或者仅指定服务名称。
    24 logging 服务的日志记录配置
    25 network_mode 网络模式。使用与客户端服务相同的网络名称和服务-参数docker相同。
    26 networks 要加入的网络,引用顶级网络键下的条目。
    27 pid 将PID模式设置为主机PID模式。这将打开容器和主机操作系统之间的PID地址空间共享。
    28 ports 暴露端口 
    29 restart no是默认的重启策略,在任何情况下都不会重启容器。当always指定时,容器总是重新启动。该 on-failure如果退出代码指示的故障错误政策重启的容器。unless-stopped总是重新启动容器,除非容器停止(手动或其他方式)。
    30 secrets 使用按服务secrets 配置,按服务授予对机密的访问权限。
    31 security_opt 覆盖每个容器的默认标签方案。
    32 stop_grace_period 指定在发送SIGKILL之前,如果容器不处理SIGTERM(或用stop_nusignal指定的任何停止信号),尝试停止该容器时要等待多长时间。默认10s
    33 stop_signal 设置停止容器的替代信号。默认情况下,stop使用SIGTERM。使用stop_signal设置替代信号会导致stop发送该信号。
    34 sysctls 要在容器中设置的内核参数。可以使用数组或字典。
    35 tmpfs 在容器内安装一个临时文件系统。可以是单个值或列表。 
    36 ulimits 覆盖容器的默认ulimit。您可以将单个限制指定为整数,也可以将软/硬限制指定为映射。
    37 userns_mode 如果Docker守护程序配置了用户名称空间,则禁用此服务的用户名称空间。
    38 volumes

    挂载主机路径或命名卷,指定为服务的子选项。可以将主机路径安装为单个服务的定义的一部分,而无需在顶级volumes中进行定义。

    但是,如果要在多个服务之间重用卷,请在顶级volumes密钥中定义一个命名卷。

    将命名卷与服务,群集和堆栈文件一起使用。

    39

    domainname, hostname, ipc, mac_address, privileged,

    read_only, shm_size, stdin_open, tty, user, working_dir

    其中每个都是一个值,类似于其 docker run对应项。
    40 Volumes dirver 指定该卷应使用哪个卷驱动程序。默认为Docker Engine配置为使用的任何驱动程序,大多数情况下为 local。
    41 dirver_opts 指定选项列表作为键值对,以传递给该卷的驱动程序。
    42 external 如果设置为true,则指定此卷是在Compose之外创建的。docker-compose up不会尝试创建它,如果不存在则引发错误。
    43 labels 使用Docker标签向容器添加元数据。可以使用数组或字典。
    44 name 为此卷设置一个自定义名称。名称字段可用于引用包含特殊字符的卷。
    45 Networks dirver 指定该网络应使用哪个驱动程序。
    46 dirver_opts 指定选项列表作为要传递给此网络的驱动程序的键值对
    47 attachable 仅当驱动程序设置为覆盖时使用。
    48 enable_ipv6 在此网络上启用IPv6网络。
    49 ipam 指定自定义IPAM配置
    50 internal 默认情况下,Docker还会连接一个网桥网络来提供外部连接。如果要创建外部隔离的覆盖网络,可以将此选项设置为true。
    51 labels 使用Docker标签将元数据添加到容器中 。您可以使用数组或字典。
    52 external 如果设置为true,则指定此网络是在Compose之外创建的。docker-compose up不会尝试创建它,如果不存在则引发错误。
    53 name 为此网络设置一个自定义名称。名称字段可用于引用包含特殊字符的网络。

       通过以上内容发现,services中相关命令是docker相关配置项关联;接下来就来验证通过docker-compose.yml运行应用 

    四、应用案例

     实现效果:基于身份认证时,相关示例代码实现,通过docker-compose启动相关所有服务容器,运行程序。

     A、在解决方案目录下添加docker-compose.yml文件:

     添加方式:

     1、手动添加文件

     2、通过vs自动添加:选中需要添加项目右键,如图

     添加后如下:

     B、修改内容如下:(该docker-compose.yml比较简单)

    version: '3.4'
    
    services:
      cz.identityserver:
        image: ${DOCKER_REGISTRY-}czidentityserver
        build:
          context: .
          dockerfile: cz.IdentityServer/Dockerfile
    
      cz.api.order:
        image: ${DOCKER_REGISTRY-}czapiorder
        build:
          context: .
          dockerfile: cz.Api.Order/Dockerfile
    
    
      cz.api.goods:
        image: ${DOCKER_REGISTRY-}czapigoods
        build:
          context: .
          dockerfile: cz.Api.Goods/Dockerfile
    
    
      cz.mvcclient:
        image: ${DOCKER_REGISTRY-}czmvcclient
        build:
          context: .
          dockerfile: cz.MVCClient/Dockerfile

     C、执行命令docker-compose up命令:执行完成看到以下输出,则编译启动完成。

      

      D、在docker管理页面中查看如下:

      

    后续:

     本篇内容先对docker-compose内容进行了相关介绍,下面将对Swarm、Machine、K8S 进行应用学习。

    参考:

      https://docs.docker.com/compose/

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

  • 相关阅读:
    this指向问题
    原生js实现的金山打字小游戏(实例代码详解)
    js实现点赞效果
    .net core部署到linux可能碰到的问题
    Linux curl命令详解 Web程序
    用十年来学编程
    JAVA的字符串拼接与性能
    PHP学习的技巧和学习的要素总结
    php实现验证邮箱格式的代码实例
    PHP页面中文乱码处理办法
  • 原文地址:https://www.cnblogs.com/cwsheng/p/13944281.html
Copyright © 2011-2022 走看看