惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
L
LangChain Blog
Jina AI
Jina AI
博客园 - 叶小钗
B
Blog RSS Feed
Recent Announcements
Recent Announcements
H
Help Net Security
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
B
Blog
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客

Liu Zijian's Blog | 一个技术博客

使用Certbot自动续签HTTPS证书 使用Filebeat采集Nginx日志到ES Python的协程 Python中的异常 Python中的类和对象 Python的函数 Python的数据结构,推导式、迭代器和生成器 Spring AI集成多模态模型 LangChain4j多模态 LangChain Tools工具使用 Python中的模块和包 Python全局环境和虚拟环境(venv) LangChain Prompt提示词工程 LangChain4j Tools工具使用 基于Dify搭建AI智能体应用 LangChain4j RAG检索增强生成 Spring AI实现MCP Server Spring AI集成MCP Client LangChain4j Prompt提示词工程 Spring AI使用知识库增强对话功能 Spring AI实现一个智能客服 Spring AI实现一个简单的对话机器人 实现MinIO数据的每日备份 自己实现一个DNS服务 简单理解AI智能体 大模型和大模型应用 LangChain开篇 LangChain4j开篇 一个解析Excel2007的POI工具类 DataPermissionInterceptor源码解读
Docker Compose
Liu Zijian · 2024-11-27 · via Liu Zijian's Blog | 一个技术博客

Docker Compose概述

  Docker Compose是Docker官方的开源项目,负责实现对Docker容器的快速编排,Docker建议每个容器只运行一项服务,因为容器运行的开销很小,但是同时部署多个应用需要每个容器都单独编写Dockerfile会显得非常复杂,因而Docker官方提供了多容器部署的编排工具Docker Compose

  Docker Compose允许用户通过一个单独的配置文件来定义一组相关联的应用容器为一个项目,Docker Compose可以管理多个Docker容器组成的一个应用,只需要定义好一个yaml格式的配置文件docker-compose.xml,写好多个容器之间的调用关系,然后只要一个命令就可以实现一键部署和一键启动和关闭这些容器。

  Docker Compose文件格式版本有多种,这里以最为主流的3.x为例

Docker Compose安装

