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

docker-compose教程

1. docker-compose是什么?

1. 1 简介

 compose、machine 和 swarm 是docker 原生提供的三大编排工具。

 简称docker三剑客。Compose 项目是 Docker 官方的开源项目,定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

【官方解释】:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

【个人理解】:

  • 服务是一个应用程序的逻辑单元,它可以由一个或多个容器组成。每个服务都拥有自己的配置,包括镜像、端口映射、环境变量、卷和网络等。

  • 项目是一个包含多个服务的集合。它定义了应用程序的整体架构,并提供了管理所有服务的工具。

【服务和项目的例子】

  • 一个 Web 应用程序可以包含以下服务:

  • web:运行应用程序代码的服务。

  • db:运行数据库的服务。

  • cache:运行缓存服务的服务。

  • 一个 Docker Compose 项目可以包含以下文件:

  • docker-compose.yml:定义所有服务的配置文件。

  • Dockerfile:构建服务镜像的配置文件。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
在这里插入图片描述

在这里插入图片描述

1.2 Docker Compose, Docker Swarm 和 Kubernetes 对比

Docker Compose

  • 单机部署:Docker Compose 通常用于单机部署,因为它没有集群管理功能。
  • 简单易用:Docker Compose 使用 YAML 文件定义应用,语法简单易懂,易于上手。
  • 开发和测试:Docker Compose 非常适合在开发和测试环境中使用,因为它可以快速启动和停止应用,并方便地进行配置更改。

Docker Swarm

  • 集群管理:Docker Swarm 是一个集群管理工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。
  • 服务发现和负载均衡:Docker Swarm 提供服务发现负载均衡功能,可以自动发现集群中的服务并进行负载均衡。
  • 高可用性:Docker Swarm 可以自动重启失败的容器,并确保应用的高可用性
  • 生产环境部署:Docker Swarm 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。

Kubernetes

  • 集群管理:k8s 是一个集群管理工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。
  • 功能强大:Kubernetes 是一个功能强大的容器编排工具,它提供了丰富的功能,例如服务发现负载均衡自动扩展滚动更新健康检查等。
  • 高可用性:Docker Swarm 可以自动重启失败的容器,并确保应用的高可用性
  • 复杂性高:Kubernetes 的学习曲线比较陡峭,需要掌握大量的概念和配置选项。
  • 生产环境部署:Kubernetes 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。

总结

特征Docker ComposeDocker SwarmKubernetes
功能简单中等强大
复杂性中等
部署方式单机集群集群
服务发现
负载均衡
高可用性
滚动更新、健康检查、高级调度等
适用场景开发和测试生产环境生产环境

2. docker compose安装

2.1 二进制包

# 1. 安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose$ sudo chmod +x /usr/local/bin/docker-compose# 2. 卸载
$ sudo rm /usr/local/bin/docker-compose

2.2 pip安装

# 1. 安装
$ sudo pip install -U docker-compose# 2. 卸载
$ sudo pip uninstall docker-compose# 3. 查看版本
docker-compose --versiom

3. compose模版文件

Docker Compose YAML 文件解释

version: '3'services:mysql:build:context: ./mysqlenvironment:MYSQL_ROOT_PASSWORD: adminrestart: alwayscontainer_name: mysqlvolumes:- /data/edu-bom/mysql/test:/var/lib/mysqlimage: mysql/mysql:5.7ports:- 3306:3306networks:net:eureka:build:context: ./edu-eureka-bootrestart: alwaysports:- 8761:8761container_name: edu-eureka-boothostname: edu-eureka-bootimage: edu/edu-eureka-boot:1.0depends_on:- mysqlnetworks:net:networks:net:volumes:vol:

详细解释:

  1. version: 指定 Docker Compose 文件的版本。此处为 3。

  2. services: 定义服务部分,包含应用程序的不同组件。

  3. mysql: 定义名为 “mysql” 的服务,用于构建和运行 MySQL 数据库。

  4. build: 指示 Docker Compose 从 ./mysql 目录构建 Docker 镜像。

  5. environment: 设置环境变量,包括 MySQL 数据库的 root 用户密码。

  6. restart: 指定容器在意外停止后自动重启。

  7. container_name: 指定容器的名称为 “mysql”。

  8. volumes: 将主机上的 /data/edu-bom/mysql/test 目录挂载到容器的 /var/lib/mysql 目录,用于存储数据库数据。

  9. image: 指定使用官方的 MySQL 5.7 镜像。

  10. ports: 将容器的 3306 端口映射到主机的 3306 端口,以便访问 MySQL 数据库。

  11. networks: 将 “mysql” 服务连接到名为 “net” 的网络。

  12. eureka: 定义名为 “eureka” 的服务,用于构建和运行 Eureka 服务发现服务器。

  13. build: 指示 Docker Compose 从 ./edu-eureka-boot 目录构建 Docker 镜像。

  14. restart: 指定容器在意外停止后自动重启。

  15. ports: 将容器的 8761 端口映射到主机的 8761 端口,以便访问 Eureka 服务发现服务器。

  16. container_name: 指定容器的名称为 “edu-eureka-boot”。

  17. hostname: 指定容器的主机名为 “edu-eureka-boot”。

  18. image: 指定使用 edu/edu-eureka-boot:1.0 镜像。

  19. depends_on: 指定 “eureka” 服务依赖于 “mysql” 服务,确保数据库启动后再启动 Eureka 服务。

  20. networks: 将 “eureka” 服务连接到名为 “net” 的网络。

  21. networks: 定义名为 “net” 的网络。

  22. volumes: 定义名为 “vol” 的卷,但未被任何服务使用。

