目录

什么是 Docker Compose

Docker Compose 的功能

Docker Compose 使用场景

Docker Compose 文件(docker-compose.yml)

Docker Compose 命令清单

常见命令说明

操作案例

总结


什么是 Docker Compose

docker-compose Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。
docker-compose 中有两个非常重要的概念 :
服务 ( service ) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 ( project ) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义 , 整个 docker-compose.yml 定义一个项目。 Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 通过 compose 可以方便的管理多个服务。
为什么要 Docker Compose
Docker 是一个轻量化的应用程序, Docker 官方推荐每个 Docker 容器中只运行一个进程
如果一个应用需要涉及到 MySQL nginx 等环境, 那么我们需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后分别启动容器。
想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run三次, 或者写一些脚本来实现, 这样会比较繁琐。
另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker-compose 来解决这类型的问题。
Docker Compose 的安装
安装 docker 的时候,我们默认已经安装了 docker-compose,安装的组件包名称为 docker-compose-plugin ,此处不再赘述
Shell
# 检查安装是否成功
root@139-159-150-152:/data/myworkdir/compose# docker compose
version
Docker Compose version v2.16.0

Docker Compose 的功能

1. 使用步骤
Compose 使用的步骤:
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker compose up 命令来启动并运行整个应用程序。
2. 核心功能
Compose 具有管理应用程序整个生命周期的命令:
启动,停止和重建服务
查看正在运行的服务的状态
流式传输运行服务的日志输出
在服务上运行一次性命令

Docker Compose 使用场景

单主机部署
快速搭建一个单节点开发或者测试环境,方便使用。
不同环境隔离
通过指定 project 来运行不同的环境,实现隔离的目的。

Docker Compose 文件(docker-compose.yml)

文件基本结构及常见指令
YAML
version: "3.8" # 定义版本, 表示当前使用的 docker-compose 语法的版本
services: # 服务,可以存在多个
servicename: # 服务名字,它也是内部 bridge 网络可以使用的 DNS name, 如果不是集群模式相当于 docker run 的时候指定的一个名称
# 集群( Swarm )模式是多个容器的逻辑抽象
image: # 必选,镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD 命令
environment: # 可选,等价于 docker container run 里的 --env 选项设置环境变量
volumes: # 可选,等价于 docker container run 里的 -v 选项 绑定数据卷
networks: # 可选,等价于 docker container run 里的 --network 选项指定网络
ports: # 可选,等价于 docker container run 里的 -p 选项指定端口映射
expose: # 可选,指定容器暴露的端口
build: # 构建目录
depends_on: # 服务依赖配置
env_file: # 环境变量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#...
volumes: # 可选,等价于 docker volume create
networks: # 可选,等价于 docker network create
image
指定容器运行的镜像。以下格式都可以:

image: redis
image: redis:5
image: 
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
command
覆盖容器启动的默认命令。
Shell
command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000
entrypoint
覆盖容器默认的 entrypoint
Shell
entrypoint: /code/entrypoint.sh
也可以是以下格式:
Shell
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non
zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True False
Shell
#map 语法
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
# 数组语法
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
networks
指定容器运行的网络:
配置容器网络
Shell
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
monitoring:
image: awesome/monitoring
networks:
- admin
backend:
image: awesome/backend
networks:
back-tier:
aliases:
- database
admin:
aliases:
- mysql
networks:
front-tier:
back-tier:
admin:
配置网络驱动和子网信息
Shell
services:
frontend:
image: awesome/webapp
networks:
front-tier:
ipv4_address: 172.16.238.10
networks:
front-tier:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
volumes
将主机的数据卷或者文件挂载到容器里。
Shell
# 短语法
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
# 完整语法
services:
backend:
image: awesome/backend
volumes:
- type: volume
# 命名卷
source: db-data
target: /data
volume:
nocopy: true
# 绑定卷
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
volumes:
db-data:
ports
指定端口映射。以下格式都可以:
Shell
# 完整语法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
published: 8000-9000
protocol: tcp
mode: host
# 短语法
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
Shell
expose:
- "3000"
- "8000"
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
Shell
version: "3.7"
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile args
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
context :上下文路径。
dockerfile :指定构建镜像的 Dockerfile 文件名。
args :添加构建参数,这是只能在构建过程中访问的环境变量。
labels :设置构建镜像的标签。
depends_on
设置依赖关系。
docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db
redis ,才会启动 web
docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,
docker compose up web 还将创建并启动 db redis
docker compose stop :按依赖关系顺序停止服务。在以下示例中, web db
redis 之前停止。
Shell
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
可以指定条件, healthy 需要配置 healthcheck 来完成
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
health check 样例
Shell
version: "3.8"
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
volumes:
- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck :
test: mysql --user=root --password='bit@123' -e "SELECT 1;"
interval: 10s
timeout: 5s
retries: 10
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
Shell
env_file: .env

Docker Compose 命令清单

