• 【云原生】玩转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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    docker-compose version
    
    • 1

    在这里插入图片描述

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

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

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

    WordPress 网站搭建步骤

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

    在这里插入图片描述

    实验环境
    • 适用于 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    和之前的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    第二步:定义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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    不过,因为 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;  #注意这里,网站的网络标识
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后我们就可以在 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    在这里插入图片描述

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

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

    启动之后,用 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
    
    • 1

    在这里插入图片描述

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

    呈现结果

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

    在这里插入图片描述

  • 相关阅读:
    AWVS+BP+XRAY三层联动扫描漏洞
    go slice不同初始化方式性能&数组比较
    新版Java开发工具IntelliJ IDEA 2023 for Mac中文版软件介绍
    高速人工智能无人机首次击败世界冠军赛车手
    力扣练习——60 二叉搜索子树的最大键值和
    【面试题】 JS手写ES6的Object.create方法
    (vue)Js 获取剪贴板值
    English语法_介词 - by
    面向对象编程原则(07)——接口隔离原则
    书生·浦语 大模型(学习笔记-7)LMDeploy 量化部署 LLM-VLM 实践
  • 原文地址:https://blog.csdn.net/qq_41950508/article/details/127925532