文章目录
- 什么是docker compose?
- 为什么要使用docker compose?
- docker compose的功能
- 使用步骤
- 核心功能
- docker compose使用场景
- Docker Compose命令清单
- Docker Compose 命令格式
- 操作演示
- 创建一个Compose目录
- 创建一个docker-compose.yml文件
- 创建首页目录,编辑内容
- 启动服务
- 停止服务
- 删除服务
什么是docker compose?
对于这个内容来说,这是一个docker官方提供的一个开源的项目,内部是使用python进行编写的,实际上是调用了docker服务内部的API对于容器进行管理和编排
简单来说,就是可以运行多个docker容器的应用
在docker-compose中有两个比较重要的概念
- 服务:一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
- 项目:由一组关联的应用容器组成的一个完整业务单元,它会被组织为compose.yml,在整个compose.yml中会定义一个项目
compose默认管理对象是项目,通过子命令对于项目中的一组容器进行便捷的生命周期的管理
具体的含义可以理解为下图所示:
为什么要使用docker compose?
docker是一个轻量化的应用程序,在docker官方推荐每一个docker容器中只运行一个进程
d按时事实上,如果一个应用需要牵扯到mysql,nginx的环境,那么就需要给应用,数据库和nginx分别创建独立的docker容器,分别进行存储,启动容器
那么带来的问题是,如果docker中这些容器都是分散的,那么会导致的是不方便对于镜像进行管理,因此就需要有一个统一的内容来对于docker进行管理,因此就有了docker-compose
docker compose的功能
使用步骤
- 使用docker-compose.yml定义构成应用程序的服务,这样就可以在隔离的环境下进行运行
- 指定docker compose up命令,启动整个应用程序
核心功能
对于compose来说,它的功能之一是进行管理应用程序的生命周期,下面展示出对于一些管理证明周期的命令
- 启动,停止,重建服务
- 查看正在运行的状态
- 流式传输运行服务的日志输出
- 在服务上运行一次性命令
docker compose使用场景
它的使用场景还是比较广泛的,比如在单主机部署上,可以快速搭建出一个单节点开发或者测试环境,方便进行使用,也可以使用在环境隔离的场景下,通过指定出project来运行不同的环境,实现出一个隔离的目的
Docker Compose命令清单
- docker compose bulid:构建服务
- docker compose config:规范的格式来显示服务配置
- docker compose cp:在本地系统和服务容器直接拷贝文件
- docker compose create:创建服务的容器
- docker compose down:停止所有容器,并删除容器
- docker compose events:从服务器获取实时事件
- docker compose exe:在容器中执行命令
- docker compose images:列出所有容器使用的镜像
- docker compose kill:强制停止服务的容器
- docker compose logs:显示日志
- docker compose ls:显示所有项目
- docker compose pause:暂停服务
- docker compose port:列出所有端口映射
- docker compose ps:该命令可以列出当前使用的所有容器
- docker compose pull:拉取服务镜像
- docker compose push:推送服务镜像
- docker compose restart:重启或者重启某个服务
- docker compose rm:删除服务停止的容器
- docker compose run:在指定服务容器上执行相关的命令
- docker compose start:启动当前停止的某个容器
- docker compose stop:停止当前运行的某个容器
- docker compose top:显示运行的进程
- docker compose unpause:恢复服务
- docker compose up:up命令可以构建,创建,启动,链接一个服务相关的容器,默认情况下会认为这个容器是存在的,并且会尝试停止并尝试重新构建,使用之前挂载的卷,而其中选项–no-recreate参数可以让容器不被停止或者重新创建,-d表示后台运行
- docker compose version:查看版本
Docker Compose 命令格式
对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器,如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令的影响
在Docker-Compose命令的基本格式是:
docker compose [options] command [args...]
常见选项:
- -f,–file指定使用的Compose模板文件,默认是docker-compose.yml,可以多次指定
- -p,–project-name,指定项目名称,默认将使用所在目录作为项目名
操作演示
下面基于上述的这些命令,完成一些案例演示
创建一个Compose目录
root@VM-24-7-ubuntu:~# mkdir -p /data/myworkdir/compose/base
root@VM-24-7-ubuntu:~# cd /data/myworkdir/compose/base/
创建一个docker-compose.yml文件
version: '3.8'
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
ports:
- 8979:80
networks:
- mytestnet
volumes:
- ./mynginxhome:/usr/share/nginx/html
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "123456"
networks:
- mytestnet
volumes:
- /data/zbh/mysqldata/varlib/:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 10
redis:
image: redis:7
networks:
- mytestnet
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 10
networks:
mytestnet:
下面针对于上面的配置信息进行解释:
版本声明
version: '3.8'
指定了Compose文件的版本,这里是3.8版。不同版本支持的功能有所不同,选择合适的版本以匹配您的Docker环境和需求。
服务定义
Web服务
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
ports:
- 8979:80
networks:
- mytestnet
volumes:
- ./mynginxhome:/usr/share/nginx/html
depends_on:
- mysql
- redis
- image: 使用nginx镜像,版本1.24.0作为Web服务器。
- environment: 设置环境变量
TEST
值为1。 - ports: 映射容器端口80到宿主机的8979端口,以便外部访问。
- networks: 加入名为
mytestnet
的网络。 - volumes: 挂载本地目录
./mynginxhome
到容器内的/usr/share/nginx/html
,用于存放Nginx服务的网页文件。 - depends_on: 表明该服务依赖于
mysql
和redis
服务,这两个服务需要先启动。
MySQL服务
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
networks:
- mytestnet
volumes:
- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 10
- image: 使用MySQL 5.7镜像。
- environment: 设置MySQL的root用户密码。
- networks: 同样加入
mytestnet
网络,便于服务间通信。 - volumes: 将宿主机上的数据目录挂载到容器的MySQL数据目录,以持久化数据库数据。
- healthcheck: 健康检查配置,每隔10秒执行一次
mysqladmin ping
命令检查服务健康状态,如果在5秒内没有响应则认为失败,总共尝试10次。
Redis服务
redis:
image: redis:7
networks:
- mytestnet
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 10
- image: 使用Redis 7镜像。
- networks: 加入
mytestnet
网络。 - healthcheck: 类似MySQL,通过执行
redis-cli ping
来检查Redis服务的健康状况。
网络定义
networks:
mytestnet:
定义了一个名为mytestnet
的自定义网络,所有服务都将连接到此网络,以实现服务间的相互通信而无需暴露不必要的端口到公网
创建首页目录,编辑内容
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# mkdir -p ./mynginxhome
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# ls
docker-compose.yml mynginxhome
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# cd ./mynginxhome/
root@VM-24-7-ubuntu:/data/myworkdir/compose/base/mynginxhome# echo hello docker-compose.yml > index.html
启动服务
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# docker compose up -d
WARN[0000] /data/myworkdir/compose/base/docker-compose.yml: `version` is obsolete
[+] Running 28/28
✔ redis Pulled 7.2s
✔ 09f376ebb190 Already exists 0.0s
✔ 9ae6a7172b01 Pull complete 4.4s
✔ 2c310454138b Pull complete 4.5s
✔ 3eba9ec960aa Pull complete 4.8s
✔ 3d36c165ff0a Pull complete 5.7s
✔ 493d196d734f Pull complete 5.7s
✔ 4f4fb700ef54 Pull complete 5.8s
✔ 484e0560ae90 Pull complete 5.9s
✔ web Pulled 9.4s
✔ 04e7578caeaa Pull complete 6.9s
✔ 57a1056ea484 Pull complete 8.2s
✔ 6989106bacf0 Pull complete 8.2s
✔ c00d1142b331 Pull complete 8.3s
✔ cb49393af980 Pull complete 8.4s
✔ 5ac1ebd8aebe Pull complete 8.4s
✔ mysql Pulled 12.8s
✔ 20e4dcae4c69 Pull complete 4.2s
✔ 1c56c3d4ce74 Pull complete 4.3s
✔ e9f03a1c24ce Pull complete 4.5s
✔ 68c3898c2015 Pull complete 5.0s
✔ 6b95a940e7b6 Pull complete 5.1s
✔ 90986bb8de6e Pull complete 5.2s
✔ ae71319cb779 Pull complete 6.5s
✔ ffc89e9dfd88 Pull complete 6.6s
✔ 43d05e938198 Pull complete 11.6s
✔ 064b2d298fba Pull complete 11.8s
✔ df9a4d85569b Pull complete 11.8s
[+] Running 4/4
✔ Network base_mytestnet Created 0.1s
✔ Container base-redis-1 Started 1.4s
✔ Container base-mysql-1 Started 1.4s
✔ Container base-web-1 Started 1.5s
此时,进行访问就已经可以访问到了:
停止服务
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5a00dff5e97 nginx:1.24.0 "/docker-entrypoint.…" 59 seconds ago Up 57 seconds 0.0.0.0:8979->80/tcp, :::8979->80/tcp base-web-1
510bad9ef366 redis:7 "docker-entrypoint.s…" 59 seconds ago Up 57 seconds (healthy) 6379/tcp base-redis-1
87de525d892c mysql:5.7 "docker-entrypoint.s…" 59 seconds ago Up 57 seconds (healthy) 3306/tcp, 33060/tcp base-mysql-1
7d4a54e662b9 busybox "sh" 22 hours ago Up 21 hours netcontainer2
e33f58442fbf busybox "sh" 22 hours ago Up 21 hours netcontainer
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# docker compose stop
WARN[0000] /data/myworkdir/compose/base/docker-compose.yml: `version` is obsolete
[+] Stopping 3/3
? Container base-web-1 Stopped 10.3s
? Container base-mysql-1 Stopped 1.9s
? Container base-redis-1 Stopped 0.3s
删除服务
root@VM-24-7-ubuntu:/data/myworkdir/compose/base# docker compose down
WARN[0000] /data/myworkdir/compose/base/docker-compose.yml: `version` is obsolete
[+] Running 4/4
✔ Container base-web-1 Removed 0.0s
✔ Container base-mysql-1 Removed 0.0s
✔ Container base-redis-1 Removed 0.0s
✔ Network base_mytestnet Removed 0.2s