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

推荐订阅源

K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - Franky
V
V2EX
Last Week in AI
Last Week in AI
H
Help Net Security
J
Java Code Geeks
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
About on SuperTechFans
月光博客
月光博客
腾讯CDC
小众软件
小众软件
罗磊的独立博客
D
Docker
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
博客园 - 叶小钗
F
Full Disclosure
Recent Announcements
Recent Announcements
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
LangChain Blog
T
The Exploit Database - CXSecurity.com
宝玉的分享
宝玉的分享
美团技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LINUX DO - 热门话题
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Securelist
Latest news
Latest news
Project Zero
Project Zero
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
K
Kaspersky official blog
O
OpenAI News
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
爱范儿
爱范儿
B
Blog RSS Feed
U
Unit 42

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源码解读 TenantLineInnerInterceptor源码解读 BaseMultiTableInnerInterceptor源码解读 Spring AI开篇 SQL解析工具JSQLParser 芋道源码解读之多租户 芋道源码解读之数据权限 芋道源码解读开篇 Java实现将数据导出为Word文档 OA系统的天数该怎样计算 安装MySQL8 安装MySQL5.7 RockyLinux9环境下编译MySQL8 MySQL字符集及底层原理 Java实现LDAP登录 IPv4和IPv6 使用虚拟机安装一个K8s集群 使用GraalVM原生编译打包SpringBoot工程 Nginx防止目录穿越 Java线程的状态 Nginx防盗链设置 使用python将excel表格转换为SQL INSERT Redis的公共操作命令 Redis数据结构之Bitfleid Redis数据结构之Bitmap Redis数据结构之GEO Redis数据结构之Hash Redis数据结构之HyperLogLog Redis数据结构之List Redis数据结构之Set Redis数据结构之Stream Redis数据结构之String Redis数据结构之ZSet 使用python压缩图片 利用Python实现Hexo站点的持续集成 Nginx设置HTTPS监听 firewalld防火墙工具的使用 Linux信号(signal)机制 MySQL5.7x 主从复制 用IP自签发一个HTTPS证书 基于Hexo实现一个静态的个人博客 RockyLinux9环境下编译MySQL5.7 Docker离线安装 MySQL数据定义语言 Docker与联合文件系统 Docker的网络 Docker的镜像操作 MySQL存储过程 MyBatis-Plus开篇 MySQL变量 MySQL视图 MySQL事务 MySQL插入修改和删除 MySQL查询 MySQL系统命令 Docker的容器操作 Docker的安装和配置 Docker容器数据卷 浅谈OAuth2.0授权原理 JVM开篇 浅谈Linux(Unix)的I/O模型 一个通用的CloseableHttpClient工厂类 JUC可重入锁ReentrantLock JUC读写锁ReadWriteLock Java的单例 Java泛型 Java8的新特性 最近最少使用算法(LRU) MySQL函数 SpringBoot配置和启动 volatile作用分析
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博客系统便进入可用状态了。