首页 > 其他分享 >Docker Compose配置详解

Docker Compose配置详解

时间:2024-08-27 11:38:25浏览次数:4  
标签:容器 compose db Compose Docker docker 详解

1. 什么是Docker Compose?

Docker Compose是一种用于定义和运行多容器Docker应用程序的工具。通过一个docker-compose.yml文件,你可以配置应用程序的所有服务(例如,Web服务器、数据库、缓存)并轻松管理它们。

2. 基本Docker Compose命令

  • docker-compose up:启动并运行docker-compose.yml文件中定义的容器。
  • docker-compose down:停止并删除由docker-compose up创建的容器、网络和卷。
  • docker-compose build:构建或重新构建服务。
  • docker-compose stop:停止运行中的容器,但不删除它们。
  • docker-compose restart:重启服务。
  • docker-compose logs:显示所有服务或特定服务的日志。
  • docker-compose ps:列出容器。
  • docker-compose exec:在运行的容器中执行命令。
  • docker-compose run:对服务运行一次性命令。

3. Docker Compose文件结构 (docker-compose.yml)

docker-compose.yml文件是你定义应用程序服务、网络和卷的地方。下面是一个基本结构:

version: '3.8'  # Compose文件版本

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./web:/usr/share/nginx/html
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=80

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: example_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

4. 常见配置选项

a. version

指定Docker Compose文件格式的版本。常用版本为3.83.7等。

b. services

定义要运行的容器。每个服务运行一个镜像,可以定义端口、卷和环境变量。

c. image

指定要使用的服务镜像。你可以使用预构建的镜像,也可以通过Dockerfile构建自己的镜像。

d. build

指定一个目录从Dockerfile构建镜像:

build:
  context: .
  dockerfile: Dockerfile

e. ports

将容器端口映射到主机端口:

ports:
  - "80:80"  # 主机:容器

f. volumes

将主机路径或命名卷挂载到容器内部路径:

volumes:
  - ./web:/usr/share/nginx/html

g. environment

为容器设置环境变量:

environment:
  - MYSQL_ROOT_PASSWORD=example

h. networks

定义服务的自定义网络:

networks:
  frontend:
  backend:

5. 高级配置示例

a. 链接服务

你可以使用depends_on指令将服务链接在一起:

services:
  web:
    image: nginx
    depends_on:
      - db

  db:
    image: mysql

b. 定义自定义网络

version: '3.8'
services:
  web:
    image: nginx
    networks:
      - frontend
  db:
    image: mysql
    networks:
      - backend

networks:
  frontend:
  backend:

c. 使用多个Compose文件

你可以将配置拆分为多个文件:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

d. Compose中的环境变量

你可以使用.env文件设置docker-compose.yml中使用的变量:

version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "${HOST_PORT}:80"

.env文件:

HOST_PORT=8080

e. 健康检查

你可以为服务定义健康检查,确保它们正常工作:

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3

6. 与Docker Swarm一起使用Docker Compose

Docker Compose可以与Docker Swarm一起使用,在集群上部署多容器应用程序:

docker stack deploy -c docker-compose.yml my_stack

7. 最佳实践

  • 保持docker-compose.yml简洁:使用多个文件来分离开发和生产配置。
  • 版本控制:将你的docker-compose.yml放入版本控制系统中,以管理跨环境的配置。
  • 使用命名卷:确保数据在容器重启后依然存在。

version: '3.8'  # 指定Compose文件的版本

services:  # 定义多个服务
  web:  # Web服务,通常是前端或后端的应用
    image: nginx:latest  # 使用Nginx镜像
    ports:
      - "80:80"  # 将容器的80端口映射到主机的80端口
    volumes:
      - ./web:/usr/share/nginx/html  # 挂载本地目录到容器中
    environment:
      - NGINX_HOST=localhost  # 设置环境变量
      - NGINX_PORT=80
    networks:
      - frontend  # 连接到前端网络
    depends_on:
      - app  # 该服务将在'app'服务启动后才启动
    restart: always  # 在容器崩溃后总是重启

  app:  # 应用服务,可以是任何语言的后端服务
    build:  # 从Dockerfile构建镜像
      context: ./app  # Dockerfile所在的目录
      dockerfile: Dockerfile  # 使用的Dockerfile名称
    ports:
      - "3000:3000"  # 将容器的3000端口映射到主机的3000端口
    volumes:
      - ./app:/usr/src/app  # 挂载本地代码目录到容器中
    environment:
      - NODE_ENV=development  # 设置环境变量
      - PORT=3000
    networks:
      - frontend  # 连接到前端网络
      - backend  # 连接到后端网络
    depends_on:
      - db  # 该服务将在'db'服务启动后才启动
    restart: on-failure  # 仅在容器非正常退出时重启

  db:  # 数据库服务,使用MySQL
    image: mysql:5.7  # 使用MySQL 5.7镜像
    volumes:
      - db_data:/var/lib/mysql  # 持久化MySQL数据到命名卷
    environment:
      MYSQL_ROOT_PASSWORD: example  # MySQL root用户的密码
      MYSQL_DATABASE: example_db  # 自动创建的数据库名称
      MYSQL_USER: user  # 创建的用户名称
      MYSQL_PASSWORD: password  # 用户密码
    networks:
      - backend  # 连接到后端网络
    restart: unless-stopped  # 仅在手动停止时不重启