4. docker-compose命令

up

docker-compose up [options] [SERVICE...]

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务启动服务,并关联服务相关容器的一系列操作。

可以说,大部分时候都可以直接通过该命令来启动一个项目。

如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。

默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。

选项:

  • -d 在后台运行服务容器。
    - --no-color 不使用颜色来区分不同的服务的控制台输出。
  • --no-deps 不启动服务所链接的容器。
  • --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
  • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
  • --no-build 不自动构建缺失的服务镜像。
  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

start

docker-compose start [SERVICE...]

启动已经存在的服务容器

down

docker-compose down

此命令将会停止 up 命令所启动的容器,并移除网络

stop

docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

ps

docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。

选项:

  • -q 只打印容器的 ID 信息。

logs

docker-compose logs [options] [SERVICE...]

查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

build

docker-compose build [options] [SERVICE...]

构建(重新构建)项目中的服务容器。

服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db

可以随时在项目目录下运行 docker-compose build 来重新构建服务。

选项:

  • --force-rm 删除构建过程中的临时容器。
  • --no-cache 构建镜像过程中不使用 cache(这将加长构建过程)。
  • --pull 始终尝试通过 pull 来获取更新版本的镜像。

restart

docker-compose restart [options] [SERVICE...]

重启项目中的服务

选项:

  • -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。

rm

docker-compose rm [options] [SERVICE...]

删除所有停止状态的)服务容器。推荐先执行docker-compose stop 命令来停止容器。

选项:

  • -f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v 删除容器所挂载的数据卷。

top

docker-compose top

查看各个服务容器内运行的进程。

images

docker-compose images

列出 Compose 文件中包含的镜像。

run

docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

在指定服务上执行一个命令。

使用举例:

1.在web服务器运行python脚本

docker-compose run web python my_script.py

2. 在 Web 服务容器中运行 shell 命令,并映射端口,设置环境变量,使用卷,连接网络:

docker-compose run -p 8080:80 -e MY_VAR=value -v my_volume:/path/to/file/in/container --network my_network web bash

这将在 “web” 服务的容器中打开一个交互式 shell,并进行以下操作:

  • 将容器的 80 端口映射到主机的 8080 端口。
  • 设置环境变量 MY_VAR 的值为 “value”。
  • 将名为 “my_volume” 的卷挂载到容器中的 /path/to/file/in/container 路径。
  • 连接到名为 “my_network” 的网络。

3. 在数据库容器中运行 SQL 命令,使用环境变量,连接网络:

docker-compose run -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password --network my_network db psql -U postgres mydatabase

这将在 “db” 服务的容器中使用 PostgreSQL 客户端连接到 “mydatabase” 数据库,并进行以下操作:

  • 设置环境变量 POSTGRES_USER 的值为 “postgres”。
  • 设置环境变量 POSTGRES_PASSWORD 的值为 “password”。
  • 连接到名为 “my_network” 的网络。

4. 在 Web 服务容器中运行 Python 脚本,使用卷,连接网络:

docker-compose run -v my_volume:/path/to/file/in/container --network my_network web python my_script.py

这将在 “web” 服务的容器中运行名为 “my_script.py” 的 Python 脚本,并进行以下操作:

  • 将名为 “my_volume” 的卷挂载到容器中的 /path/to/file/in/container 路径。
  • 连接到名为 “my_network” 的网络。

port

docker-compose port [options] SERVICE PRIVATE_PORT

打印某个容器端口所映射的公共端口。

选项:

  • --protocol=proto 指定端口协议,tcp(默认值)或者 udp。
  • --index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
# 下面结果表示:将web服务的5000端口映射到了宿主机的5001端口$ docker-compose port web 50000.0.0.0:5001

5. 简单示例

参考链接:
[Docker] Docker Compose 基础教程(概念/基础操作)
全网最详细的Docker-Compose详细教程
Docker Compose

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

相关文章:

  • 结果出乎意料!MySQL和MariaDB谁快?MySQL 8.0比MySQL 5.6快吗?
  • Alienware外星人X17R2 原装Win11系统镜像下载 带SupportAssist OS Recovery一键恢复
  • 【NI国产替代】高速数据采集模块,最大采样率为 125 Msps,支持 FPGA 定制化
  • 【网络安全的神秘世界】2024.6.6 Docker镜像停服?解决最近Docker镜像无法拉取问题
  • 【Python入门与进阶】1基本输入和输出
  • CTF Show MISC做题笔记
  • 【QT5】<总览二> QT信号槽、对象树及常用函数
  • Button按钮类
  • 代码随想录-二叉树 | 111 二叉树的最小深度
  • PCA降维算法
  • Fast R-CNN 与 R-CNN的不同之处
  • 前端开发环境:Vue、Element Plus、Axios
  • 我的创作纪念日-在SCDN的5年
  • AI-知识库搭建(二)GPT-Embedding模型使用
  • qt网络事件之QSocketNotifier
  • 如何统计EXCEL中的数据透视表的信息?
  • 日本结构型产品及衍生品业务变迁报告
  • 解决Mac无法上网/网络异常的方法,重置网络
  • [12] 使用 CUDA 进行图像处理
  • MyBatisPlus代码生成器(交互式)快速指南
  • 深度学习模型训练之日志记录
  • 深入理解Python中的装饰器
  • 基于springboot的人力资源管理系统源码数据库
  • 如何舒适的使用VScode
  • 【微信小程序】开发环境配置
  • 启动盘镜像制作神器(下载即用)
  • PHP框架详解 - Symfony框架
  • 鸿蒙开发:【线程模型】
  • 初级网络工程师之从入门到入狱(三)
  • 【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)