docker compose快速开始

docker compose快速开始

一、什么是docker compose

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

docker-compose是基于docker的开源项目,托管于github上,由python实现,调用 docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,来定义一组相关的容器来为一个项目服务。

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

快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器按照指定顺序进行启动。

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。
这里涉及2个重要的概念:

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

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

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

1. Compose 特性

在单独的主机上提供多个相互隔离的环境

Compose 用项目名称来隔离不同的环境,在没有设置项目名称的情况下,Compose 会用 docker-compose.yml 文件所在根目录名称做为项目名称。

每个项目有自己的 Docker network,不同项目的 Docker network 彼此不通。

扫描二维码关注公众号,回复: 14198114 查看本文章

在单个主机上建立多个隔离环境,Compose 使用项目名称将环境彼此隔离。您可以在多个不同的上下文中使用此项目名称。默认项目名称是项目目录的基本名称。您可以使用-p 命令行选项或 COMPOSE_PROJECT_NAME 环境变量设置自定义项目名称 。默认项目目录是 Compose 文件的基本目录。可以使用–project-directory 命令行选项自定义项目目录。

在创建容器时,自动保存 volume 数据

Compose 在启动容器时,会自动保存 volume。当我们用 docker-compose down 删掉容器后,再用 docker-compose up 启动时,之前 volume 会自动挂载到新建的容器中。

只重建有改动的容器

当 docker-compose.yml 中的某个容器有改动时,用 Compose 重启项目,改动的容器会重新生成,没有改动的容器则保持不变。

仅重新创建已更改的容器,当您重新启动未更改的服务时,Compose 会使用现有容器。

可以使用变量

变量在环境之间组合重复使用.

Compose 支持在 docker-compose.yml 中使用变量,可以通过设置变量来配合不同的使用环境。

2. 使用 Compose 步骤和思路

  1. 使用 Dockerfile 定义您的应用程序的环境

  2. 使用 docker-compose.yml 定义组成您的应用程序的服务
    使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  3. 运行docker compose up启动并运行程序
    最后,执行 docker-compose up 命令来启动并运行整个应用程序。
    Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

二、docker-compose常用命令

docker-compose # 拉取镜像
docker-compose up -d nginx # 运行nginx容器
docker-compose up -d # 运行所有容器
docker-compose ps # 查看容器运行状态
docker-compose down # 停止容器和容器网络
docker-compose rm nginx # 删除nginx容器
docker-compose run yaml中定义的服务名 命令 #在指定服务上运行一个命令

默认情况下,docker-compose up启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过Ctrl+c停止命令时,所有容器将会停止。
如果希望在后台启动并运行所有的容器,使用docker-compose up -d

总结: 批量启动时, docker-compose up -d 比较常用!

三、docker compose 安装

只有 Linux 平台上在安装docker时没有安装docker-compose,windows、macos平台安装docker时会自动安装docker-compose。

apt install python3-pip
sudo pip install -U docker-compose

四、docker-compose.yml 基础

【推荐】docker compose 配置文件.yml 全面指南
参考URL:https://zhuanlan.zhihu.com/p/387840381

Docker Compose配置文件docker-compose.yml是Docker Compose的核心,用于定义服务、网络和数据卷。格式为YAML,默认路径为./docker-compose.yml,可以使用.yml或.yaml扩展名,目前Compose配置文件格式的最新版本为V3。Compose配置文件中涉及的配置项也比较多,但大部分配置项的含义跟docker run命令相关选项是类似的。

  • services
  1. 一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建。
  2. service的启动类似docker run,我们可以给其指定network和volme,所以可以给service指定network和volume的引用
  • networks
  • volumes

官方示例应用程序

官方示例:https://docs.docker.com/compose/compose-file/

(External user) --> 443 [frontend network]
                            |
                  +--------------------+
                  |  frontend service  |...ro...<HTTP configuration>
                  |      "webapp"      |...ro...<server certificate> #secured
                  +--------------------+
                            |
                        [backend network]
                            |
                  +--------------------+
                  |  backend service   |  r+w   ___________________
                  |     "database"     |=======( persistent volume )
                  +--------------------+        \_________________/

示例应用程序由以下部分组成:

  • 2 个服务,由 Docker 镜像支持:webapp和database
  • 1 个密钥(HTTPS 证书),注入前端
  • 1个配置(HTTP),注入前端
  • 1 个持久卷,附加到后端
  • 2 个网络
services:
  frontend:
    image: awesome/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: awesome/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {
    
    }
  back-tier: {
    
    }

此示例说明了volumesconfigssecrets之间的区别。虽然它们都作为挂载的文件或目录暴露给服务容器,但只有一个卷可以配置为读写访问。secretsconfigs是只读的。volumes配置允许您选择卷驱动程序并传递驱动程序选项以根据实际基础架构调整卷管理。Configs 和 Secrets 依赖于平台服务,并且被声明external为它们不作为应用程序生命周期的一部分进行管理:Compose 实现将使用特定于平台的查找机制来检索运行时值。

五、工作常用技巧

docker-compose或docker run 启动容器后就退出

问题背景:
启动容器:docker-compose up -d
查看容器运行情况:docker-compose ps
结果容器并没有运行,运行 docker-compose ps -a 命令发现,容器在启动后短时间内又停止了

问题描述总结:docker-compose 启动容器后就退出,查看日志没有报错。

问题分析:
Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

docker 容器的生命周期是同容器中的前台进程相关的,如果容器内没有前台进程,容器就会自动停止。

Docker Compose解决方案:
方案一:自己启动一个前台进程tail -F anything
Docker Compose保持容器运行
要使容器在启动时保持运行docker-compose,请使用以下命令

command: tail -F anything

version: "3.8"
services:
  web:
    image: "centos-test:v5"
    command: bash -c "/etc/init.d/xxx start && tail -f /var/log/meesage.log"

容器解决方案:
tail -F anything 或
docker run 加上这个开机重启参数:–restart always -d

方案二:在 docker-compose 中添加 tty: true 关键字

version: '3'

services: 
    web: 
        container_name: node_web
        build:
              context: .
        volumes: 
            - ./:/home/node/app
        ports: 
            - 8888:8080
        tty: true

tty: true 的作用是为容器分配一个伪终端,就相当于 docke run -t, 我的理解是这样就是把 /bin/bash 当做前台进程

docker-compose一个应用启动多个节点

我们目前的docker-compose 中的service容器中各自只有一个,通过scale可以去扩展service。
例如将web服务的数量变为三个:

docker-compose up --scale web=3 -d
  1. docker-compose.yml配置
    version: “3”
    services:
    web:
    image: nginx:1.19.9-alpine
    restart: always
    ports:

    • 80-81:80
  2. 启动服务

docker-compose up -d --scale web=2
  1. 查看应用状态
docker-compose ps 

使用Docker-Compose,如何执行多个命令

scale参数官方说明: https://docs.docker.com/compose/reference/scale/

实战demo:

version: "3.8"
services:
  web:
    image: "centos-test:v1"
    command: bash -c "/etc/init.d/xxx start && tail -f /var/log/message.log"
    init: true

猜你喜欢

转载自blog.csdn.net/inthat/article/details/124838982
今日推荐