volumes:  # 定义命名卷,用于数据持久化
  db_data:  # MySQL数据卷

networks:  # 定义自定义网络
  frontend:  # 前端网络,连接web和app服务
  backend:  # 后端网络,连接app和db服务

标签:容器,compose,db,Compose,Docker,docker,详解
From: https://www.cnblogs.com/daikaiqiang/p/18382371

相关文章

  • Docker 操作命令大全
    镜像管理搜索镜像dockersearch<image_name>拉取镜像dockerpull<image_name>:<tag>列出本地镜像dockerimages删除镜像dockerrmi<image_name>:<tag>强制删除镜像:dockerrmi-f<image_id>构建镜像dockerbuild-t<image_name>:&l......
  • 使用xinference部署自定义embedding模型(docker)
    使用xinference部署自定义embedding模型(docker)说明:首次发表日期:2024-08-27官方文档:https://inference.readthedocs.io/zh-cn/latest/index.html使用docker部署xinferenceFROMnvcr.io/nvidia/pytorch:23.10-py3#KeepsPythonfromgenerating.pycfilesinthecontai......
  • 全染色算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################全染色以及全色数图G的顶点和边满足使相邻或关联的元素得到不同的颜色,则称此染色为G的全染色;其所用最少色数称为G的全色数算法用途给出简单图的染色数尽可能少的全染色方案算法思想从......
  • 网络通信和TCP/IP协议详解
    目录网络协议一、计算机网络是什么?定义和分类计算机网络发展简史二、计算机网络体系结构OSI七层模型TCP/IP模型TCP/IP协议族IP、TCP和UDPTCP/IP网络传输中的数据地址和端口号MAC地址IP地址端口号综述三、TCP特性TCP三次握手为什么TCP握手需要三......
  • 【Go函数详解】二、参数传递、变长参数与多返回值
    文章目录一、传递参数1.按值传参2.引用传参2.1特殊情况2.1.1切片slice2.1.2字典map二、变长参数1.基本定义和传值1.1基本定义1.2传值1.2.1普通传值1.2.2传递切片2.任意类型的变长参数(泛型)三、多返回值1.命名返回值一、传递参数1.按值传参Go语......
  • 顶点染色算法的matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################算法用途给出简单图的染色数尽可能少的顶点染色方案算法思想从顶点度数最小的顶点开始染色,找到不与其相邻的顶点并选择其中一个顶点进行染色,再找与这两个顶点都不相邻的顶点集合,并对其中......
  • 折腾 Quickwit,Rust 编写的分布式搜索引擎-官方配置详解
    Nodeconfiguration(节点配置)节点配置允许您为集群中的各个节点自定义和优化设置。它被分为几个部分:常规配置设置:共享的顶级属性Storage(存储)设置:在storage部分定义https://quickwit.io/docs/configuration/node-config#storage-configurationMetastore(元存储)设置:在......
  • C++容器之字符串的详解
    每日诗词:我见青山我妩媚,料青山见我应如是。                             ——《贺新郎·甚矣吾衰矣》【宋】辛弃疾目录补漏:vector在分配新内存块后如何进行元素复制正文:字符串变量和常量字符串变量:解析:......
  • RIAD详解
    RAID(独立磁盘冗余阵列)是一种将多个物理磁盘驱动器组合成一个单元的技术,目的是提高性能、数据冗余性或两者兼有。以下是常见RAID级别的详细描述:1.RAID0(条带化)描述:RAID0将数据分散在多个磁盘上,没有冗余性。每个磁盘存储数据的一部分,这些部分组合在一起构成整个数据集。优点......
  • 【网络编程通关之路】 Udp 基础回显服务器(Java实现)及你不知道知识原理详解 ! ! !
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......