Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

1.简介

你听说过docker-compose吗?在萌叔看来,docker-compose相当于单机且简化版的k8s。
可以简单的编写一个yaml文件,在yaml文件指定多个container。然后可以通过docker-compose,一次性启动和停止多个服务。
它有几个应用场景:

  • 开发
  • 自动化测试
  • 持续集成

特别是自动化测试这个场景。比如有一个服务依赖数据库MySQL,要完成自动化测试,显然我们需要一个干净的MySQL。用k8s来完成服务和MySQL的部署成本太高,有点杀鸡用牛刀的感觉。并且多个人同时运行的话,还有可能产生冲突。docker-compose由于是单机运行,可以确保多人同时运行互相不冲突。

2.minio示例

该示例包含一个由4个container组成的minio集群,以及一个nginx container对外暴露minio集群的管理后台和API接口
Deploy MinIO on Docker Compose

创建本地目录

mkdir -p ~/mydata/minio/data1-1
mkdir -p ~/mydata/minio/data1-2
mkdir -p ~/mydata/minio/data2-1
mkdir -p ~/mydata/minio/data2-2
mkdir -p ~/mydata/minio/data3-1
mkdir -p ~/mydata/minio/data3-2
mkdir -p ~/mydata/minio/data4-1
mkdir -p ~/mydata/minio/data4-2

编写nginx的配置文件

~/mydata/minio/proxy.conf

upstream minio_console {
    server minio1:9001 max_fails=3 fail_timeout=5s;
    server minio2:9001 max_fails=3 fail_timeout=5s;
    server minio3:9001 max_fails=3 fail_timeout=5s;
    server minio4:9001 max_fails=3 fail_timeout=5s;
}
upstream minio_api {
    # 多个服务之间可以通过服务名称相互访问
    server minio1:9000 max_fails=3 fail_timeout=5s;
    server minio2:9000 max_fails=3 fail_timeout=5s;
    server minio3:9000 max_fails=3 fail_timeout=5s;
    server minio4:9000 max_fails=3 fail_timeout=5s;
}
server {
    listen          9001;  
    location / {
        proxy_pass              http://minio_console;
    }
}
server {
    listen          9000;
    location / {
        proxy_pass              http://minio_api;
    }
}

创建一个文件夹minio-distributed

mkdir minio-distributed

编写docker compose需要的YAML文件

在minio-distributed目录下编写文件docker-compose.yaml
在docker的体系中,以包含docker-compose.yaml文件的文件夹作为一个项目,文件夹的名称就是项目名称

# Settings and configurations that are common for all containers
# minio实例之间通过服务名称相互访问
x-minio-common: &minio-common
  image: quay.io/minio/minio:RELEASE.2022-10-20T00-55-09Z
  command: server --console-address ":9001" http://minio{1...4}/data{1...2}
  expose:
    - "9000"
    - "9001"
  # environment:
    # MINIO_ROOT_USER: minioadmin
    # MINIO_ROOT_PASSWORD: minioadmin
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3

# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
  minio1:  # 服务名称(由用户自定义)
    <<: *minio-common
    hostname: minio1
    volumes:
      - ~/mydata/minio/data1-1:/data1
      - ~/mydata/minio/data1-2:/data2

  minio2:   
    <<: *minio-common
    hostname: minio2
    volumes:
      - ~/mydata/minio/data2-1:/data1
      - ~/mydata/minio/data2-2:/data2

  minio3:
    <<: *minio-common
    hostname: minio3
    volumes:
      - ~/mydata/minio/data3-1:/data1
      - ~/mydata/minio/data3-2:/data2

  minio4:
    <<: *minio-common
    hostname: minio4
    volumes:
      - ~/mydata/minio/data4-1:/data1
      - ~/mydata/minio/data4-2:/data2

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ~/mydata/minio/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro
    ports:
      - "9000:9000"  # 对外部暴露端口
      - "9001:9001"
    depends_on:    # 指定服务之间的依赖关系,启动时时间上会有先后
      - minio1
      - minio2
      - minio3
      - minio4

启动&停止

创建资源&启动(运行在后台)

docker compose up -d

创建资源&启动(运行在前台)

docker compose up

显示启动的服务

docker compose ps

输出


红色框内的是容器名称,蓝色的是服务名称,服务之间可以使用服务名称相互访问。 大家可能已经注意到了容器名称为"{项目名}-{服务名}-{数字编号}"

每个compose项目使用独立的网络

docker network ls

输出

停止&清理资源

docker compose down

此命令会移除项目依赖的网络,并从磁盘上删除容器
相当于执行了

docker network rm <NETWORK>
docker rm -vf <CONTAINER>

其它常用命令

启动

docker compose start

停止

docker compose stop

查看对应服务的日志

docker compose logs <name-of-service>

Minio效果

可以在浏览器中访问minio的控制台

http://localhost:9001/

初始用户名和密码为 minioadmin

参考资料

1.docker-compose
2.Deploy MinIO on Docker Compose

后记

2024年03月1日 Docker Compose 支持从文件中自动加载环境变量,而无需在命令行中手动指定。
这通常通过使用一个名为 .env 的文件来实现。
例如,如果你的 docker-compose.yml 文件中有以下部分:

services:
  myservice:
    image: myimage
    environment:
      - MY_VARIABLE

然后在同一目录下创建一个名为 .env 的文件,并在其中设置 MY_VARIABLE 的值:

MY_VARIABLE=myvalue

当你使用 docker-compose up 启动服务时,.env 文件中定义的环境变量将自动加载到相应的服务中。

请注意:.env 文件中的环境变量会被自动加载,但如果在命令行中手动指定了某个环境变量,命令行中的值将覆盖 .env 文件中的值。


微信公众号

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注