Docker Compose 有很多命令,但是常用的就几个,这里列出一些,有需要额外学习的可以去docker官网学习

docker compose build
构建服务
docker compose config
规范的格式来显示服务配置
docker compose cp
在本地系统和服务容器直接拷贝文件
docker compose create
创建服务的容器
docker compose down
停止所有容器,并删除容器
docker compose exec
在容器中执行命令
docker compose
images
列出所有容器使用的镜像
docker compose kill
强制停止服务的容器
docker compose ls
显示所有项目
docker compose pause
docker compose pause
命令格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
docker-compose 命令的基本的使用格式为
docker compose [OPTIONS] COMMAND [ARGS...]
常见选项说明
-f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定
-p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名

常见命令说明

up
该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
Shell
docker compose up [options] [SERVICE...]
-d 在后台运行服务容器, 推荐在生产环境下使用该选项
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用
down
停止所有容器,并删除容器和网络
docker compose down [options] [SERVICE...]
-v, --volumes 删除容器同时删除目录映射
run
该命令可以在指定服务容器上执行相关的命令
Shell
# 例如 : 启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]
-d 后台运行容器
--name NAME 为容器指定一个名字
--entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变
-u, --user="" 指定运行容器的用户名或者 ui
--rm 运行命令后自动删除容器
-p, --publish=[] 映射容器端口到本地主机

操作案例

1. 创建 compose 目录

mkdir -p /data/myworkdir/compose/base
cd /data/myworkdir/compose/base
2. 进入 base 目录 , 创建 docker-compose.yml 文件
cd /data/myworkdir/compose/base/
vi docker-compose.yml
3. 输入一下内容
version: 3.8
services:web:image: nginx:1.24.0environment:TEST: 1ports:- 8979:80networks:
- mytestnetvolumes:- ./mynginxhome:/usr/share/nginx/htmldepends_on:mysql:condition: service_healthy redis:condition: service_healthymysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: "bit@123"networks:- mytestnetvolumes:- /data/maxhou/mysqldata/varlib/:/var/lib/mysqlhealthcheck:test: mysql --user=root --password='bit@123' -e "SELECT 1;"interval: 10stimeout: 5sretries: 10redis:image: redis:7networks:- mytestnethealthcheck:test: redis-cli pinginterval: 10stimeout: 5sretries: 10
networks:mytestnet:
4. 输入 docker config 会做检查        
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
config
version must be a string
5. 我们修改错误信息,将版本转为字符串,再次检查,检查通过
6. 创建首页目录,编辑首页内容
Shell
root@139-159-150-152:/data/myworkdir/compose/base# mkdir - p ./mynginxhome
root@139-159-150-152:/data/myworkdir/compose/base# cd ./mynginxhome/
root@139-159-150-152:/data/myworkdir/compose/base/mynginxhome#
echo "Hello bit" > index.html
7. 启动服务        
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
up -d
8. 停止服务
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
stop
10. 启动服务
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
start
11. 删除服务
SQL
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
down

总结

当docker某个项目牵扯多个微服务容器时,可以使用compose技术,实现对服务的容器定制化设置、网络的搭建和连接,以及容器的启动停止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/83257.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/83257.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/83257.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全】轻量敏感路径扫描工具

