目录
服务定义: Compose 文件中的每个顶级键定义一个服务。每个服务可以基于一个 Docker 镜像运行,并包含特定的配置,如端口映射、环境变量等。
根据上期容器化奇迹:打开创新之门,加速业务发展的秘密武器,受到了广泛的欢迎,看来还是有许多小伙伴对容器非常感兴趣,那么在这片文章里,我会详细给大家聊聊一款容器的编排工具,docker-compose
我先来给大家介绍一下,什么是docker-compose
1、docker-compose就像一张大章鱼,把docker比做成一个一个的集装箱,这个大章鱼有很多触手管控着这么多的集装箱,这个大章鱼是一个用于定义和运行多容器 Docker 应用程序的工具。通过使用docker-compose,你可以使用简单的 YAML 文件定义整个应用程序的服务、网络和卷等配置,然后使用单个命令启动或停止整个应用程序。
2、这里要注意了,docker-compose只是一款单机版的容器编排工具,也就是说它只能在本地服务器操作,无法实现夸服务器管理容器,当然这也是有办法解决的,敬请关注下一篇文章:掌握Kubernetes:构建弹性、可扩展、自动化的容器化部署与管理
一、docker-compose安装
下载地址:小编这里使用Debian操作系统
https://docs.docker.com/desktop/install/debian/
开始安装
apt install gnome-terminal
apt-get update
apt-get install ./docker-desktop-<version>-<arch>.deb
在安装过程中,可能会出现一个错误,这里我们忽略这个错误
N: Download is performed unsandboxed as root, as file '/home/user/Downloads/docker-desktop.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
启动Docker桌面
systemctl --user start docker-desktop
docker compose version
Docker Compose version v2.17.3
docker --version
Docker version 23.0.5, build bc4487a
docker version
Client: Docker Engine - Community
Cloud integration: v1.0.31
Version: 23.0.5
API version: 1.42
<...>
开机自动启动
systemctl --user enable docker-desktop
二、docker-compose使用流程
1、docker-compose使用流程
1) 规划目录
[root@localhost ~]# mkdir /opt/demoCompose
2) 编写docker-compose.yml文件
[root@localhost demoCompose]# cat docker-compose.yml
version: '3'
services:
web:
image: nginx
redis:
image: redis
服务定义: Compose 文件中的每个顶级键定义一个服务。每个服务可以基于一个 Docker 镜像运行,并包含特定的配置,如端口映射、环境变量等。
version: '3' 这里代表版本是3的版本
services: 定义一个服务
web:服务的名称(自己随便定义,没有什么要求)
image: nginx: 镜像使用nginx镜像,为了提高速度建议提前准备好此镜像
3) 创建容器
[root@localhost demoCompose]# docker compose up -d
容器命名规则:
当前目录_容器名称_数字
4)查看创建好的容器
[root@localhost demoCompose]# docker compose ps -a
Name Command State Ports
-----------------------------------------------------------------------
democompose_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
democompose_web_1 /docker-entrypoint.sh ngin ... Up 80/tcp
2、docker-compose常用管理操作
- 创建容器
# docker-compose up -d
参数:
1) --scale web=2
横向扩展,将名称为web的容器启动两个
2)-f选项
默认名称为docker-compose.yml文件,-f可指定其他文件名,不建议使用
- 查看容器
# docker-compose ps
- 容器启动管理操作
# docker compose {start|stop|restart}
- 停止并删除容器
# docker-compose down
- 查看容器的进程信息
# docker-compose top
- docker-compose build
当目录下的dockerfile发生变动时,默认情况下,docker-compose并不会重构镜像,需要执行该命令手动重新构建,再执行docker-compose up -d重建容器
[root@localhost testCompose]# tree ./
./
├── docker-compose.yml
├── Dockerfile
├── file01.txt
└── file02.txt
[root@localhost testCompose]# cat docker-compose.yml
version: '3'
services:
web_server:
build: ./
[root@localhost testCompose]# cat Dockerfile
FROM nginx:latest
ADD file01.txt /tmp
ADD file02.txt /tmp
三、docker-compose.yml文件
注意:编写这个文件的时候要严格根据yml语法进行,否则会出现错误
1、整体结构
- version
- 指定docker-compose API的版本
- version: "3"
- Docker官方文档
- services
- 描述创建容器信息
- networks
- 定义容器网络信息
- volumes
- 定义数据卷
version: "3"
services:
容器名称:
.........
.........
容器名称:
.............
.............
networks:
volumes:
2、容器名称下面的指令
- 指定镜像名称
image: 镜像名称
- 指定数据卷,持久化存储
volumes:
- 物理目录:容器目录
- 物理目录:容器目录
- 创建容器时,执行的操作
command: "shell命令"
- 指定容器的网络连接
links:
- 容器名称:别名
- 发布服务
ports: - 物理机端口:容器端口
- 指定容器的服务端口
expose: - 端口
- 传递环境变量
environment: key: value key: value
- 定义容器的依赖关系
depends_on: - 容器名称 - 容器名称
- 定义容器部署参数
deploy: replicas: 3
参数说明:
- replicas
- 指定容器的副本数
- 容器的资源限制
resources: limits: cpus: "0.50" memory: 50M reservations: cpus: "0.25" memory: 20M
参数说明:
- limits: 硬限制
- reservations: 软限制
- 容器进行健康状态检测
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 10s timeout: 10s retries: 3 start_period: 40s
- 容器网络模式
network_mode: "bridge" network_mode: "host" network_mode: "none"
案例: 配置web集群
[root@localhost webCompose]# pwd /root/webCompose [root@localhost webCompose]# tree ./ ./ ├── docker-compose.yml ├── haproxy.cfg ├── webA │ └── index.html └── webB └── index.html
global maxconn 2000 nbproc 4 daemon defaults retries 3 timeout connect 5s timeout client 10s timeout server 30s timeout check 2s listen web_service bind 0.0.0.0:8888 mode http balance roundrobin server web01 webA:80 server web02 webB:80
version: "3" services: webA: image: nginx:1.14 expose: - 80 volumes: - ./webA/index.html:/usr/local/nginx/html/index.html webB: image: nginx:1.14 expose: - 80 volumes: - ./webB/index.html:/usr/local/nginx/html/index.html web_haproxy: image: haproxy depends_on: - webA - webB links: - webA:webA - webB:webB volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg ports: - 80:8888