• docker-compose的简单使用


    docker-cpmpose

    docker-cpmpose是用来编排容器

    比如,想要同时运行mysql、nginx等几个镜像,常规方法是需要一个一个的启动,并同时选择参数(环境,端口,容器命名)

    使用docker-cpmpose后,便可以将上面的这些命令写到一个docker-composer.yml文件中

    这个配置文件写完了后,直接一个docker-composer up命令即可

    使用步骤

    Compose 使用的三个步骤:

    • 使用 Dockerfile 定义应用程序的环境。

      写完了

    • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    • 最后,执行 docker-compose up 命令来启动并运行整个应用程序

    组成

    使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。

    Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container

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

    • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务。
    • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。即是Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。

    文件参数说明

    官方文档:https://docs.docker.com/compose/compose-file/

    定义一组相关联的容器为一个工程 (project)。一个工程包含多个服务 (service),每个服务中定义了创建容器时所需的镜像、参数、依赖等

    需要关注的顶级配置有 versionservicesnetworksvolumes 几个部分,除 version 外,其他几个顶级配置下还有很多下级配置

    • version:描述 Compose 文件的版本信息;
    • services:定义服务,可以多个,每个服务中定义了创建容器时所需的镜像、参数、依赖等;
    • networkds:定义网络,可以多个,根据 DNS server 让相同网络中的容器可以直接通过容器名称进行通信;
    • volumes:数据卷,用于实现目录挂载

    version

    描述 Compose 文件的版本信息

    services

    image

    指定创建容器时所需的镜像名称标签或者 镜像 ID 。如果镜像在本地不存在,会去远程拉取

    services:
      web:
        image: hello-world
    
    
    • 1
    • 2
    • 3
    • 4

    build

    可以基于指定的镜像构建容器,还可以基于 Dockerfile 文件构建,在使用 up 命令(docker-compose启动)时会执行构建任务

    • 通过 build 配置项可以指定 Dockerfile 所在文件夹的路径,Compose 将会利用 Dockerfile 自动构建镜像,然后使用镜像启动服务容器。build 配置项可以使用绝对路径,也可以使用相对路径。
    • 将需要的内容放到对应的目录

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xwrjwhD-1658279524524)(image/Docker部署拨测/1658138730346.png)]

    context

    该选项可以是 Dockerfile 文件的绝对/相对路径,也可以是远程 Git 仓库的 URL,当提供的值是相对路径时,相对当前 docker-compose.yml 文件所在目录

    dockerfile

    一般情况下,默认都基于文件名叫 Dockerfile 的文件构建镜像,当然也可以是自定义的文件名,使用 dockerfile 声明,不过这个选项只能声明文件名,文件所在路径还是要通过 centext 来声明

    build:
      context: . # 相对当前 docker-compose.yml 文件所在目录
      dockerfile: Dockerfile-alternate # 基于名称为 Dockerfile-alternate 的文件构建镜像
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    container_name

    Compose 创建的容器默认生成的名称格式为:工程名称_服务条目名称_序号。如果要使用自定义名称,使用 container_name 声明。

    services:
      mycentos:
        build: .
        container_name: mycentos7 # 容器名称,默认为"工程名称_服务条目名称_序号"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    因为 Docker 容器名称必须是唯一的,所以如果指定了自定义名称,就不能将服务扩展至多个容器

    depends_on

    当在没有启动数据库容器的情况下启动了 Web 应用容器,应用容器会因为找不到数据库而退出。

    depends_on 就是用来解决容器依赖、启动先后问题的配置项

    下面的yml定义的容器会先启动 db 和 redis 两个服务,最后才启动 web 服务

    version: "3.8"
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: mysql
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ports

    容器对外暴露的端口,格式:宿主机端口:容器端口

    ports:
      - "80:80"
      - "8080:8080"
    
    • 1
    • 2
    • 3

    expose

    容器暴露的端口不映射到宿主机,只允许能被连接的服务访问

    expose:
      - "80"
      - "8080"
    
    
    • 1
    • 2
    • 3
    • 4

    restart

    容器重启策略,简单的理解就是 Docker 重启以后容器要不要一起启动:

    1. no:默认的重启策略,在任何情况下都不会重启容器;
    2. on-failure:容器非正常退出时,比如退出状态为非0(异常退出),才会重启容器;
    3. always:容器总是重新启动,即使容器被手动停止了,当 Docker 重启时容器也还是会一起启动;
    4. unless-stopped:容器总是重新启动,除非容器被停止(手动或其他方式),那么 Docker 重启时容器则不会启动。
    services:
      nginx:
        image: nginx
        container_name: mynginx
        ports:
          - "80:80"
        restart: always
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    environment

    添加环境变量。可以使用数组也可以使用字典。布尔相关的值(true、false、yes、no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为真或假。

    environment:
      RACK_ENV: development
      SHOW: 'true'
      SESSION_SECRET:
    
    • 1
    • 2
    • 3
    • 4

    或者下面的格式

    environment:
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET
    
    • 1
    • 2
    • 3
    • 4

    env_file

    从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。

    env_file:
      - /opt/runtime_opts.env # 绝对路径
      - ./common.env # 相对路径,相对当前 docker-compose.yml 文件所在目录
      - ./apps/web.env # 相对路径,相对当前 docker-compose.yml 文件所在目录
    
    • 1
    • 2
    • 3
    • 4

    env 文件中的每一行需采用 键=值 格式。以 # 开头的行会被视为注释并被忽略。空行也会被忽略。

    volumes

    数据卷,用于实现目录挂载,支持指定目录挂载、匿名挂载、具名挂载。

    1. 指定目录挂载的格式为:宿主机目录:容器目录;
      或者宿主机目录:容器目录:读写权限;
    2. 匿名挂载格式为:容器目录即可;
      或者容器目录即可:读写权限;
    3. 具名挂载格式为:数据卷条目名称:容器目录;
      或者数据卷条目名称:容器目录:读写权限。
    # 描述 Compose 文件的版本信息
    version: "3.8"
    # 定义服务,可以多个
    services:
      mysql: # 服务名称
        image: mysql:8 # 创建容器时所需的镜像
        container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"
        ports: # 宿主机与容器的端口映射关系
          - "3306:3306" # 左边宿主机端口:右边容器端口
        environment: # 创建容器时所需的环境变量
          MYSQL_ROOT_PASSWORD: root
        volumes:
          # 绝对路径
          - "/opt/data/docker_mysql/data:/var/lib/mysql"
          # 相对路径,相对当前 docker-compose.yml 文件所在目录
          - “./conf:/etc/mysql/conf.d“
          # 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume 中生成
          - "/var/lib/mysql"
          # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
          - "mysql-data-volume:/var/lib/mysql"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    volumes_from

    从另一个服务或容器挂载它的所有卷。

    volumes_from:
     - service_name
     - container_name
    
    • 1
    • 2
    • 3

    networks

    配置容器连接的网络,引用顶级 networks 下的条目

    # 定义服务,可以多个
    services:
      nginx: # 服务名称
        networks: # 配置容器连接的网络,引用顶级 networks 下的条目
          - nginx-net # 一个具体网络的条目名称
    
    • 1
    • 2
    • 3
    • 4
    • 5

    aliases

    网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。

    # 定义服务,可以多个
    services:
      nginx: # 服务名称
        networks: # 配置容器连接的网络,引用顶级 networks 下的条目
          nginx-net: # 一个具体网络的条目名称
            aliases: # 服务别名,可以多个
              - nginx1 # 同一网络上的其他容器可以使用服务名或此别名连接到服务容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    volumes

    再详细把配置的不同方式

    # 描述 Compose 文件的版本信息
    version: "3.8"
    # 定义服务,可以多个
    services:
      mysql:
        image: mysql:8
        container_name: mysql8
        ports:
          - "3306:3306"
        environment
          MYSQL_ROOT_PASSWORD: root
        volumes:
          # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
          - "mysql-data-volume:/var/lib/mysql"
    
    # 定义数据卷,可以多个
    volumes:
      mysql-data-volume: # 一个具体数据卷的条目名称
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    以下方式的数据卷声明创建卷时会使用自定义的名称

    # 描述 Compose 文件的版本信息
    version: "3.8"
    # 定义服务,可以多个
    services:
      mysql:
        image: mysql:8
        container_name: mysql8
        ports:
          - "3306:3306"
        environment
          MYSQL_ROOT_PASSWORD: root
        volumes:
          # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
          - "mysql-data-volume:/var/lib/mysql"
    
    # 定义数据卷,可以多个
    volumes:
      mysql-data-volume: # 一个具体数据卷的条目名称
        name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    networks

    如果不声明网络,每个工程默认会创建一个网络名称为"工程名称_default"的 bridge 网络

    # 描述 Compose 文件的版本信息
    version: "3.8"
    # 定义服务,可以多个
    services:
      nginx:
        image: nginx
        container_name: mynginx
        ports:
          - "80:80"
        networks: # 配置容器连接的网络,引用顶级 networks 下的条目
          nginx-net:
    
    # 定义网络,可以多个
    networks:
      nginx-net: # 一个具体网络的条目名称
        name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"
        driver: bridge # 网络模式,默认为 bridge
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Compose 常用命令

    查看帮助

    # 查看帮助
    docker-compose -help 
    
    • 1
    • 2

    创建并启动所有服务的容器

    指定多个 yml 加 -f 选项。以守护进程模式运行加 -d 选项。

    # 前台启动
    docker-compose up
    # 后台启动
    docker-compose up -d
    # -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
    docker-compose -f docker-compose.yml up -d 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    看服务容器的输出日志

    # 输出日志,不同的服务输出使用不同的颜色来区分
    docker-compose logs
    # 跟踪日志输出
    docker-compose logs -f
    # 关闭颜色
    docker-compose logs --no-color
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    列出工程中所有服务的容器

    # 列出工程中所有服务的容器
    docker-compose ps
    # 列出工程中指定服务的容器
    docker-compose ps nginx
     
    
    • 1
    • 2
    • 3
    • 4
    • 5

    进入服务容器

    # 进入工程中指定服务的容器
    docker-compose exec nginx bash
    # 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
    docker-compose exec --index=1 nginx bash
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    暂停/恢复服务容器

    # 暂停工程中所有服务的容器
    docker-compose pause
    # 暂停工程中指定服务的容器
    docker-compose pause nginx
    
    # 恢复工程中所有服务的容器
    docker-compose unpause
    # 恢复工程中指定服务的容器
    docker-compose unpause nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    重启/启动/停止服务容器

    # 重启工程中所有服务的容器
    docker-compose restart
    # 重启工程中指定服务的容器
    docker-compose restart nginx
    
    
    # 启动工程中所有服务的容器
    docker-compose start
    # 启动工程中指定服务的容器
    docker-compose start nginx
    
    
    # 停止工程中所有服务的容器
    docker-compose stop
    # 停止工程中指定服务的容器
    docker-compose stop nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    删除服务(停止状态)容器

    # 删除所有(停止状态)服务的容器
    docker-compose rm
    # 先停止所有服务的容器,再删除所有服务的容器
    docker-compose rm -s
    # 不询问是否删除,直接删除
    docker-compose rm -f
    # 删除服务容器挂载的数据卷
    docker-compose rm -v
    # 删除工程中指定服务的容器
    docker-compose rm -sv nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    打印服务容器所对应的镜像

    # 打印所有服务的容器所对应的镜像
    docker-compose images
    # 打印指定服务的容器所对应的镜像
    docker-compose images nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    显示正在运行的进程

    # 显示工程中所有服务的容器正在运行的进程
    docker-compose top
    # 显示工程中指定服务的容器正在运行的进程
    docker-compose top nginx
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考链接:https://thinkwon.blog.csdn.net/article/details/119511551
    官方文档:https://docs.docker.com/compose/compose-file/
    菜鸟文档:https://www.runoob.com/docker/docker-compose.html

  • 相关阅读:
    【神经网络与深度学习】概率神经网络PNN
    Webpack 和 Rollup:一样但又不同
    PostgreSQL-高级数据类型
    外包干了2个月,技术退步明显。。。。。
    【JavaEE】HTML 基础
    Nginx部署前端项目
    GitHub上标星75k+的《Java面试突击版》到底有多牛?看完内容我服了!
    【NLP笔记】文本向量化
    Hessian协议详解
    python爬虫——爬取豆瓣top250电影数据(适合初学者)
  • 原文地址:https://blog.csdn.net/yyuggjggg/article/details/125885178