【云原生】玩转docker实战(二):单机环境的容器编排工具docker-compose

背景

虽说kubernetes已经成为了容器编排的事实标准,但其强大的功能也伴随着复杂度和成本的提升。

在一些简易任务的应用场景中,Kubernetes显得有些笨重,即使是“玩具”性质的 minikube、kind,对电脑也有比较高的要求,会“吃”掉不少的计算资源,属于“大材小用”。

那到底有没有这样的工具,既像 Docker 一样轻巧易用,又像 Kubernetes 一样具备容器编排能力呢?

本文所用的docker-compose就刚好满足刚才的需求,是一个在单机环境里轻量级的容器编排工具,填补了 Docker 和 Kubernetes 之间的空白位置。

什么是docker-compose

docker-compose是一种容器编排技术,也使用YAML,但它的基因与 Kubernetes 完全不同,走的是 Docker 的技术路线,所以在设计理念和使用方法上有差异就不足为怪了。

docker-compose 自身的定位是管理和运行多个 Docker 容器的工具,很显然,它没有 Kubernetes 那么“宏伟”的目标,只是用来方便用户使用 Docker 而已,所以学习难度比较低,上手容易,很多概念都是与 Docker 命令一一对应的。

如何用docker-compose

docker-compose 的安装非常简单,它在 GitHub(https://github.com/docker/compose)上提供了多种形式的二进制可执行文件,支持 Windows、macOS、Linux 等操作系统,也支持 x86_64、arm64 等硬件架构,可以直接下载。

下面给出了Linux上安装的shell命令:

# intel x86_64
sudo curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 \
          -o /usr/local/bin/docker-compose

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

不过wsl是使用docker desktop for windows的docker engine,是直接就有docker-compose的。

安装完成之后,来看一下它的版本号,命令是 docker-compose version,用法和 docker version 是一样的:

docker-compose version

在这里插入图片描述

安装好docker-compose之后,我们就可以通过编写YAML文件来管理容器了。

docker-compose 里管理容器的核心概念是“service”。虽然Kubernetes里也有Service,但却是完全不同的东西。docker-compose 里的“service”就是一个容器化的应用程序,通常是一个后台服务,用 YAML 定义这些容器的参数和相互之间的关系。对于service的YAML文件字段定义,可见docker官网的详细说明文档。

下面继续以搭建WordPress网站为例,来看看docker-compose是如何方便地部署。

WordPress 网站搭建步骤

本次案例的架构图和玩转docker实战(一):多个docker的网站搭建一样,如下图所示。

【云原生】玩转docker实战(二):单机环境的容器编排工具docker-compose_第1张图片

实验环境

  • 适用于 Linux 的 Windows 子系统 (WSL)
  • docker
  • docker-compose

第一步:定义MariaDB数据库

首先还是先定义数据库MariaDB,环境变量的写法与 Kubernetes 的 ConfigMap 有点类似,但使用的字段是 environment,直接定义,不用再“绕一下”:

services:

  mariadb:
    image: mariadb
    container_name: mariadb
    restart: always

    environment:
      MARIADB_DATABASE: db
      MARIADB_USER: wp
      MARIADB_PASSWORD: 123
      MARIADB_ROOT_PASSWORD: 123

和之前的docker命令进行对比,可以看到environment中定义的变量,也就是命令中的–env,两者非常的类似

docker run -d --rm \
    --env MARIADB_DATABASE=db \
    --env MARIADB_USER=wp \
    --env MARIADB_PASSWORD=123 \
    --env MARIADB_ROOT_PASSWORD=123 \
    mariadb

第二步:定义WordPress网站

第二步是定义 WordPress 网站,它也使用 environment 来设置环境变量:


services:
  ...
  
  wordpress:
    image: wordpress
    container_name: wordpress
    restart: always

    environment:
      WORDPRESS_DB_HOST: mariadb  #注意这里,数据库的网络标识
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: 123
      WORDPRESS_DB_NAME: db

    depends_on:
      - mariadb

不过,因为 docker-compose 会自动把 MariaDB 的名字用做网络标识,所以在连接数据库的时候(字段 WORDPRESS_DB_HOST)就不需要手动指定 IP 地址了,直接用“service”的名字 mariadb 就行了。这是 docker-compose 比 Docker 命令要方便的一个地方,和 Kubernetes 的域名机制很像。

WordPress 定义里还有一个值得注意的是字段 depends_on,它用来设置容器的依赖关系,指定容器启动的先后顺序,这在编排由多个容器组成的应用的时候是一个非常便利的特性。

第三步:定义Nginx反向代理

第三步就是定义 Nginx 反向代理了,不过很可惜,docker-compose 里没有 ConfigMap、Secret 这样的概念,要加载配置还是必须用外部文件,无法集成进 YAML。

Nginx 的配置文件和玩转docker实战(一):多个docker的网站搭建里也差不多,同样的,在 proxy_pass 指令里不需要写 IP 地址了,直接用 WordPress 的名字就行:


server {
  listen 80;
  default_type text/html;

  location / {
      proxy_http_version 1.1;
      proxy_set_header Host $host;
      proxy_pass http://wordpress;  #注意这里,网站的网络标识
  }
}

然后我们就可以在 YAML 里定义 Nginx 了,加载配置文件用的是 volumes 字段,和 Kubernetes 一样,但里面的语法却又是 Docker 的形式:

services:
  ...
  
  nginx:
    image: nginx
    container_name: nginx
    hostname: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - ./proxy.conf:/etc/nginx/conf.d/default.conf

    depends_on:
      - wordpress

到这里,三个“service”就都定义好了,所以目前wp-compose.yaml文件的内容如下图所示:

【云原生】玩转docker实战(二):单机环境的容器编排工具docker-compose_第2张图片

然后用 docker-compose up -d启动网站,记得还是要用 -f 参数指定 YAML 文件:

docker-compose -f wp-compose.yaml up -d

启动之后,用 docker-compose -f wp-compose.yaml ps 来查看状态:

在这里插入图片描述

当然,如果你想进一步验证这些容器的网络是否互通(通过网络标识),可以docker-compose exec 进入容器内部。

由于本文使用的Nginx镜像tag是alpine,里面有很多小工具,包括ping。如果直接安装默认的Nginx镜像,是没有ping的。

docker-compose -f wp-compose.yml exec -it nginx sh

【云原生】玩转docker实战(二):单机环境的容器编排工具docker-compose_第3张图片

从上图可以看到,分别 ping 了 mariadb 和 wordpress 这两个服务,网络都是通的,不过它的 IP 地址段用的是“172.22.0.0/16”,和 Docker 默认的“172.17.0.0/16”不一样。

呈现结果

这时候,我们就可以在主机浏览器地址栏输入http://127.0.0.1,访问到WordPress页面了。

【云原生】玩转docker实战(二):单机环境的容器编排工具docker-compose_第4张图片

你可能感兴趣的:(【云原生】,docker,云原生,容器)