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

Docker Compose的使用

文章首发于我的博客:https://blog.liuzijian.com/post/docker-compose.html

目录

    • Docker Compose是什么
    • Docker Compose安装
    • Docker Compose文件
    • Docker Compose常用命令
    • 案例:部署WordPress博客系统

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,下载地址:

  • 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-demoservices:app_1:# 镜像:TAGimage: demo:1.0# 容器名container_name: demo# 提升容器内权限privileged: true# 环境变量environment: - NAME1=VALUE1- NAME2=VALUE2restart: alwayscommand: ["-c nginx.conf"]# 宿主机端口:容器内端口ports:- "80:80"# 扩展语法设置卷,允许更详细的配置,如设置卷驱动和选项volumes:# 绑定挂载,将主机上的一个具体目录或文件直接挂载到容器中- type: bindsource: /var/lib/datatarget: /data# volume是由Docker管理的存储区域,通常在/var/lib/docker/volumes/下- type: volumesource: my-datatarget: /datavolume: nocopy: truesubpath: subnetworks:- my-networkapp_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/mysqlapp_4:# 匿名卷,由Docker自动生成,不指定主机路径或命名卷volumes: - /var/lib/mysql#多容器共享卷app_5:image: mysql:8volumes: - my-data3:/var/lib/mysqlapp_6:image: mysql:8volumes: - my-data3:/var/lib/mysqlnetworks:my-network:driver: bridgeipam:config:- subnet: 192.168.1.0/24gateway: 192.168.1.1volumes: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_blogservices:mysql:privileged: trueimage: mysql:8.0ports:- "3306:3306"environment: - MYSQL_ROOT_PASSWORD=123456- MYSQL_DATABASE=wordpressvolumes:- mysql-data:/var/lib/mysql- /app/myconf:/etc/mysql/conf.dnetworks:- blog-networkrestart: alwayswordpress:privileged: trueimage: wordpressports:- "8080:80"restart: alwaysdepends_on:- mysqlenvironment: - WORDPRESS_DB_HOST=mysql- WORDPRESS_DB_USER=root- WORDPRESS_DB_PASSWORD=123456- WORDPRESS_DB_NAME=wordpressvolumes:- wordpress-data:/var/www/htmlnetworks:- blog-networkvolumes: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博客系统便进入可用状态了😊。

image

http://www.lryc.cn/news/523486.html

相关文章:

  • [STM32 HAL库]串口空闲中断+DMA接收不定长数据
  • 三、华为交换机 Hybrid
  • 如何通过 Apache Airflow 将数据导入 Elasticsearch
  • Android Studio:Linux环境下安装与配置
  • token是用来鉴权的,那session是用来干什么的?
  • 基于 WEB 开发的二手车辆销售管理系统设计与实现
  • wordpress的火车头商品发布接口
  • 浙江安吉成新照明电器:Acrel-1000DP 分布式光伏监控系统应用探索
  • 总结3..
  • 信息奥赛一本通 1168:大整数加法
  • 3.3 OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南
  • 横盘出击的三种经典走势形态,买点以及需要注意的问题技术详解
  • 处理没有提示的字符串、计算相隔天数应用题
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程表 实现 Trie (前缀树)(C++)
  • react使用react-redux状态管理
  • 04_角色创建窗口
  • Dockerfile -> Docker image -> Docker container
  • LDN的蓝牙双模键盘帮助文档
  • 搭建一个基于Spring Boot的驾校管理系统
  • 运动相机拍视频过程中摔了,导致录视频打不开怎么办
  • MongoDB vs Redis:相似与区别
  • 数字图像处理:实验二
  • 基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)
  • SSM旅游信息管理系统
  • FastADMIN实现网站启动时执行程序的方法
  • 【威联通】FTP服务提示:服务器回应不可路由的地址。被动模式失败。
  • nginx常用配置 (含负载均衡、反向代理、限流、Gzip压缩、图片防盗链 等示例)
  • 21.1、网络设备安全概述
  • 通过idea创建的springmvc工程需要的配置
  • Redis 持久化机制:RDB 和 AOF