docker compose

docker compose

  • [什么是docker compose](#什么是docker compose)
  • [为什么需要docker compose?](#为什么需要docker compose?)
  • [docker compose 的功能](#docker compose 的功能)
  • [docker compose 使用场景](#docker compose 使用场景)
  • [docker compose 文件](#docker compose 文件)
  • [docker compose常见命令](#docker compose常见命令)
    • [docker compose up](#docker compose up)
    • [docker compose down](#docker compose down)
    • [docker compose run](#docker compose run)
  • 基本操作练习

什么是docker compose

docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用;
docker compose 有两个比较重要的概念:
服务(service): 一个应用的容器,实际上可以包含若干个运行相同镜像的容器示例;
项目(project): 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义 ,整个docker-compose.yml定义一个项目;

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。通过 compose 可以方便的管理多个服务。

举个例子:

就比如一个乐团:

一般对于一个乐团来说不是由一个人组成的,而是由弦乐 、管乐、 打击乐三大部分互相配合组成的,而对于每一个部分来说有时由具有相同演奏功能的人组成的,而指挥这三个部分奏出优美音乐的就是指挥家,指挥家会在合适的时候指挥这三个部分演奏自己的声音;

在docker compose中,指挥家就相当于docker-compose.yml文件,"弦乐 、管乐、 打击乐"这三个部分就相当整个项目中的服务,而这一个个的服务又是由具有相同功能的容器组成!

为什么需要docker compose?

举个例子:
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

这是一个启动mysql镜像所需要的启动参数,第一眼,参数很多、很麻烦;如果是启动一个mysql镜像还行,可是如果此时需要启动500个这样的mysql镜像,那么我们是不是要手动启动500次?那么既然是人为的启动,出错的概率是不是会大大的增加?同理,如果我们不需要这些容器了是不是也要stop500次?如果这时还交给人工来完成这个工作的话,那么会加大我们项目的不稳定性,我们需要一个能够自动完成这些工作的工具,docker compose应运而生!

docker compose 的功能

  1. 使用步骤:

1.1. 使用docker-compose-ymal定义构建应用程序的服务,这样他们可以在隔离环境中一起运行;

1.2. 最后执行docker compose up 命令来启动并运行整个应用程序;

  1. docker compose 是具备管理应用程序整个生命周期的命令:

2.1 启动、停止、重建服务;

2.2 查看正在运行的服务的状态;

2.3 流式传输运行服务的日志输出:

2.4 在服务上运行一次性命令;

docker compose 使用场景

  1. 单主机部署:
    快速搭建一个单节点开发或者测试环境,方便使用;
  2. 不同环境隔离:
    通过指定project来运行不同的环境,实现隔离的目的;

docker compose 文件

文件语法版本:

目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。

当前最新的版本是 3.8,它支持的 Docker Engine 版本不得低于 19.03.0。

文件基本结构及常见标签

重要:

针对compose.ymal文件的标签详细信息,请参考官方文档;

文件基本结构:

yaml 复制代码
version: 3.8 #定义当前docker compose.ymal文件所采用的语法版本
services: # 顶级标签,表示这个项目下的所有服务,也就是列举组成这个项目的具体服务:
  serviceName1: # 具体服务的名称,他也是内部bridge网络可以使用的dns name,如果不是集群模式,那么就相当于docker run的时候指定的一个名称;
    image: xxxx:tag # 必选,镜像的名字,可以是xxxx:tag模式,也可以是哈希摘要;
    command: # 可选,如果设置,则会覆盖镜像里面的默认CMD启动命令;
    environment: # 可选,设置环境变量;
    volumes: # 设置存储卷
    networks: # 指定当前容器加入的网络
    ports: # 指定当前容器的映射端口
    expose: # 可选,指定容器暴露的端口;
    build: # 构建目录
    depends_on: # 服务依赖配置
    env_file: # 环境变量配置文件
  serviceName2:
    image:
    command:
    environment:
    volumes:
  serviceName3:
    image:
    command:
    networks:
    ports:
volumes: # 相当于docker volume create
networks: # 相当于docker network create

# 文件名:
docker-compose.yaml / docker-compose.yml
compose.yaml / compose.yml
# 任选其中一个即可

1. image标签
功能: 指定容器基于的镜像
演示:

image: redis
image: redis:5
image:redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis

2. command 标签
功能: 覆盖容器镜像默认声明的CMD
演示:

当然也可以写成数组的形式:

3. entrypoint
功能: 覆盖镜像默认的entrypoint进入点;
演示:

当然也可以写成一个列表的形式:

4. environment
功能: 给容器中设置环境变量
演示:

map形式设置:

数组形式设置:

当env_file和environment中设置了相同的环境变量,environment优先;
5. networks
功能: 表示容器需要加入的网络;作为顶级域名使用的时候,可以指定创建的网络的类型、名称信息;
演示:

普通用法:

顶级标签使用:

6. volumes:
功能: 指定容器挂载的存储卷
演示:

作为普通标签使用:

作为顶级标签使用:

7. ports
功能: 映射容器的端口
演示:

8. expose
功能: 指定容器内,向外暴露的端口
演示:

9. depends_on
功能: 使用该标签,可以控制容器的启动顺序;
演示:

10. env_file
功能: 从文件中导入环境变量;

docker compose常见命令

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

bash 复制代码
docker compose [OPTIONS] COMMAND [ARGS...]

-f: 指定配置文件的位置,可以多次指定,但是多次指定的配置文件最终会合并成一个配置文件;如果后一个配置文件中和前一个配置文件中在同层具有相同标签,则会覆盖,否则则会新增;

-p: 指定项目名称;

指定项目名称除了使用-p选项,还有其它方式,优先级如下:

  1. docker compose -p
  2. 通过COMPOSE_PROJECT_NAME环境变量来设置

通过环境变量这个方式的具体操作又有三种:

2.1 在工作目录下创建一个.env文件,在这个文件中写入环境变量,每次执行docker compose命令的时候,都会自动读取这个文件;

2.2 通过docker compose 命令来设置:

2.3 通过shell 命令行来设置:

  1. 通过顶级标签:name: xxx 来设置

  2. 指定的配置文件的目录名

  3. 如果没有指定配置文件,那么就是当前目录名
    注意:

  4. docker compose 系列的命令是针对于.ymal 文件进行的,如果在工作目录下,那么针对docker compose 系列命令不需要使用-f 带上要操作的配置文件的路径;反之,则需要使用-f带上.ymal配置文件的路径;

  5. 对于docker compose 系列的命令于docker container系列的命令相差不大,只不过是从之前操作对象为单个docker转变为了操作对象为一个服务or一个项目!

docker compose up

语法 :docker compose up [OPTIONS] [SERVICE...]
功能: 构建镜像、创建容器、重新创建容器、启动容器并关联服务相关的一些操作。可以直接通过该命令来启动一个项目;

经试验发现,如果该命令什么参数都不带的情况下启动,那么它会查看.ymal文件如果在这个文件中对应的服务存在容器,并且配置项没有改变,那么就会直接启动这个容器,不会新建容器;如果配置文件中某个服务的配置更改了,那么是需要重新创建容器在启动的,无论这个容器是否已经存在;
参数:

-d: 后台运行服务;

--force-recreate: 强制重新创建容器,不能与--no-recreate 同时使用;

--no-recreate: 如果容器已经存在,则不需要重新创建,直接启动容器,无论这个容器服务对应的配置文件是否修改!
实战:

首先来看看docker -compose.ymal文件:

docker compose down

语法: docker compose down [OPTIONS] [SERVICES]
功能: 停止并删除容器、网络、存储卷以及创建出来的镜像;

默认会删除的东西有:

  1. 某个服务对应的容器;
  2. .ymal 文件中创建的网络
  3. Docker Compose在默认情况下会创建一个名为default的网络,用于连接在同一个docker-compose.yml文件中定义的服务。除非在docker-compose.yml文件中明确指定了其他网络,否则服务会默认连接到这个default网络。当您运行docker-compose down时,这个默认的default网络(如果它被使用了)通常也会被移除,除非它被显式地标记为external或者通过其他方式被外部管理。
    参数:
    -v: 删除命名卷和匿名卷
    --rmi:删除被服务使用的镜像,一般会有两个选项: local: 表示删除没有标签的镜像,比如: <none>:<none>all: 表示删除所有镜像
    实战:


docker compose run

语法: docker compose run [OPTIONS] SERVICES [COMMAND] [ARGS...]
功能 :对服务运行一次性命令,简而言之就是启动SERVICES服务,并以COMMAND作为服务的启动命令;

如果服务未启动,那么该run命令会启动服务,并运行指定的命令;如果服务以及启动,那么该run命令会直接执行指定命令;
参数:

-d: 后台运行服务;

--name : 指定容器的名字

--entrypoint: 覆盖默认的容器启动指令

-e key=val: 设置环境变量;

-u :指定容器运行的用户名

--rm : 运行完命令过后自动删除容器;

-p:端口映射;
实战:

基本操作练习

  1. 创建compose目录:
  2. 进入project1目录,并创建docker-compose.ymal文件:
  3. 填写docker-compose.ymal文件的内容:
  4. 输入docker compose config命令,会自动解析我们写的ymal文件,并会进行语法检查:
  5. 进入web服务绑定的目录,修改index.html文件:
  6. 启动服务
  7. 通过网页访问:
  8. 停止服务:
  9. 重新启动服务:
  10. 释放资源:
相关推荐
Raymond运维2 分钟前
Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版
linux·运维·ubuntu·centos·debian·rocky·almalinux
你熬夜了吗?26 分钟前
java实现代码沙盒(docker-java)
java·spring boot·docker
荣世蓥30 分钟前
6. ARM_ARM指令寻址
linux·运维·arm开发
ZZDICT2 小时前
ThinkServer SR658H V2服务器BMC做raid与装系统
运维·服务器·bmc·装系统·做raid
wanhengwangluo2 小时前
江苏显卡服务器有哪些好处?
运维·服务器
树下一少年2 小时前
服务器开机即占用大量内存,解决
linux·运维·服务器·sysctl.conf·vm.nr_hugepages
LaoZhangGong1232 小时前
Linux第92步_如何编写“设备树”下的platform设备驱动
linux·运维·服务器·经验分享·stm32·stm32mp157
DCTANT2 小时前
【原创】如何备份和还原Ubuntu系统,非常详细!!
linux·运维·ubuntu·备份还原系统
帝恩思科技2 小时前
网络游戏安全现状及相关应对方案
运维·服务器·网络·安全·web安全