docker compose简介
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | 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 文件中的值。