当前位置: 首页 > news >正文

Docker——compose

在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个YAML文件来配置应用程序的服务、网络和卷,然后使用一个命令即可创建并启动所有容器

下载地址: https://github.com/docker/compose/releases

在 Docker Compose 的世界里,主要有三个核心概念:

  • 服务 (Services):定义应用中的各个组件。每个服务对应一个或多个容器(通常是一个容器),你可以指定它使用哪个镜像、暴露哪些端口、需要哪些环境变量等。

  • 网络 (Networks):定义容器之间如何通信。Compose 会自动为你的应用创建一个默认网络,容器之间可以通过服务名直接互相访问,这解决了手动链接容器的麻烦。

  • 卷 (Volumes):用于持久化存储数据。当容器删除后,卷中的数据不会丢失,这对于数据库等服务至关重要

解决的核心痛点
  • 简化操作:将原本需要多条docker run命令的复杂操作,简化成一条docker compose up

  • 环境一致性:通过一个配置文件固化所有容器的配置,确保开发、测试、生产环境高度一致,解决"在我电脑上明明是好的"这类问题。

  • 依赖管理:通过depends_on配置项,可以定义服务之间的启动顺序,确保数据库等依赖服务先启动

1、创建docker-compose文件

[root@Anolis2 compose]# cat docker-compose.yaml
version: '1.0'
services:
httpd:
restart: always
image: nginx
container_name: my-nginx
ports:
- 8888:80
environment:
TZ: Asia/Shanghai
volumes:
- /webroot:/var/www/html

2、启动删除

启动

[root@Anolis2 compose]# docker-compose up -d
WARN[0000] /opt/compose/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] up 2/2
✔ Network compose_default Created 0.3s
✔ Container my-nginx Started

删除

[root@Anolis2 compose]# docker-compose down
WARN[0000] /opt/compose/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] down 2/2
✔ Container my-nginx Removed 0.2s
✔ Network compose_default Removed

查看

[root@Anolis2 compose]# docker-compose ps

-f动态查看日志
[root@Anolis2 compose]# docker-compose logs -f

关键字:

image

指定为镜像名称或者镜像ID,如果本地不存在则自动拉取

image: httpd

image: a2b2c3d4

ports

暴露的端口(推荐字符串形式)

ports:

- "3000"

- "80:80"

- "127.0.0.1:80:80"

sysctls

配置容器内核参数

sysctls:

net.core.somaxconn: 1024

net.ipv4.tcp_syncookies: 0

sysctls:

- net.core.somaxconn=1024

- net.ipv4.tcp_syncookies=0

volumes

数据卷所挂载的路径设置,可以设置为宿主机路径,并可以设置访问模式(HOST:CONTAINER:ro)

volumes: #绝对路径映射

- /var/www/html

- /webroot:/var/www/html

- ~/webroot:/var/www/html:ro

networks

定义网桥

配置容器连接的网络

environment:

MYSQL_ROOT_PASSWORD: 123456

command: 覆盖镜像默认命令

docker run --name redis -d redis redis-server --appendonly yes

ulimits:

指定容器的ulimits限制的值

如: 进程最大数: 65535 soft软限制 应用可以修改 硬限不能超过

depends_on:

解决容器的依赖,启动顺序的问题

healthcheck:

检查命令,检查容器是否健康运行

build:

配合Dockerfile使用

查看网桥

[root@Anolis2 compose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
4cf9a5498e7e bridge bridge local
048a56fdbe2b compose_default bridge local
14c5ca7b6bf7 docker_gwbridge bridge local
f514dce8f745 host host local
vx087gslj0a0 ingress overlay swarm
76ff95406838 my-bridge-141 bridge local
fece4dc44e5b my-net bridge local
ca515278a1e2 none null local

示例:

redis: image: redis:5.0.10 container_name: redis ports: - "6379:6379" volumes: - redisdata:/data command: "redis-server --appendonly yes"
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
services: httpd: image: httpd container_name: apache depends_on: - db #服务名 - redis redis: image: redis db: image: mysql
healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost'] interval: 30s timeout: 10s
version: '1.0' services: httpd: restart: always build: #构建自定义镜像 context: ../ #dockerfile路径 dockerfile: Dockerfile #指定dockerfile名字 container_name: myweb ports: - 80:80 environment: TZ: Asia/Shanghai volumes: - /webroot:/var/www/html
http://www.jsqmd.com/news/503297/

相关文章:

  • NVIDIA GPU-02-CUDA核心与Tensor核心详解
  • 我试乘伦敦自动驾驶出租车:智能体能应对复杂路况吗?
  • 嵌入式RTOS裁剪禁区曝光(仅限内核开发者查阅):4类绝对禁止移除的同步原语与2个隐蔽的中断嵌套崩塌点
  • # 发散创新:用TensorFlow构建动态图神经网络实现社交关系预测在深度学习飞速发展的今天
  • 解锁自然语言编程:Open Interpreter本地代码执行完整指南
  • 独立站如何利用Twitter进行引流推广?完整实战指南(2026)
  • SiamRPN++实战:用ResNet-50打造高精度目标跟踪器(附代码详解)
  • RTK观测值处理避坑指南:伪距与载波相位测量的5个常见误区
  • 从8跳到3跳:EVPN 分布式网关让时延降低67%的完整实战
  • 紧急预警!CVE-2024-21893已触发多起固件劫持事件——C语言检测工具如何在编译前拦截恶意__attribute__((constructor))注入?
  • SVG格式转换全攻略:从基础操作到自动化流程
  • NVIDIA GPU-03-各型号对比指南
  • 终极解决方案:5分钟搞定知网文献批量下载与智能管理
  • 金仓数据库在MySQL迁移中的实践总结:成本优化与适配周期控制的技术路径复盘
  • 矩阵对角化实战:从理论到MATLAB实现
  • 基于DP动态规划的全局最优能量管理策略:以车辆构型为功率分流型的MATLAB m程序为例
  • Nanbeige 4.1-3B 嵌入式开发辅助:基于STM32项目生成C语言驱动代码
  • 利用快马平台快速构建openclaw安卓自动化工具原型
  • 金仓数据库在MySQL迁移中的技术观察:三层兼容机制与平滑替换路径复盘
  • **发散创新:用函数式思维重构不可变设施的配置管理**在现代分布式系统中,**不可变基础设施
  • 深入解析Java中的hashCode与equals方法:从理论到应用
  • 终极指南:如何使用Legacy iOS Kit解锁旧版iOS设备的无限可能
  • ESP8266数传模块实战:5分钟搞定PX4飞控的WIFI连接(附固件下载)
  • 保姆级教程:在N5095小主机上,用Ubuntu 22.04和Docker搞定Jellyfin硬解(附内核升级避坑)
  • 影刀RPA魔法指令实战:3种常见管理员权限报错及一键修复方案
  • 从人类视频到机器人动作:GROOT N1数据金字塔实战指南(含潜行动作提取教程)
  • 生成式AI助力无线视觉系统透视遮挡物体技术突破
  • C 语言函数核心精讲:从概念到 static/extern,一文吃透模块化编程
  • JetBrains Mono终极开发者字体:七年技术演进与完整功能解析
  • [特殊字符] Meixiong Niannian画图引擎保姆级教程:LoRA挂载+参数调优+图像保存全解析