docker-compose 使用

一、Docker Compose 引入

现有 docker 进行项目部署存在的问题
1、为了完成一个完整项目,势必用到 n 多个容器配合完成项目中业务开发,一旦引入 n 多个容器,n 多个容器之间就会形成某种依赖,也就意味着某些容器的运行需要其它容器优先启动。
此时,容器的编排就很重要。

2、现在这种容器的部署方式,我们没办法站在项目的角度将一组容器划分到一起,日后多服务器部署是个问题。
项目角度管理用到的一组容器

二、Docker Compose 简介

2.1、什么是 Docker Dompose

Docker Compose 项目是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分相似。
快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器进行按照指定顺序启动。
Compose 定位是对于多个 Docker 容器管理

2.2、如何使用 Docker Compose

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

Compose 中两个重要概念:

  • 项目 (projectg): 由一组关联的应用容器 (服务) 组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
  • 服务 (service): 一个应用中某一个的容器,实际上可以包括若干运行相同镜像的容器实例。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API ,就可以
在其上利用 Compose 来进行编排管理。

三、安装

注意:只有 Linux 平台上在安装 docker 时没有安装 docker-compose,

  1. 下载

    sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  2. 添加可执行权限

    sudo chmod +x /usr/local/bin/docker-compose

三、使用

3.1、场景

最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。

  • springboot 应用
  • mysql 服务
  • redis 服务
  • elasticsearch 服务
  • ……

3.2、使用案例

  1. 创建一个项目 mkdir hudu_project

  2. 在 hudu_project 目录创建一个 docker-compose.yml 模板文件

version: docker-compose 版本和 docker 版本对应关系,https://docs.docker.com/compose/compose-file/compose-file-v3

service:  开始定义每一个服务

mysqldb: 自定义服务名,默认容器名称为项目名 + _ + 服务名

image: 使用的哪个镜像,类似于 docker run 指定的镜像名称

ports: 宿主机和容器中端口映射,类似于 docker run -p 参数

volumes: 代表当前容器和宿主机指定数据卷,类似于 docker run -v 参数,注意:docker-compose 使用绝对路径必须先创建才能使用,具名数据卷需要在compose文件中定义,docker volume ls 查看时,发现数据卷别名为 项目名+定义的数据卷名称

environment: 代表给当前容器启动指定环境,类似于 docker run -e MYSQL_ROOT_PASSWORD=root

container_name: 代表给容器指定一个名称,类似于 docker run --name 参数,推荐使用默认名称,不自定义服务名称。
# 代表使用 docker-compose 项目的版本号,与 docker 引擎有关
version: "3.8"

services:
  mysqldb:
    image: mysql:8.0.28
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /root/mysql/conf:/ect/mysql/conf.d
      - /root/mysql/logs:/logs
      - /root/mysql/data:/var/lib/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD: root"
    network:
      - hudu
    depends_on:
      - redis
  redis:
    image: redis:6.2.6
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - hudu_project
    volumes:
      - /root/redis/data:/data
    command: redis-server
network:
  hudu_project:
  1. 启动 docker-compose 一组服务
docker-compose up -d
这个命令必须在 docker-compose.yml 配置文件所在目录

docker-compose down
会把项目对应的服务的缓存配置都移除

启动后效果如下

Docker Compose

3.3、docker-compose 中支持的常用模板命令

中文参考文档

官方参考文档

3.3.1、build

通过 docker-compose 在启动容器之前,先根据 dockerfile 构建镜像,然后根据构建的镜像启动容器。

3.3.2、command

覆盖容器启动后默认执行的命令,类似于 docker run image 覆盖的命令,

3.3.3、container_name

用来指定 docker-compose 启动容器名称,注意:不推荐指定容器名称

3.3.4、depends_on

解决容器的依赖,启动先后问题。
注意:当前服务不会等待依赖的服务[完全启动]之后才启动

3.3.5、environment

用来给容器启动指定环境变量,相当于 docker run -e 参数

3.3.6、env_file

用来给容器启动指定环境变量文件,相当于 docker run -e 参数

3.3.7、expose

用来指定构建镜像过程中容器暴露的端口号,一半直接在 Dockerfile中已经定义

3.3.8、image

用来指定容器使用的镜像是谁,相当于 docker run image(镜像名)

3.3.9、networks

用来指定启动的容器使用的网桥,相当于 docker run --network,使用时需要声明使用的网桥

3.3.10、ports

用来指定宿主机和容器端口映射,相当于 docker run -p 参数

3.3.11、volumes

用来指定宿主机和容器中的目录映射,相当于 docker run -v 参数

3.3.12、restart

用来指定 docker 容器(服务)总是运行,相当于 docker run --restart=always

3.4、具体使用参考

docker-compose.yml文件内容

Docker Compose

.env文件内容

Docker Compose

Dockerfile内容

docker-compose 使用

3.5、docker-compose 命令

3.5.1、命令对象与格式

对于 compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器,如果没有特别说明,命令对象将是项目,这意味着项目中的所有的服务都会受到影响。

执行 docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以查看具体某个命令的使用格式。
具基本的使用格式是
docker-compose -f docker-compose.yml 命令 [选项] [服务id]

3.5.2、命令选项

  • -f, --file FILE指定使用的Compose模板文件,默认为docker- compose.yml ,可以多次指定。
  • -p,--project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
  • --x-networking使用Docker的可拔插网络后端特性
  • --x-network-driver DRIVER指定网络后端的驱动,默认为bridge
  • --verbose输出更多调试信息。
  • -v,--version打印版本并退出。

3.5.3、命令说明

  1. up -d(后台启动)
docker-compose up :对整个项目操作
docker-compose up 服务id :对当前 docker-copmose 中对应服务id容器操作
该命令十分强大,它将尝试自动完成包括镜像的构建,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
  1. down
docker-compose down 对整个项目操作
docker-compose down 服务 id,对某个服务容器的操作
作用:关闭所有或者所有服务,并且移除项目及网络,数据卷会保留
  1. exec
docker-compose exce 服务id bash
作用:进入某个服务容器内部
  1. ps
docker-compose ps [options] [service...]
作用:列出项目中目前的所有服务
-a:只列出容器id
  1. restart -t(指定多少秒后进行重启)
docker-compose restart:对整个项目操作
docker-compose restart 服务id:对某个服务进行重启
作用:重启整个项目服务或指定服务
  1. rm
docker-compose rm [options] [service...]
作用:删除所有(停止状态的)服务容器,推荐使用 docker-compose stop 命令来停止容器

-f,-- force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v 删除容器挂在的数据卷
  1. start
docker-compose start [service...]
作用:启动已经存在的服务容器
  1. stop
docker-compose stop [option] [service...]
作用,停止已经处于运行状态的容器,但不删除它,通过docker-compose 可以再次启动这些容器

-t,--timeout TIMEOUT 停止容器时的超时(默认为 10 秒)
  1. top
docker-compose top [服务id]
作用:查看整个项目中所有或者指定的容器服务内的进程
  1. pause、unpause
docker-compose pause [service...]
docker-compose unpause [service...]
作用:pause 暂停和恢复整个项目中所有服务或指定id某个服务
  1. logs
docker-compose logs -f(实时) [service]
作用:查看整个项目所有运行日志,或者指定服务id服务的运行日志

3.6、docker 可视化工具

3.6.1、简介

第三方公司开源 portainer 项目,用来对 docker 引擎中运行的容器进行可视化的展示。

3.6.2、安装 Portainer

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!