初识 docker compose

1. 为什么要用docker compose

在多阶段构建章节中,我们将flask应用打包成了镜像myhello,然后创建myhello应用容器,它依赖redis服务,所以我们设定myhello容器通过宿主机网络与redis进行数据交换。

如果在别的服务器上,使用Docker重新部署一边,操作的过程还是比较麻烦的。一般来说,我们要求每个Docker容器只运行一个独立服务,每个镜像都要保持尽可能的简洁、功能单一,貌似这些规范反而降低了我们的效率。

同时,随着技术演进,我们越来越推崇将大型服务拆分成较小的微服务,分别部署到独立的机器或容器中,也就是说,我们的应用系统往往由数十个甚至上百个小型服务组成。试想一下,使用之前讲到的容器技术搭建系统,不仅需要众多复杂的命令,处理众多容器间的依赖更是非常消耗精力的。

归结下来,我们缺少一个对容器组合进行管理的工具。

Docker Compose 是 Docker 官方编排项目。使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。在 Docker Compose 里,我们通过一个配置文件,将所有与应用系统相关的软件及它们对应的容器进行配置,之后使用 Docker Compose 提供的命令进行启动,就能让 Docker Compose 将刚才我们所提到的那些复杂问题解决掉。

2. 获取 Docker Compose

安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限

# 下载 docker-compose 
wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64
# 移到 /usr/local/bin/docker-compose
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# 给 docker-compose 执行权限
sudo chmod +x /usr/local/bin/docker-compose

查看安装是否成功:

docker-compose -v

3. 使用 Docker Compose

使用 Docker Compose 的步骤分成三步。

  1. 也可以使用现有的镜像 ,或者根据需要编写容器所需镜像的 Dockerfile
  2. 编写获取用于配置容器的 docker-compose.yml
  3. 使用 docker-compose 命令启动应用

准备镜像这一过程我们之前已经掌握了,编写docker-compose.yml部分我们会放在下一节详细介绍,这里我们就直接来使用它,感受Docker Compose 的强大功能。

3.1 编写 docker-compose.yml

进入dockerfiledir目录,新建redis目录,将之前部署redis容器用到的redis.conf拷贝到redis目录下,修改redis.conf中的bind 127.0.0.1bind 0.0.0.0,以便其他容器访问此服务。然后新建文件docker-compose.yml,并将下面的内容写入到这个文件中。

version: "3.8"
services:
    cache:
      image: redis:6.0.5
      container_name: my_redis
      networks:
          - mynetwork
      volumes:
          - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
      command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    app:
      build:
          context: .
          dockerfile: ./Dockerfile-multi-stage
      container_name: my_hello
      networks:
          - mynetwork
      environment:
          - REDIS_HOST=my_redis
      depends_on:
          - cache
      ports:
          - "5000:5000"
networks:
  mynetwork:
    name: my_network
    driver: bridge

此时目录结构如下:

图片描述

3.2 启动、重建和停止

docker-compose up 命令类似于 Docker 中的 docker run,它会根据 docker-compose.yml 中配置的内容,创建所有的容器、网络、数据卷等等内容,并将它们启动。与 docker run 一样,默认情况下 docker-compose up 会在前台运行,我们可以用 -d 选项使其“后台”运行,大多数情况都会加上 -d 选项。

sudo docker-compose up -d

docker-compose 命令默认会识别当前控制台所在目录内的 docker-compose.yml 文件,而会以这个目录的名字作为组装的应用项目的名称。如果我们需要改变它们,可以通过选项 -f 来修改识别的 Docker Compose 配置文件。--build 用于执行重建服务镜像,更新镜像时使用。

sudo docker-compose -f ./docker-compose.yml up -d --build

docker-compose down 命令用于停止所有的容器,并将它们删除,同时消除网络等配置内容,也就是几乎将这个 Docker Compose 项目的所有影响从 Docker 中清除。

Tips: 建议大家像容器使用一样对待 Docker Compose 项目,做到随用随启,随停随删。

4. 小结

通过 Docker 让我们能够在开发过程中搭建一套不受干扰的独立环境,而 Docker Compose 则让我们可以处理多套环境,并能够做到进行快速切换。在服务搭建的场景中,使用Docker Compose 编排容器,可以使容器技术发挥更大的价值。下一节,我们将走进Docker Compose的核心,深入了解Compose配置文件的指令的作用和使用方式。