先去下载docker-compose的可执行文件,Docker Compose发布在GitHub上面(https://github.com/docker/compose/releases/),我下载的版本是linux64位的v2.30.3,下载地址: https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64

安装很简单,只要将下载下来的可执行文件赋予执行权限,并链接即可,先将下载下来的文件docker-compose-linux-x86_64放到/opt目录下,然后作为可执行文件,并建立软链接

chmod +x ./docker-compose-linux-x86_64
ln -s /opt/docker-compose-linux-x86_64 /usr/local/bin/docker-compose

之后,就可以在任意目录执行docker-compose的命令了

Docker Compose文件

一个DockerCompose文件就是一个工程,工程由服务组成,服务就是一个个的应用实例,由一组关联的容器组成一个完整的业务单元就是工程。

文件内包含以下顶级元素:

  • version docker-compose文件版本,大多用3
  • name 应用部署的名称
  • services 服务,下面可以定义多个部署的应用
  • networks 自定义网络,供services下的应用使用
  • volumes 卷,应用用到的卷配置
  • configs 配置
  • secrets 密钥

每个顶级元素下又有以下常用配置项:

  • services.$service-name.image 使用的镜像和TAG
  • services.$service-name.privileged 设置容器权限
  • services.$service-name.container_name 容器名
  • services.$service-name.environment 环境变量
  • services.$service-name.restart 自启动,常见配置:总是always,出错时自启on-failure/on-failure:3
  • services.$service-name.command 自定义命令行参数
  • services.$service-name.ports 端口映射
  • services.$service-name.volumes 数据卷挂载
  • services.$service-name.depends_on 依赖哪个服务,在哪些服务启动后再启动
  • services.$service-name.networks 使用的自定义网络
  • networks.$network-name.driver 自定义网络的类型,不设置的话默认是bridge
  • networks.$network-name.ipam.config IP地址管理,用于管理网络的IP地址分配,不设置则Docker自动分配
  • networks.$network-name.ipam.config.subnet 自定义网络的网段,例如192.168.1.0/24
  • networks.$network-name.ipam.config.gateway 自定义网络的网关,例如192.168.1.1

例:

version: '3'

name: my-demo

services:
    app_1:
       # 镜像:TAG
       image: demo:1.0
       # 容器名
       container_name: demo
       # 提升容器内权限
       privileged: true
       # 环境变量
       environment: 
         - NAME1=VALUE1
         - NAME2=VALUE2

       restart: always
       
       command: ["-c nginx.conf"]
       
       # 宿主机端口:容器内端口
       ports:
         - "80:80"

       # 扩展语法设置卷,允许更详细的配置,如设置卷驱动和选项
       volumes:
         # 绑定挂载,将主机上的一个具体目录或文件直接挂载到容器中
         - type: bind
           source: /var/lib/data
           target: /data

         # volume是由Docker管理的存储区域,通常在/var/lib/docker/volumes/下
         - type: volume
           source: my-data
           target: /data
           volume: 
             nocopy: true
             subpath: sub

       networks:
         - my-network

    app_2:
       image: mysql:8 
       depends_on:
         - app_1

       # 绑定挂载,直接将主机路径映射到容器路径
       volumes: 
         #宿主机路径:容器内路径
         - /data:/var/data 
         #只读卷
         - /host/path:/container/path:ro 

    app_3:
       # 命名卷,由用户指定名称,Docker 管理其存储位置
       volumes: 
         - my-data2:/var/lib/mysql

    app_4:
       # 匿名卷,由Docker自动生成,不指定主机路径或命名卷
       volumes: 
         - /var/lib/mysql
         
    #多容器共享卷
    app_5:
       image: mysql:8
       volumes: 
         - my-data3:/var/lib/mysql
    app_6:
       image: mysql:8
       volumes: 
         - my-data3:/var/lib/mysql


networks:
  my-network:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1

volumes:
   my-data:
   my-data2: 
   my-data3: 

Docker Compose常用命令

docker-compose.yml文件路径下执行以下命令,如果docker-compose.yml文件的路径不是./或文件名不是默认的docker-compose.yml,你可以使用-f参数来指定文件路径和文件名。这样,DockerCompose会使用你指定的文件来运行命令。

  • 帮助

    docker-compose -h
  • 上线所有的服务

    docker-compose up 
    
    docker-compose  -f ./compose.yml up
  • 上线所有的服务并后台运行

    docker-compose up -d 
    
    docker-compose  -f ./compose.yml up -d
  • 上线某一服务

    docker-compose up <service>
    
    docker-compose [-f ./compose.yml] up <service> 
  • 下线并删除容器、网络、数据卷和镜像

    docker-compose down 
  • 停止某一服务

    docker-compose stop <service>
  • 删除某服务容器

    docker-compose rm -f <service>
  • 进入容器实例内部

    docker-compose exec <service> /bin/bash
  • 展示当前docker-compose文件编排过的运行的所有容器

    docker-compose ps 
  • 展示当前docker-compose文件编排过的容器进程

    docker-compose top 
  • 查看容器输出的日志

    docker-compose logs  <service> 
  • 检查配置是否有语法错误

    docker-compose config  
  • 检查配置,有问题的才输出

    docker-compose -q  
  • 重启服务

    docker-compose restart  <service>
  • 启动服务

    docker-compose start <service>
  • 扩容,将服务名为app的应用扩容3份

    docker-compose scale <service>×3

案例:部署WordPress博客系统

1.编辑compose.yml

name: by_blog

services:
    mysql:
      privileged: true
      image: mysql:8.0
      ports:
        - "3306:3306"
      environment: 
        - MYSQL_ROOT_PASSWORD=123456
        - MYSQL_DATABASE=wordpress
      volumes:
        - mysql-data:/var/lib/mysql
        - /app/myconf:/etc/mysql/conf.d
      networks:
        - blog-network
      restart: always
      
    wordpress:
      privileged: true
      image: wordpress
      ports:
        - "8080:80"
      restart: always
      depends_on:
         - mysql
      environment: 
        - WORDPRESS_DB_HOST=mysql
        - WORDPRESS_DB_USER=root
        - WORDPRESS_DB_PASSWORD=123456
        - WORDPRESS_DB_NAME=wordpress
      volumes:
        - wordpress-data:/var/www/html
      networks:
        - blog-network

volumes:
  mysql-data:
  wordpress-data:

networks:
  blog-network:

2.执行docker-compose命令启动服务

docker-compose -f ./compose.yml up -d

命令行输出

[root@localhost opt]# docker-compose  -f ./compose.yml up -d
[+] Running 35/24
 ✔ wordpress 22 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                66.2s 
 ✔ mysql 11 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                               93.2s 
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
[+] Building 0.0s (0/0)                                                                                                                     
[+] Running 5/5
 ✔ Network by_blog_blog-network     Created                                                                                            0.4s 
 ✔ Volume "by_blog_mysql-data"      Created                                                                                            0.0s 
 ✔ Volume "by_blog_wordpress-data"  Created                                                                                            0.0s 
 ✔ Container by_blog-mysql-1        Started                                                                                            2.6s 
 ✔ Container by_blog-wordpress-1    Started                                                                                            3.6s 
[root@localhost opt]# 

编排完成,服务成功启动,可以看到docker-compose先是创建了自定义的网络,然后是创建和挂载数据卷,然后在按顺序启动容器。

打开浏览器,简单进行初始化的操作后,WordPress博客系统便进入可用状态了。