订阅专栏,获取文末项目源码。 文章目录 工具简介工具特点项目结构使用方法1.环境准备2.配置目标URL3.运行扫描4.结果查看5.自定义扩展项目源码工具简介 该工具是一款基于Python的异步敏感路径扫描工具,用于检测目标网站是否存在敏感文件或路径泄露(如配置文件、密钥、版本控…

SpringAI+DeepSeek大模型应用开发实战

内容来自黑马程序员 这里写目录标题 认识AI和大模型大模型应用开发模型部署方案对比模型部署-云服务模型部署-本地部署调用大模型什么是大模型应用传统应用和大模型应用大模型应用 大模型应用开发技术架构 SpringAI对话机器人快速入门会话日志会话记忆 认识AI和大模型 AI的发…

高温炉制造企业Odoo ERP实施规划与深度分析报告

摘要 本报告旨在为高温炉生产企业提供一个基于Odoo 18平台的企业资源规划(ERP)系统实施的全面分析与规划。报告首先系统梳理了高温炉制造业独特的业务流程特点,随后详细映射了Odoo 18各核心模块功能与这些业务需求的匹配程度。重点分析了生产…

简述什么是全局锁?它的应用场景有哪些?

全局锁是数据库管理系统中的一种特殊锁机制,用于对整个数据库实例进行加锁,使数据库处于只读状态,阻止所有数据更新(DML)、数据定义(DDL)及更新类事务提交等操作。 其核心应用场景包括&#xf…

window 显示驱动开发-呈现开销改进(二)

对共享表面的纹理格式支持 驱动程序应支持共享资源和可共享的后台缓冲区,以使用 DXGI_FORMAT 枚举中的这些附加纹理格式: DXGI_FORMAT_A8_UNORMDXGI_FORMAT_R8_UNORMDXGI_FORMAT_R8G8_UNORMDXGI_FORMAT_BC1_TYPELESS\*DXGI_FORMAT_BC1_UNORMDXGI_FORMAT…

jenkins集成gitlab实现自动构建

jenkins集成gitlab实现自动构建 前面我们已经部署了Jenkins和gitlab,本文介绍将二者结合使用 项目源码上传至gitee提供公网访问:https://gitee.com/ye-xiao-tian/my-webapp 1、创建一个群组和项目 2、添加ssh密钥 #生成密钥 [rootgitlab ~]# ssh-keyge…

barker-OFDM模糊函数原理及仿真

文章目录 前言一、巴克码序列二、barker-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、barker-OFDM 模糊函数②、barker-OFDM 距离分辨率③、barker-OFDM 速度分辨率④、barker-OFDM 等高线图 四、资源自取 前言 本文进行 …

深入解析 Redis Cluster 架构与实现(一)

#作者:stackofumbrella 文章目录 Redis Cluster特点Redis Cluster与其它集群模式的区别集群目标性能hash tagsMutli-key操作Cluster Bus安全写入(write safety)集群节点的属性集群拓扑节点间handshake重定向与reshardingMOVED重定向ASK重定向…

linux centos 服务器性能排查 vmstat、top等常用指令

背景:项目上经常出现系统运行缓慢,由于数据库服务器是linux服务器,记录下linux服务器性能排查常用指令 vmstat vmstat介绍 vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这…

在IIS上无法使用PUT等请求

错误来源: chat:1 Access to XMLHttpRequest at http://101.126.139.3:11000/api/receiver/message from origin http://101.126.139.3 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 其实我的后…

Python训练第四十一天

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 →…

Linux线程同步实战:多线程程序的同步与调度

个人主页:chian-ocean 文章专栏-Linux Linux线程同步实战:多线程程序的同步与调度 个人主页:chian-ocean文章专栏-Linux 前言:为什么要实现线程同步线程饥饿(Thread Starvation)示例:抢票问题 …

5.2 初识Spark Streaming

在本节实战中,我们初步探索了Spark Streaming,它是Spark的流式数据处理子框架,具备高吞吐量、可伸缩性和强容错能力。我们了解了Spark Streaming的基本概念和运行原理,并通过两个案例演示了如何利用Spark Streaming实现词频统计。…

Go 即时通讯系统:日志模块重构,并从main函数开始

重构logger 上次写的logger.go过于繁琐,有很多没用到的功能;重构后只提供了简洁的日志接口,支持日志轮转、多级别日志记录等功能,并采用单例模式确保全局只有一个日志实例 全局变量 var (once sync.Once // 用于实现…

「数据采集与网络爬虫(使用Python工具)」【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 103 篇 - Date: 2025 - 06 - 01 Author: 郑龙浩/仟墨 文章目录 「据采集与网络爬虫」【使用工具:Python】一 数据采集1 数据采集综述(1)基本介绍(2)数据目标源(3)采集方式(4&am…

响应式系统与Spring Boot响应式应用开发

响应式系统概述 过去十年间,为应对移动和云计算的需求,软件行业通过改进开发流程来构建更稳定、健壮且灵活的软件系统。这种演进不仅服务于传统用户端(桌面/Web),还需支持多样化设备(手机、传感器等)。为应对这些挑战,多个组织共同制定了《响应式宣言》(2014年发布)…

POJO、DTO和VO:Java应用中的三种关键对象详解

在软件开发特别是Java开发中,常常会遇到POJO、DTO和VO这三类对象。它们在不同场景下扮演着重要角色,有助于优化代码结构、增强系统安全性和提升性能。本文将全面解析这三者的定义、区别及常见使用场景,帮助你更好地理解和应用。 1. POJO&…

leetcode付费题 353. 贪吃蛇游戏解题思路

贪吃蛇游戏试玩:https://patorjk.com/games/snake/ 问题描述 设计一个贪吃蛇游戏,要求实现以下功能: 初始化游戏:给定网格宽度、高度和食物位置序列移动操作:根据指令(上、下、左、右)移动蛇头规则: 蛇头碰到边界或自身身体时游戏结束(返回-1)吃到食物时蛇身长度增加…

NLP学习路线图(十三):正则表达式

在自然语言处理(NLP)的浩瀚宇宙中,原始文本数据如同未经雕琢的璞玉。而文本预处理,尤其是其中至关重要的正则表达式技术,正是将这块璞玉转化为精美玉器的核心工具集。本文将深入探讨正则表达式在NLP文本预处理中的原理…

计算机网络(4)——网络层

1.概述 1.1 网络层服务 (1) 网络层为不同主机(Host)之间提供了一种逻辑通信机制 (2)每个主机和路由器都运行网络层协议 发送方:将来自传输层的消息封装到数据报(datagram)中接收方:向传输层交付数据段(segment) 1.2 网络层核心功能 路由选择(routing…